👀
This is a developer preview of the Move Registry. It is experimental and therefore provides no guarantees of uptime or correctness. Use at your own risk.

Managing MVR names (Mainnet only)

⚠️

These examples assume that you use the MVR plugin for the Sui Typescript SDK, as described in the Typescript SDK section.

Creating a new application

To create a new application, you must provide a SuiNS name and a package name, as long as it is not already registered.

const transaction = new Transaction();
 
const appCap = transaction.moveCall({
    target: `@mvr/core::move_registry::register`,
    arguments: [
        // the registry obj: Can also be resolved as `registry-obj@mvr` from mainnet SuiNS.
        transaction.object('0x0e5d473a055b6b7d014af557a13ad9075157fdc19b6d51562a18511afd397727'),
        transaction.object(suinsObjectId),
        transaction.pure.string(name),
        transaction.object.clock(),
    ],
});
 
// we can then use the appCap to attach packages directly, or transfer (e.g. to a safe address)
// and register packages later.

Attaching a Mainnet package to an application

When attaching a Mainnet package to an application, you must provide the PackageInfo object. This call is permanent, so after a PackageInfo object is attached to an application, it cannot be detached in the future. Consequently, an app is always linked to a specific package.

// we can then use the appCap to attach packages directly, or transfer (e.g. to a safe address)
// and register packages later.
 
const transaction = new Transaction();
 
 transaction.moveCall({
    target: `@mvr/core::move_registry::assign_package`,
    arguments: [
        // the registry obj: Can also be resolved as `registry-obj@mvr` from mainnet SuiNS.
        transaction.object(`0x0e5d473a055b6b7d014af557a13ad9075157fdc19b6d51562a18511afd397727`),
        transaction.object('<The AppCap object>'),
        transaction.object('<The PackageInfo object on mainnet>'),
    ],
});

Attaching a non-Mainnet package to an application

For non-Mainnet networks, you only attach a "pointer" to the package, instead of strict binding (which wouldn't be possible).

💡

You can always update an external network by first calling @mvr/core::move_registry::unset_network, and then calling @mvr/core::move_registry::set_network again.

const transaction = new Transaction();
 
const appInfo = transaction.moveCall({
    target: `@mvr/core::app_info::new`,
    arguments: [
        transaction.pure.option("address", '<The objectId of the `PackageInfo` object on the external network>'),
        transaction.pure.option("address", '<The address of the package on the external network>'),
        transaction.pure.option("address", null),
    ],
});
 
transaction.moveCall({
    target: `@mvr/core::move_registry::set_network`,
    arguments: [
        // the registry obj: Can also be resolved as `registry-obj@mvr` from mainnet SuiNS.
        transaction.object('0x0e5d473a055b6b7d014af557a13ad9075157fdc19b6d51562a18511afd397727'),
        transaction.object('<The AppCap object>'),
        transaction.pure.string("<chain id of the network: use `4c78adac` for testnet>"),
        appInfo,
    ],
});