Skip to main content
The governed testnet adds migration records alongside the existing contract storage. These records identify the source contracts and the imported state. They do not replace the ordinary name, payment or claim-receipt formats. Most integrations should use the contract read methods. This page is for explorers and developers decoding storage directly. A migration record is historical evidence; always resolve current payments through Universal Lookup.

Encoding

Keys use Soroban contract-enum encoding. For example, the symbol-only key StateV1 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.
Original 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.
A frozen reverse record comes from a positive source proof. It preserves the name, ownership expiry and authority code hash needed to check a historical election. It does not give a base G account the identity of a muxed M destination.

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.