Encoding
Keys use Soroban contract-enum encoding. For example, the symbol-only keyStateV1 decodes as ["StateV1"]; NamespaceV1(node) decodes as ["NamespaceV1", nodeBytes]. Rust enum names such as MigrationKey are not included in the encoded key. The contract address and storage durability distinguish entries.
Structs decode to objects with the field names below. u64 becomes a JavaScript bigint. A Vec<T> becomes an array; bounded optional vectors contain zero or one value. Option<T> uses Soroban option encoding, with absence decoded as null. See exact decoding shapes for the distinction between options and named None enum variants.
Registry lineage
migration_status() and migration_namespace(node) expose these records. sealed closes the one-time import. The namespace record retains the source Registrar, source Resolver and their code hashes, which lets clients verify the origin of historical claims.
RegistrarPolicy and Pending keep the shapes documented in Registry storage. pending_transfer contains zero or one pending namespace transfer. Roots commit to the reviewed import sets; counts describe those sets.
Registrar imports
selectorHash is SHA-256 of the Soroban XDR encoding of MigrationSelector: Globals, Label(Bytes) or Wallet(Address). The imported values use the existing Config, name, pending-transfer, reservation and wallet-usage keys.
ReceiptV1 entries stay on the frozen source Registrar. A missing receipt on the current Registrar does not prove a historical claim failed. Holder SDK recovery follows the sealed lineage and checks the original receipt. It does not replay the old transaction against the new contract.
Resolver imports
recordKeyHash is SHA-256 of the Soroban XDR encoding of MigrationRecordKey: Addr(node), Text(node, key), Reverse(address) or Configured(node, generation). Imported address, text, reverse and payment-configuration records retain their ordinary encodings.
Primary imports
source_name records the source Primary answer. name records the election accepted by the successor. The latter can be absent when the corrected Resolver cannot prove the old election. The import cannot invent a wallet election. Both the source answer and current forward verification are checked again when the migration closes.
Allocator coordination
RegistryMigrationPlan has the same fields and encoding as Registry’s MigrationPlan above. Existing namespace claims, original objection deadlines, fee receipts and credits keep their storage formats. A code-upgrade delay is separate from a namespace claim window.
Universal Lookup coordination
RegistryCutover and MigrationMuxedRoute use the shapes above. MuxedIdentityRecord uses the existing muxed identity shape. Each route includes the full u64 routing ID. G-account elections and different IDs on the same account stay independent.
After completion, normal reads use Lookup’s current Registry and Primary anchors. Staged records describe the migration, not a separate public resolution endpoint.