crates/sui-framework/docs/sui/coin_registry.md
Defines the system object for managing coin data in a central registry. This module provides a centralized way to store and manage metadata for all currencies in the Sui ecosystem, including their supply information, regulatory status, and metadata capabilities.
CoinRegistryExtraFieldCurrencyKeyLegacyMetadataKeyMetadataCapBorrowCurrencyCurrencyInitializerSupplyStateRegulatedStateMetadataCapStatenew_currencynew_currency_with_otwclaim_metadata_capmake_regulatedmake_supply_fixed_initmake_supply_burn_only_initmake_supply_fixedmake_supply_burn_onlyfinalizefinalize_and_delete_metadata_capfinalize_registrationdelete_metadata_capburnburn_balanceset_nameset_descriptionset_icon_urlset_treasury_cap_idmigrate_legacy_metadataupdate_from_legacy_metadatadelete_migrated_legacy_metadatamigrate_regulated_state_by_metadatamigrate_regulated_state_by_capborrow_legacy_metadatareturn_borrowed_legacy_metadatadecimalsnamesymboldescriptionicon_urlis_metadata_cap_claimedis_metadata_cap_deletedmetadata_cap_idtreasury_cap_iddeny_cap_idis_supply_fixedis_supply_burn_onlyis_regulatedtotal_supplyexistsis_migrated_from_legacyto_legacy_metadatacreatefinalize_implmigrate_legacy_metadata_implis_ascii_printable<a name="sui_coin_registry_CoinRegistry"></a>
CoinRegistrySystem object found at address <code>0xc</code> that stores coin data for all registered coin types. This is a shared object that acts as a central registry for coin metadata, supply information, and regulatory status.
<pre><code><b>public</b> <b>struct</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a> <b>has</b> key </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>id: <a href="../sui/object.md#sui_object_UID">sui::object::UID</a></code> </dt> <dd> </dd> </dl> </details><a name="sui_coin_registry_ExtraField"></a>
ExtraFieldStore only object that enables more flexible coin data registration, allowing for additional fields to be added without changing the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> structure.
<pre><code><b>public</b> <b>struct</b> <a href="../sui/coin_registry.md#sui_coin_registry_ExtraField">ExtraField</a> <b>has</b> store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>0: <a href="../std/type_name.md#std_type_name_TypeName">std::type_name::TypeName</a></code> </dt> <dd> </dd> <dt> <code>1: vector<u8></code> </dt> <dd> </dd> </dl> </details><a name="sui_coin_registry_CurrencyKey"></a>
CurrencyKeyKey used to derive addresses when creating <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T></code> objects.
<pre><code><b>public</b> <b>struct</b> <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyKey">CurrencyKey</a><<b>phantom</b> T> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> </dl> </details><a name="sui_coin_registry_LegacyMetadataKey"></a>
LegacyMetadataKeyKey used to store the legacy <code>CoinMetadata</code> for a <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
<pre><code><b>public</b> <b>struct</b> <a href="../sui/coin_registry.md#sui_coin_registry_LegacyMetadataKey">LegacyMetadataKey</a> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> </dl> </details><a name="sui_coin_registry_MetadataCap"></a>
MetadataCapCapability object that gates metadata (name, description, icon_url, symbol) changes in the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>. It can only be created (or claimed) once, and can be deleted to prevent changes to the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> metadata.
<pre><code><b>public</b> <b>struct</b> <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a><<b>phantom</b> T> <b>has</b> key, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>id: <a href="../sui/object.md#sui_object_UID">sui::object::UID</a></code> </dt> <dd> </dd> </dl> </details><a name="sui_coin_registry_Borrow"></a>
BorrowPotato callback for the legacy <code>CoinMetadata</code> borrowing.
<pre><code><b>public</b> <b>struct</b> <a href="../sui/coin_registry.md#sui_coin_registry_Borrow">Borrow</a><<b>phantom</b> T> </code></pre> <details> <summary>Fields</summary> <dl> </dl> </details><a name="sui_coin_registry_Currency"></a>
CurrencyCurrency stores metadata such as name, symbol, decimals, icon_url and description, as well as supply states (optional) and regulatory status.
<pre><code><b>public</b> <b>struct</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><<b>phantom</b> T> <b>has</b> key </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>id: <a href="../sui/object.md#sui_object_UID">sui::object::UID</a></code> </dt> <dd> </dd> <dt> <code><a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a>: u8</code> </dt> <dd> Number of decimal places the coin uses for display purposes. </dd> <dt> <code><a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>: <a href="../std/string.md#std_string_String">std::string::String</a></code> </dt> <dd> Human-readable name for the coin. </dd> <dt> <code><a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>: <a href="../std/string.md#std_string_String">std::string::String</a></code> </dt> <dd> Short symbol/ticker for the coin. </dd> <dt> <code><a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>: <a href="../std/string.md#std_string_String">std::string::String</a></code> </dt> <dd> Detailed description of the coin. </dd> <dt> <code><a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>: <a href="../std/string.md#std_string_String">std::string::String</a></code> </dt> <dd> URL for the coin's icon/logo. </dd> <dt> <code>supply: <a href="../std/option.md#std_option_Option">std::option::Option</a><<a href="../sui/coin_registry.md#sui_coin_registry_SupplyState">sui::coin_registry::SupplyState</a><T>></code> </dt> <dd> Current supply state of the coin (fixed supply or unknown) Note: We're using <code>Option</code> because <code><a href="../sui/coin_registry.md#sui_coin_registry_SupplyState">SupplyState</a></code> does not have drop, meaning we cannot swap out its value at a later state. </dd> <dt> <code>regulated: <a href="../sui/coin_registry.md#sui_coin_registry_RegulatedState">sui::coin_registry::RegulatedState</a></code> </dt> <dd> Regulatory status of the coin (regulated with deny cap or unknown) </dd> <dt> <code><a href="../sui/coin_registry.md#sui_coin_registry_treasury_cap_id">treasury_cap_id</a>: <a href="../std/option.md#std_option_Option">std::option::Option</a><<a href="../sui/object.md#sui_object_ID">sui::object::ID</a>></code> </dt> <dd> ID of the treasury cap for this coin type, if registered. </dd> <dt> <code><a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a>: <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCapState">sui::coin_registry::MetadataCapState</a></code> </dt> <dd> ID of the metadata capability for this coin type, if claimed. </dd> <dt> <code>extra_fields: <a href="../sui/vec_map.md#sui_vec_map_VecMap">sui::vec_map::VecMap</a><<a href="../std/string.md#std_string_String">std::string::String</a>, <a href="../sui/coin_registry.md#sui_coin_registry_ExtraField">sui::coin_registry::ExtraField</a>></code> </dt> <dd> Additional fields for extensibility. </dd> </dl> </details><a name="sui_coin_registry_CurrencyInitializer"></a>
CurrencyInitializerHot potato wrapper to enforce registration after "new_currency" data creation. Destroyed in the <code><a href="../sui/coin_registry.md#sui_coin_registry_finalize">finalize</a></code> call and either transferred to the <code><a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a></code> (in case of an OTW registration) or shared directly (for dynamically created currencies).
<pre><code><b>public</b> <b>struct</b> <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a><<b>phantom</b> T> </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>currency: <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T></code> </dt> <dd> </dd> <dt> <code>extra_fields: <a href="../sui/bag.md#sui_bag_Bag">sui::bag::Bag</a></code> </dt> <dd> </dd> <dt> <code>is_otw: bool</code> </dt> <dd> </dd> </dl> </details><a name="sui_coin_registry_SupplyState"></a>
SupplyStateSupply state marks the type of Currency Supply, which can be
<a name="sui_coin_registry_RegulatedState"></a>
RegulatedStateRegulated state of a coin type.
<a name="sui_coin_registry_MetadataCapState"></a>
MetadataCapStateState of the <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> for a single <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
<pre><code><b>public</b> <b>enum</b> <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCapState">MetadataCapState</a> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Variants</summary> <dl> <dt> Variant <code>Claimed</code> </dt> <dd> The metadata cap has been claimed. </dd> <dl> <dt> <code>0: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> </dd> </dl> <dt> Variant <code>Unclaimed</code> </dt> <dd> The metadata cap has not been claimed. </dd> <dt> Variant <code>Deleted</code> </dt> <dd> The metadata cap has been claimed and then deleted. </dd> </dl> </details><a name="@Constants_0"></a>
<a name="sui_coin_registry_EMetadataCapAlreadyClaimed"></a>
Metadata cap already claimed
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_EMetadataCapAlreadyClaimed">EMetadataCapAlreadyClaimed</a>: vector<u8> = b"Metadata cap already claimed"; </code></pre><a name="sui_coin_registry_ENotSystemAddress"></a>
Only the system address can create the registry
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_ENotSystemAddress">ENotSystemAddress</a>: vector<u8> = b"Only the system can <a href="../sui/coin_registry.md#sui_coin_registry_create">create</a> the registry."; </code></pre><a name="sui_coin_registry_ECurrencyAlreadyExists"></a>
Currency for this coin type already exists
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_ECurrencyAlreadyExists">ECurrencyAlreadyExists</a>: vector<u8> = b"<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a> <b>for</b> this <a href="../sui/coin.md#sui_coin">coin</a> type already <a href="../sui/coin_registry.md#sui_coin_registry_exists">exists</a>."; </code></pre><a name="sui_coin_registry_EDenyListStateAlreadySet"></a>
Attempt to set the deny list state permissionlessly while it has already been set.
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_EDenyListStateAlreadySet">EDenyListStateAlreadySet</a>: vector<u8> = b"Cannot set the deny list state <b>as</b> it <b>has</b> already been set."; </code></pre><a name="sui_coin_registry_ECannotUpdateManagedMetadata"></a>
Attempt to update <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> with legacy metadata after the <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> has been claimed. Updates are only allowed if the <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> has not yet been claimed or deleted.
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_ECannotUpdateManagedMetadata">ECannotUpdateManagedMetadata</a>: vector<u8> = b"Cannot update metadata whose `<a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a>` <b>has</b> already been claimed"; </code></pre><a name="sui_coin_registry_EInvalidSymbol"></a>
Attempt to set the symbol to a non-ASCII printable character
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_EInvalidSymbol">EInvalidSymbol</a>: vector<u8> = b"Symbol <b>has</b> to be ASCII printable"; </code></pre><a name="sui_coin_registry_EDenyCapAlreadyCreated"></a>
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_EDenyCapAlreadyCreated">EDenyCapAlreadyCreated</a>: vector<u8> = b"Cannot claim the deny cap twice"; </code></pre><a name="sui_coin_registry_ECurrencyAlreadyRegistered"></a>
Attempt to migrate legacy metadata for a <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> that already exists.
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_ECurrencyAlreadyRegistered">ECurrencyAlreadyRegistered</a>: vector<u8> = b"<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a> already registered"; </code></pre><a name="sui_coin_registry_EEmptySupply"></a>
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_EEmptySupply">EEmptySupply</a>: vector<u8> = b"Supply cannot be empty"; </code></pre><a name="sui_coin_registry_ESupplyNotBurnOnly"></a>
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_ESupplyNotBurnOnly">ESupplyNotBurnOnly</a>: vector<u8> = b"Cannot <a href="../sui/coin_registry.md#sui_coin_registry_burn">burn</a> on a non <a href="../sui/coin_registry.md#sui_coin_registry_burn">burn</a>-only supply"; </code></pre><a name="sui_coin_registry_EInvariantViolation"></a>
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_EInvariantViolation">EInvariantViolation</a>: vector<u8> = b"Code <b>invariant</b> violation"; </code></pre><a name="sui_coin_registry_EDeletionNotSupported"></a>
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_EDeletionNotSupported">EDeletionNotSupported</a>: vector<u8> = b"Deleting legacy metadata is not supported"; </code></pre><a name="sui_coin_registry_ENotOneTimeWitness"></a>
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_ENotOneTimeWitness">ENotOneTimeWitness</a>: vector<u8> = b"Type is expected to be OTW"; </code></pre><a name="sui_coin_registry_EBorrowLegacyMetadata"></a>
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_EBorrowLegacyMetadata">EBorrowLegacyMetadata</a>: vector<u8> = b"Cannot <a href="../sui/borrow.md#sui_borrow">borrow</a> legacy metadata <b>for</b> migrated currency"; </code></pre><a name="sui_coin_registry_EDuplicateBorrow"></a>
<pre><code>#[error] <b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_EDuplicateBorrow">EDuplicateBorrow</a>: vector<u8> = b"Attempt to <b>return</b> duplicate borrowed CoinMetadata"; </code></pre><a name="sui_coin_registry_REGULATED_COIN_VERSION"></a>
Incremental identifier for regulated coin versions in the deny list. We start from <code>0</code> in the new system, which aligns with the state of <code>DenyCapV2</code>.
<pre><code><b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_REGULATED_COIN_VERSION">REGULATED_COIN_VERSION</a>: u8 = 0; </code></pre><a name="sui_coin_registry_NEW_CURRENCY_MARKER"></a>
Marker used in metadata to indicate that the currency is not migrated.
<pre><code><b>const</b> <a href="../sui/coin_registry.md#sui_coin_registry_NEW_CURRENCY_MARKER">NEW_CURRENCY_MARKER</a>: vector<u8> = vector[105, 115, 95, 110, 101, 119, 95, 99, 117, 114, 114, 101, 110, 99, 121]; </code></pre><a name="sui_coin_registry_new_currency"></a>
new_currencyCreates a new currency.
Note: This constructor has no long term difference from <code><a href="../sui/coin_registry.md#sui_coin_registry_new_currency_with_otw">new_currency_with_otw</a></code>. This can be called from the module that defines <code>T</code> any time after it has been published.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_new_currency">new_currency</a><T: key>(registry: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">sui::coin_registry::CoinRegistry</a>, <a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a>: u8, <a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>: <a href="../std/string.md#std_string_String">std::string::String</a>, <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>: <a href="../std/string.md#std_string_String">std::string::String</a>, <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>: <a href="../std/string.md#std_string_String">std::string::String</a>, <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>: <a href="../std/string.md#std_string_String">std::string::String</a>, ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): (<a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">sui::coin_registry::CurrencyInitializer</a><T>, <a href="../sui/coin.md#sui_coin_TreasuryCap">sui::coin::TreasuryCap</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_new_currency">new_currency</a><T: /* internal */ key>( registry: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a>, <a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a>: u8, <a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>: String, <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>: String, <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>: String, <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>: String, ctx: &<b>mut</b> TxContext, ): (<a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a><T>, TreasuryCap<T>) { <b>assert</b>!(!registry.<a href="../sui/coin_registry.md#sui_coin_registry_exists">exists</a><T>(), <a href="../sui/coin_registry.md#sui_coin_registry_ECurrencyAlreadyExists">ECurrencyAlreadyExists</a>); <b>assert</b>!(<a href="../sui/coin_registry.md#sui_coin_registry_is_ascii_printable">is_ascii_printable</a>!(&<a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>), <a href="../sui/coin_registry.md#sui_coin_registry_EInvalidSymbol">EInvalidSymbol</a>); <b>let</b> treasury_cap = <a href="../sui/coin.md#sui_coin_new_treasury_cap">coin::new_treasury_cap</a>(ctx); <b>let</b> currency = <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T> { id: <a href="../sui/derived_object.md#sui_derived_object_claim">derived_object::claim</a>(&<b>mut</b> registry.id, <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyKey">CurrencyKey</a><T>()), <a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a>, <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>, <a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>, <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>, <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>, supply: option::some(SupplyState::Unknown), regulated: RegulatedState::Unregulated, <a href="../sui/coin_registry.md#sui_coin_registry_treasury_cap_id">treasury_cap_id</a>: option::some(<a href="../sui/object.md#sui_object_id">object::id</a>(&treasury_cap)), <a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a>: MetadataCapState::Unclaimed, extra_fields: <a href="../sui/vec_map.md#sui_vec_map_empty">vec_map::empty</a>(), }; (<a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a> { currency, is_otw: <b>false</b>, extra_fields: <a href="../sui/bag.md#sui_bag_new">bag::new</a>(ctx) }, treasury_cap) } </code></pre> </details><a name="sui_coin_registry_new_currency_with_otw"></a>
new_currency_with_otwCreates a new currency with using an OTW as proof of uniqueness.
This is a two-step operation:
<a name="sui_coin_registry_claim_metadata_cap"></a>
claim_metadata_capClaim a <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> for a coin type. Only allowed from the owner of <code>TreasuryCap</code>, and only once.
Aborts if the <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> has already been claimed. Deleted <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> cannot be reclaimed.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_claim_metadata_cap">claim_metadata_cap</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, _: &<a href="../sui/coin.md#sui_coin_TreasuryCap">sui::coin::TreasuryCap</a><T>, ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">sui::coin_registry::MetadataCap</a><T> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_claim_metadata_cap">claim_metadata_cap</a><T>( currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, _: &TreasuryCap<T>, ctx: &<b>mut</b> TxContext, ): <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a><T> { <b>assert</b>!(!currency.<a href="../sui/coin_registry.md#sui_coin_registry_is_metadata_cap_claimed">is_metadata_cap_claimed</a>(), <a href="../sui/coin_registry.md#sui_coin_registry_EMetadataCapAlreadyClaimed">EMetadataCapAlreadyClaimed</a>); <b>let</b> id = <a href="../sui/object.md#sui_object_new">object::new</a>(ctx); currency.<a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a> = MetadataCapState::Claimed(id.to_inner()); <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a> { id } } </code></pre> </details><a name="sui_coin_registry_make_regulated"></a>
make_regulatedAllows converting a currency, on init, to regulated, which creates a <code>DenyCapV2</code> object, and a denylist entry. Sets regulated state to <code>Regulated</code>.
This action is irreversible.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_regulated">make_regulated</a><T>(init: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">sui::coin_registry::CurrencyInitializer</a><T>, allow_global_pause: bool, ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): <a href="../sui/coin.md#sui_coin_DenyCapV2">sui::coin::DenyCapV2</a><T> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_regulated">make_regulated</a><T>( init: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a><T>, allow_global_pause: bool, ctx: &<b>mut</b> TxContext, ): DenyCapV2<T> { <b>assert</b>!(init.currency.regulated == RegulatedState::Unregulated, <a href="../sui/coin_registry.md#sui_coin_registry_EDenyCapAlreadyCreated">EDenyCapAlreadyCreated</a>); <b>let</b> deny_cap = <a href="../sui/coin.md#sui_coin_new_deny_cap_v2">coin::new_deny_cap_v2</a><T>(allow_global_pause, ctx); init.currency.regulated = RegulatedState::Regulated { cap: <a href="../sui/object.md#sui_object_id">object::id</a>(&deny_cap), allow_global_pause: option::some(allow_global_pause), variant: <a href="../sui/coin_registry.md#sui_coin_registry_REGULATED_COIN_VERSION">REGULATED_COIN_VERSION</a>, }; deny_cap } </code></pre> </details><a name="sui_coin_registry_make_supply_fixed_init"></a>
make_supply_fixed_initInitializer function to make the supply fixed. Aborts if Supply is <code>0</code> to enforce minting during initialization.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_supply_fixed_init">make_supply_fixed_init</a><T>(init: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">sui::coin_registry::CurrencyInitializer</a><T>, cap: <a href="../sui/coin.md#sui_coin_TreasuryCap">sui::coin::TreasuryCap</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_supply_fixed_init">make_supply_fixed_init</a><T>(init: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a><T>, cap: TreasuryCap<T>) { <b>assert</b>!(cap.<a href="../sui/coin_registry.md#sui_coin_registry_total_supply">total_supply</a>() > 0, <a href="../sui/coin_registry.md#sui_coin_registry_EEmptySupply">EEmptySupply</a>); init.currency.<a href="../sui/coin_registry.md#sui_coin_registry_make_supply_fixed">make_supply_fixed</a>(cap) } </code></pre> </details><a name="sui_coin_registry_make_supply_burn_only_init"></a>
make_supply_burn_only_initInitializer function to make the supply burn-only. Aborts if Supply is <code>0</code> to enforce minting during initialization.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_supply_burn_only_init">make_supply_burn_only_init</a><T>(init: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">sui::coin_registry::CurrencyInitializer</a><T>, cap: <a href="../sui/coin.md#sui_coin_TreasuryCap">sui::coin::TreasuryCap</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_supply_burn_only_init">make_supply_burn_only_init</a><T>(init: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a><T>, cap: TreasuryCap<T>) { <b>assert</b>!(cap.<a href="../sui/coin_registry.md#sui_coin_registry_total_supply">total_supply</a>() > 0, <a href="../sui/coin_registry.md#sui_coin_registry_EEmptySupply">EEmptySupply</a>); init.currency.<a href="../sui/coin_registry.md#sui_coin_registry_make_supply_burn_only">make_supply_burn_only</a>(cap) } </code></pre> </details><a name="sui_coin_registry_make_supply_fixed"></a>
make_supply_fixedFreeze the supply by destroying the <code>TreasuryCap</code> and storing it in the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_supply_fixed">make_supply_fixed</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, cap: <a href="../sui/coin.md#sui_coin_TreasuryCap">sui::coin::TreasuryCap</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_supply_fixed">make_supply_fixed</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, cap: TreasuryCap<T>) { match (currency.supply.swap(SupplyState::Fixed(cap.into_supply()))) { // Impossible: We cannot fix a supply or make a supply <a href="../sui/coin_registry.md#sui_coin_registry_burn">burn</a>-only twice. SupplyState::Fixed(_supply) | SupplyState::BurnOnly(_supply) => <b>abort</b> <a href="../sui/coin_registry.md#sui_coin_registry_EInvariantViolation">EInvariantViolation</a>, // We replaced "unknown" with fixed supply. SupplyState::Unknown => (), }; } </code></pre> </details><a name="sui_coin_registry_make_supply_burn_only"></a>
make_supply_burn_onlyMake the supply <code>BurnOnly</code> by giving up the <code>TreasuryCap</code>, and allowing burning of Coins through the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_supply_burn_only">make_supply_burn_only</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, cap: <a href="../sui/coin.md#sui_coin_TreasuryCap">sui::coin::TreasuryCap</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_make_supply_burn_only">make_supply_burn_only</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, cap: TreasuryCap<T>) { match (currency.supply.swap(SupplyState::BurnOnly(cap.into_supply()))) { // Impossible: We cannot fix a supply or make a supply <a href="../sui/coin_registry.md#sui_coin_registry_burn">burn</a>-only twice. SupplyState::Fixed(_supply) | SupplyState::BurnOnly(_supply) => <b>abort</b> <a href="../sui/coin_registry.md#sui_coin_registry_EInvariantViolation">EInvariantViolation</a>, // We replaced "unknown" with frozen supply. SupplyState::Unknown => (), }; } </code></pre> </details><a name="sui_coin_registry_finalize"></a>
finalizeFinalize the coin initialization, returning <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code>
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_finalize">finalize</a><T>(builder: <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">sui::coin_registry::CurrencyInitializer</a><T>, ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">sui::coin_registry::MetadataCap</a><T> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_finalize">finalize</a><T>(builder: <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a><T>, ctx: &<b>mut</b> TxContext): <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a><T> { <b>let</b> is_otw = builder.is_otw; <b>let</b> (currency, metadata_cap) = <a href="../sui/coin_registry.md#sui_coin_registry_finalize_impl">finalize_impl</a>!(builder, ctx); // Either share directly (`<a href="../sui/coin_registry.md#sui_coin_registry_new_currency">new_currency</a>` scenario), or <a href="../sui/transfer.md#sui_transfer">transfer</a> <b>as</b> TTO to `<a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a>`. <b>if</b> (is_otw) <a href="../sui/transfer.md#sui_transfer_transfer">transfer::transfer</a>(currency, <a href="../sui/object.md#sui_object_sui_coin_registry_address">object::sui_coin_registry_address</a>()) <b>else</b> <a href="../sui/transfer.md#sui_transfer_share_object">transfer::share_object</a>(currency); metadata_cap } </code></pre> </details><a name="sui_coin_registry_finalize_and_delete_metadata_cap"></a>
finalize_and_delete_metadata_capDoes the same as <code><a href="../sui/coin_registry.md#sui_coin_registry_finalize">finalize</a></code>, but also deletes the <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> after finalization.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_finalize_and_delete_metadata_cap">finalize_and_delete_metadata_cap</a><T>(builder: <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">sui::coin_registry::CurrencyInitializer</a><T>, ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_finalize_and_delete_metadata_cap">finalize_and_delete_metadata_cap</a><T>( builder: <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a><T>, ctx: &<b>mut</b> TxContext, ) { <b>let</b> is_otw = builder.is_otw; <b>let</b> (<b>mut</b> currency, metadata_cap) = <a href="../sui/coin_registry.md#sui_coin_registry_finalize_impl">finalize_impl</a>!(builder, ctx); currency.<a href="../sui/coin_registry.md#sui_coin_registry_delete_metadata_cap">delete_metadata_cap</a>(metadata_cap); // Either share directly (`<a href="../sui/coin_registry.md#sui_coin_registry_new_currency">new_currency</a>` scenario), or <a href="../sui/transfer.md#sui_transfer">transfer</a> <b>as</b> TTO to `<a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a>`. <b>if</b> (is_otw) <a href="../sui/transfer.md#sui_transfer_transfer">transfer::transfer</a>(currency, <a href="../sui/object.md#sui_object_sui_coin_registry_address">object::sui_coin_registry_address</a>()) <b>else</b> <a href="../sui/transfer.md#sui_transfer_share_object">transfer::share_object</a>(currency); } </code></pre> </details><a name="sui_coin_registry_finalize_registration"></a>
finalize_registrationThe second step in the "otw" initialization of coin metadata, that takes in the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T></code> that was transferred from init, and transforms it in to a "derived address" shared object.
Can be performed by anyone.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_finalize_registration">finalize_registration</a><T>(registry: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">sui::coin_registry::CoinRegistry</a>, currency: <a href="../sui/transfer.md#sui_transfer_Receiving">sui::transfer::Receiving</a><<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>>, _ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_finalize_registration">finalize_registration</a><T>( registry: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a>, currency: Receiving<<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>>, _ctx: &<b>mut</b> TxContext, ) { // 1. Consume <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a> // 2. Re-<a href="../sui/coin_registry.md#sui_coin_registry_create">create</a> it with a "derived" <b>address</b>. <b>let</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a> { id, <a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a>, <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>, <a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>, <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>, <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>, supply, regulated, <a href="../sui/coin_registry.md#sui_coin_registry_treasury_cap_id">treasury_cap_id</a>, <a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a>, extra_fields, } = <a href="../sui/transfer.md#sui_transfer_receive">transfer::receive</a>(&<b>mut</b> registry.id, currency); id.delete(); // Now, <a href="../sui/coin_registry.md#sui_coin_registry_create">create</a> the derived version of the <a href="../sui/coin.md#sui_coin">coin</a> currency. <a href="../sui/transfer.md#sui_transfer_share_object">transfer::share_object</a>(<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a> { id: <a href="../sui/derived_object.md#sui_derived_object_claim">derived_object::claim</a>(&<b>mut</b> registry.id, <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyKey">CurrencyKey</a><T>()), <a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a>, <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>, <a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>, <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>, <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>, supply, regulated, <a href="../sui/coin_registry.md#sui_coin_registry_treasury_cap_id">treasury_cap_id</a>, <a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a>, extra_fields, }) } </code></pre> </details><a name="sui_coin_registry_delete_metadata_cap"></a>
delete_metadata_capDelete the metadata cap making further updates of <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> metadata impossible. This action is IRREVERSIBLE, and the <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> can no longer be claimed.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_delete_metadata_cap">delete_metadata_cap</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, cap: <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">sui::coin_registry::MetadataCap</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_delete_metadata_cap">delete_metadata_cap</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, cap: <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a><T>) { <b>let</b> <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a> { id } = cap; currency.<a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a> = MetadataCapState::Deleted; id.delete(); } </code></pre> </details><a name="sui_coin_registry_burn"></a>
burnBurn the <code>Coin</code> if the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> has a <code>BurnOnly</code> supply state.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_burn">burn</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, <a href="../sui/coin.md#sui_coin">coin</a>: <a href="../sui/coin.md#sui_coin_Coin">sui::coin::Coin</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_burn">burn</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, <a href="../sui/coin.md#sui_coin">coin</a>: Coin<T>) { currency.<a href="../sui/coin_registry.md#sui_coin_registry_burn_balance">burn_balance</a>(<a href="../sui/coin.md#sui_coin">coin</a>.into_balance()); } </code></pre> </details><a name="sui_coin_registry_burn_balance"></a>
burn_balanceBurn the <code>Balance</code> if the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> has a <code>BurnOnly</code> supply state.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_burn_balance">burn_balance</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, <a href="../sui/balance.md#sui_balance">balance</a>: <a href="../sui/balance.md#sui_balance_Balance">sui::balance::Balance</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_burn_balance">burn_balance</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, <a href="../sui/balance.md#sui_balance">balance</a>: Balance<T>) { <b>assert</b>!(currency.<a href="../sui/coin_registry.md#sui_coin_registry_is_supply_burn_only">is_supply_burn_only</a>(), <a href="../sui/coin_registry.md#sui_coin_registry_ESupplyNotBurnOnly">ESupplyNotBurnOnly</a>); match (currency.supply.borrow_mut()) { SupplyState::BurnOnly(supply) => { supply.decrease_supply(<a href="../sui/balance.md#sui_balance">balance</a>); }, _ => <b>abort</b> <a href="../sui/coin_registry.md#sui_coin_registry_EInvariantViolation">EInvariantViolation</a>, // unreachable } } </code></pre> </details><a name="sui_coin_registry_set_name"></a>
set_nameUpdate the name of the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_set_name">set_name</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, _: &<a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">sui::coin_registry::MetadataCap</a><T>, <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>: <a href="../std/string.md#std_string_String">std::string::String</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_set_name">set_name</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, _: &<a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a><T>, <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>: String) { currency.<a href="../sui/coin_registry.md#sui_coin_registry_name">name</a> = <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>; } </code></pre> </details><a name="sui_coin_registry_set_description"></a>
set_descriptionUpdate the description of the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_set_description">set_description</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, _: &<a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">sui::coin_registry::MetadataCap</a><T>, <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>: <a href="../std/string.md#std_string_String">std::string::String</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_set_description">set_description</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, _: &<a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a><T>, <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>: String) { currency.<a href="../sui/coin_registry.md#sui_coin_registry_description">description</a> = <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>; } </code></pre> </details><a name="sui_coin_registry_set_icon_url"></a>
set_icon_urlUpdate the icon URL of the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_set_icon_url">set_icon_url</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, _: &<a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">sui::coin_registry::MetadataCap</a><T>, <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>: <a href="../std/string.md#std_string_String">std::string::String</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_set_icon_url">set_icon_url</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, _: &<a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a><T>, <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>: String) { currency.<a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a> = <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>; } </code></pre> </details><a name="sui_coin_registry_set_treasury_cap_id"></a>
set_treasury_cap_idRegister the treasury cap ID for a migrated <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>. All currencies created with <code><a href="../sui/coin_registry.md#sui_coin_registry_new_currency">new_currency</a></code> or <code><a href="../sui/coin_registry.md#sui_coin_registry_new_currency_with_otw">new_currency_with_otw</a></code> have their treasury cap ID set during initialization.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_set_treasury_cap_id">set_treasury_cap_id</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, cap: &<a href="../sui/coin.md#sui_coin_TreasuryCap">sui::coin::TreasuryCap</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_set_treasury_cap_id">set_treasury_cap_id</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, cap: &TreasuryCap<T>) { currency.<a href="../sui/coin_registry.md#sui_coin_registry_treasury_cap_id">treasury_cap_id</a>.fill(<a href="../sui/object.md#sui_object_id">object::id</a>(cap)); } </code></pre> </details><a name="sui_coin_registry_migrate_legacy_metadata"></a>
migrate_legacy_metadataRegister <code>CoinMetadata</code> in the <code><a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a></code>. This can happen only once, if the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> did not exist yet. Further updates are possible through <code><a href="../sui/coin_registry.md#sui_coin_registry_update_from_legacy_metadata">update_from_legacy_metadata</a></code>.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_migrate_legacy_metadata">migrate_legacy_metadata</a><T>(registry: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">sui::coin_registry::CoinRegistry</a>, legacy: &<a href="../sui/coin.md#sui_coin_CoinMetadata">sui::coin::CoinMetadata</a><T>, _ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_migrate_legacy_metadata">migrate_legacy_metadata</a><T>( registry: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a>, legacy: &CoinMetadata<T>, _ctx: &<b>mut</b> TxContext, ) { <b>let</b> currency = <a href="../sui/coin_registry.md#sui_coin_registry_migrate_legacy_metadata_impl">migrate_legacy_metadata_impl</a>!(registry, legacy); <a href="../sui/transfer.md#sui_transfer_share_object">transfer::share_object</a>(currency); } </code></pre> </details><a name="sui_coin_registry_update_from_legacy_metadata"></a>
update_from_legacy_metadataUpdate <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> from <code>CoinMetadata</code> if the <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> is not claimed. After the <code><a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a></code> is claimed, updates can only be made through <code>set_*</code> functions.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_update_from_legacy_metadata">update_from_legacy_metadata</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, legacy: &<a href="../sui/coin.md#sui_coin_CoinMetadata">sui::coin::CoinMetadata</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_update_from_legacy_metadata">update_from_legacy_metadata</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, legacy: &CoinMetadata<T>) { <b>assert</b>!(!currency.<a href="../sui/coin_registry.md#sui_coin_registry_is_metadata_cap_claimed">is_metadata_cap_claimed</a>(), <a href="../sui/coin_registry.md#sui_coin_registry_ECannotUpdateManagedMetadata">ECannotUpdateManagedMetadata</a>); currency.<a href="../sui/coin_registry.md#sui_coin_registry_name">name</a> = legacy.get_name(); currency.<a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a> = legacy.get_symbol().to_string(); currency.<a href="../sui/coin_registry.md#sui_coin_registry_description">description</a> = legacy.get_description(); currency.<a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a> = legacy.get_decimals(); currency.<a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a> = legacy.get_icon_url().map!(|<a href="../sui/url.md#sui_url">url</a>| <a href="../sui/url.md#sui_url">url</a>.inner_url().to_string()).destroy_or!(b"".to_string()); } </code></pre> </details><a name="sui_coin_registry_delete_migrated_legacy_metadata"></a>
delete_migrated_legacy_metadata<a name="sui_coin_registry_migrate_regulated_state_by_metadata"></a>
migrate_regulated_state_by_metadataAllow migrating the regulated state by access to <code>RegulatedCoinMetadata</code> frozen object. This is a permissionless operation which can be performed only once.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_migrate_regulated_state_by_metadata">migrate_regulated_state_by_metadata</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, metadata: &<a href="../sui/coin.md#sui_coin_RegulatedCoinMetadata">sui::coin::RegulatedCoinMetadata</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_migrate_regulated_state_by_metadata">migrate_regulated_state_by_metadata</a><T>( currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, metadata: &RegulatedCoinMetadata<T>, ) { // Only allow <b>if</b> this hasn't been migrated before. <b>assert</b>!(currency.regulated == RegulatedState::Unknown, <a href="../sui/coin_registry.md#sui_coin_registry_EDenyListStateAlreadySet">EDenyListStateAlreadySet</a>); currency.regulated = RegulatedState::Regulated { cap: metadata.<a href="../sui/coin_registry.md#sui_coin_registry_deny_cap_id">deny_cap_id</a>(), allow_global_pause: option::none(), variant: <a href="../sui/coin_registry.md#sui_coin_registry_REGULATED_COIN_VERSION">REGULATED_COIN_VERSION</a>, }; } </code></pre> </details><a name="sui_coin_registry_migrate_regulated_state_by_cap"></a>
migrate_regulated_state_by_capMark regulated state by showing the <code>DenyCapV2</code> object for the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_migrate_regulated_state_by_cap">migrate_regulated_state_by_cap</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, cap: &<a href="../sui/coin.md#sui_coin_DenyCapV2">sui::coin::DenyCapV2</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_migrate_regulated_state_by_cap">migrate_regulated_state_by_cap</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, cap: &DenyCapV2<T>) { currency.regulated = RegulatedState::Regulated { cap: <a href="../sui/object.md#sui_object_id">object::id</a>(cap), allow_global_pause: option::some(cap.allow_global_pause()), variant: <a href="../sui/coin_registry.md#sui_coin_registry_REGULATED_COIN_VERSION">REGULATED_COIN_VERSION</a>, }; } </code></pre> </details><a name="sui_coin_registry_borrow_legacy_metadata"></a>
borrow_legacy_metadataBorrow the legacy <code>CoinMetadata</code> from a new <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>. To preserve the <code>ID</code> of the legacy <code>CoinMetadata</code>, we create it on request and then store it as a dynamic field for future borrows.
<code><a href="../sui/coin_registry.md#sui_coin_registry_Borrow">Borrow</a><T></code> ensures that the <code>CoinMetadata</code> is returned in the same transaction.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_borrow_legacy_metadata">borrow_legacy_metadata</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): (<a href="../sui/coin.md#sui_coin_CoinMetadata">sui::coin::CoinMetadata</a><T>, <a href="../sui/coin_registry.md#sui_coin_registry_Borrow">sui::coin_registry::Borrow</a><T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_borrow_legacy_metadata">borrow_legacy_metadata</a><T>( currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, ctx: &<b>mut</b> TxContext, ): (CoinMetadata<T>, <a href="../sui/coin_registry.md#sui_coin_registry_Borrow">Borrow</a><T>) { <b>assert</b>!(!currency.<a href="../sui/coin_registry.md#sui_coin_registry_is_migrated_from_legacy">is_migrated_from_legacy</a>(), <a href="../sui/coin_registry.md#sui_coin_registry_EBorrowLegacyMetadata">EBorrowLegacyMetadata</a>); <b>if</b> (!df::exists_(¤cy.id, <a href="../sui/coin_registry.md#sui_coin_registry_LegacyMetadataKey">LegacyMetadataKey</a>())) { <b>let</b> legacy = currency.<a href="../sui/coin_registry.md#sui_coin_registry_to_legacy_metadata">to_legacy_metadata</a>(ctx); df::add(&<b>mut</b> currency.id, <a href="../sui/coin_registry.md#sui_coin_registry_LegacyMetadataKey">LegacyMetadataKey</a>(), legacy); }; <b>let</b> <b>mut</b> legacy: CoinMetadata<T> = df::remove(&<b>mut</b> currency.id, <a href="../sui/coin_registry.md#sui_coin_registry_LegacyMetadataKey">LegacyMetadataKey</a>()); legacy.update_coin_metadata( currency.<a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>, currency.<a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>.to_ascii(), currency.<a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>, currency.<a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>.to_ascii(), ); (legacy, <a href="../sui/coin_registry.md#sui_coin_registry_Borrow">Borrow</a> {}) } </code></pre> </details><a name="sui_coin_registry_return_borrowed_legacy_metadata"></a>
return_borrowed_legacy_metadataReturn the borrowed <code>CoinMetadata</code> and the <code><a href="../sui/coin_registry.md#sui_coin_registry_Borrow">Borrow</a></code> potato to the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
Note to self: Borrow requirement prevents deletion through this method.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_return_borrowed_legacy_metadata">return_borrowed_legacy_metadata</a><T>(currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, legacy: <a href="../sui/coin.md#sui_coin_CoinMetadata">sui::coin::CoinMetadata</a><T>, <a href="../sui/borrow.md#sui_borrow">borrow</a>: <a href="../sui/coin_registry.md#sui_coin_registry_Borrow">sui::coin_registry::Borrow</a><T>, _ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_return_borrowed_legacy_metadata">return_borrowed_legacy_metadata</a><T>( currency: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, <b>mut</b> legacy: CoinMetadata<T>, <a href="../sui/borrow.md#sui_borrow">borrow</a>: <a href="../sui/coin_registry.md#sui_coin_registry_Borrow">Borrow</a><T>, _ctx: &<b>mut</b> TxContext, ) { <b>assert</b>!(!df::exists_(¤cy.id, <a href="../sui/coin_registry.md#sui_coin_registry_LegacyMetadataKey">LegacyMetadataKey</a>()), <a href="../sui/coin_registry.md#sui_coin_registry_EDuplicateBorrow">EDuplicateBorrow</a>); <b>let</b> <a href="../sui/coin_registry.md#sui_coin_registry_Borrow">Borrow</a> {} = <a href="../sui/borrow.md#sui_borrow">borrow</a>; // Always store up to date value. legacy.update_coin_metadata( currency.<a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>, currency.<a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>.to_ascii(), currency.<a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>, currency.<a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>.to_ascii(), ); df::add(&<b>mut</b> currency.id, <a href="../sui/coin_registry.md#sui_coin_registry_LegacyMetadataKey">LegacyMetadataKey</a>(), legacy); } </code></pre> </details><a name="sui_coin_registry_decimals"></a>
decimalsGet the number of decimal places for the coin type.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): u8 </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): u8 { currency.<a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a> } </code></pre> </details><a name="sui_coin_registry_name"></a>
nameGet the human-readable name of the coin.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): <a href="../std/string.md#std_string_String">std::string::String</a> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): String { currency.<a href="../sui/coin_registry.md#sui_coin_registry_name">name</a> } </code></pre> </details><a name="sui_coin_registry_symbol"></a>
symbolGet the symbol/ticker of the coin.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): <a href="../std/string.md#std_string_String">std::string::String</a> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): String { currency.<a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a> } </code></pre> </details><a name="sui_coin_registry_description"></a>
descriptionGet the description of the coin.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): <a href="../std/string.md#std_string_String">std::string::String</a> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): String { currency.<a href="../sui/coin_registry.md#sui_coin_registry_description">description</a> } </code></pre> </details><a name="sui_coin_registry_icon_url"></a>
icon_urlGet the icon URL for the coin.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): <a href="../std/string.md#std_string_String">std::string::String</a> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): String { currency.<a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a> } </code></pre> </details><a name="sui_coin_registry_is_metadata_cap_claimed"></a>
is_metadata_cap_claimedCheck if the metadata capability has been claimed for this <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> type.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_metadata_cap_claimed">is_metadata_cap_claimed</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_metadata_cap_claimed">is_metadata_cap_claimed</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): bool { match (currency.<a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a>) { MetadataCapState::Claimed(_) | MetadataCapState::Deleted => <b>true</b>, _ => <b>false</b>, } } </code></pre> </details><a name="sui_coin_registry_is_metadata_cap_deleted"></a>
is_metadata_cap_deletedCheck if the metadata capability has been deleted for this <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code> type.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_metadata_cap_deleted">is_metadata_cap_deleted</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_metadata_cap_deleted">is_metadata_cap_deleted</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): bool { match (currency.<a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a>) { MetadataCapState::Deleted => <b>true</b>, _ => <b>false</b>, } } </code></pre> </details><a name="sui_coin_registry_metadata_cap_id"></a>
metadata_cap_idGet the metadata cap ID, or none if it has not been claimed.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): <a href="../std/option.md#std_option_Option">std::option::Option</a><<a href="../sui/object.md#sui_object_ID">sui::object::ID</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): Option<ID> { match (currency.<a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a>) { MetadataCapState::Claimed(id) => option::some(id), _ => option::none(), } } </code></pre> </details><a name="sui_coin_registry_treasury_cap_id"></a>
treasury_cap_idGet the treasury cap ID for this coin type, if registered.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_treasury_cap_id">treasury_cap_id</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): <a href="../std/option.md#std_option_Option">std::option::Option</a><<a href="../sui/object.md#sui_object_ID">sui::object::ID</a>> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_treasury_cap_id">treasury_cap_id</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): Option<ID> { currency.<a href="../sui/coin_registry.md#sui_coin_registry_treasury_cap_id">treasury_cap_id</a> } </code></pre> </details><a name="sui_coin_registry_deny_cap_id"></a>
deny_cap_idGet the deny cap ID for this coin type, if it's a regulated coin. Returns <code>None</code> if:
<a name="sui_coin_registry_is_supply_fixed"></a>
is_supply_fixedCheck if the supply is fixed.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_supply_fixed">is_supply_fixed</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_supply_fixed">is_supply_fixed</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): bool { match (currency.supply.<a href="../sui/borrow.md#sui_borrow">borrow</a>()) { SupplyState::Fixed(_) => <b>true</b>, _ => <b>false</b>, } } </code></pre> </details><a name="sui_coin_registry_is_supply_burn_only"></a>
is_supply_burn_onlyCheck if the supply is burn-only.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_supply_burn_only">is_supply_burn_only</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_supply_burn_only">is_supply_burn_only</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): bool { match (currency.supply.<a href="../sui/borrow.md#sui_borrow">borrow</a>()) { SupplyState::BurnOnly(_) => <b>true</b>, _ => <b>false</b>, } } </code></pre> </details><a name="sui_coin_registry_is_regulated"></a>
is_regulatedCheck if the currency is regulated.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_regulated">is_regulated</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_regulated">is_regulated</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): bool { match (currency.regulated) { RegulatedState::Regulated { .. } => <b>true</b>, _ => <b>false</b>, } } </code></pre> </details><a name="sui_coin_registry_total_supply"></a>
total_supplyGet the total supply for the <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T></code> if the Supply is in fixed or burn-only state. Returns <code>None</code> if the SupplyState is Unknown.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_total_supply">total_supply</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): <a href="../std/option.md#std_option_Option">std::option::Option</a><u64> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_total_supply">total_supply</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): Option<u64> { match (currency.supply.<a href="../sui/borrow.md#sui_borrow">borrow</a>()) { SupplyState::Fixed(supply) => option::some(supply.value()), SupplyState::BurnOnly(supply) => option::some(supply.value()), SupplyState::Unknown => option::none(), } } </code></pre> </details><a name="sui_coin_registry_exists"></a>
existsCheck if coin data exists for the given type T in the registry.
<pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_exists">exists</a><T>(registry: &<a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">sui::coin_registry::CoinRegistry</a>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_exists">exists</a><T>(registry: &<a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a>): bool { <a href="../sui/derived_object.md#sui_derived_object_exists">derived_object::exists</a>(®istry.id, <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyKey">CurrencyKey</a><T>()) } </code></pre> </details><a name="sui_coin_registry_is_migrated_from_legacy"></a>
is_migrated_from_legacyWhether the currency is migrated from legacy.
<pre><code><b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_migrated_from_legacy">is_migrated_from_legacy</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_migrated_from_legacy">is_migrated_from_legacy</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>): bool { !currency.extra_fields.contains(&<a href="../sui/coin_registry.md#sui_coin_registry_NEW_CURRENCY_MARKER">NEW_CURRENCY_MARKER</a>.to_string()) } </code></pre> </details><a name="sui_coin_registry_to_legacy_metadata"></a>
to_legacy_metadataCreate a new legacy <code>CoinMetadata</code> from a <code><a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a></code>.
<pre><code><b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_to_legacy_metadata">to_legacy_metadata</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><T>, ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): <a href="../sui/coin.md#sui_coin_CoinMetadata">sui::coin::CoinMetadata</a><T> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_to_legacy_metadata">to_legacy_metadata</a><T>(currency: &<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><T>, ctx: &<b>mut</b> TxContext): CoinMetadata<T> { <a href="../sui/coin.md#sui_coin_new_coin_metadata">coin::new_coin_metadata</a>( currency.<a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a>, currency.<a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>, currency.<a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>.to_ascii(), currency.<a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>, currency.<a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>.to_ascii(), ctx, ) } </code></pre> </details><a name="sui_coin_registry_create"></a>
createCreate and share the singleton <code><a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a></code> -- this function is called exactly once, during the upgrade epoch. Only the system address (0x0) can create the registry.
<pre><code><b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_create">create</a>(ctx: &<a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_create">create</a>(ctx: &TxContext) { <b>assert</b>!(ctx.sender() == @0x0, <a href="../sui/coin_registry.md#sui_coin_registry_ENotSystemAddress">ENotSystemAddress</a>); <a href="../sui/transfer.md#sui_transfer_share_object">transfer::share_object</a>(<a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a> { id: <a href="../sui/object.md#sui_object_sui_coin_registry_object_id">object::sui_coin_registry_object_id</a>(), }); } </code></pre> </details><a name="sui_coin_registry_finalize_impl"></a>
finalize_implInternal macro to keep implementation between build and test modes.
<pre><code><b>macro</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_finalize_impl">finalize_impl</a><$T>($builder: <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">sui::coin_registry::CurrencyInitializer</a><$T>, $ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): (<a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><$T>, <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">sui::coin_registry::MetadataCap</a><$T>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>macro</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_finalize_impl">finalize_impl</a><$T>( $builder: <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a><$T>, $ctx: &<b>mut</b> TxContext, ): (<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><$T>, <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a><$T>) { <b>let</b> <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a> { <b>mut</b> currency, extra_fields, is_otw: _ } = $builder; extra_fields.destroy_empty(); <b>let</b> id = <a href="../sui/object.md#sui_object_new">object::new</a>($ctx); currency.<a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a> = MetadataCapState::Claimed(id.to_inner()); // Mark the currency <b>as</b> new, so in the future we can support borrowing of the // legacy metadata. currency .extra_fields .insert( <a href="../sui/coin_registry.md#sui_coin_registry_NEW_CURRENCY_MARKER">NEW_CURRENCY_MARKER</a>.to_string(), <a href="../sui/coin_registry.md#sui_coin_registry_ExtraField">ExtraField</a>(type_name::with_original_ids<bool>(), <a href="../sui/coin_registry.md#sui_coin_registry_NEW_CURRENCY_MARKER">NEW_CURRENCY_MARKER</a>), ); (currency, <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a><$T> { id }) } </code></pre> </details><a name="sui_coin_registry_migrate_legacy_metadata_impl"></a>
migrate_legacy_metadata_implInternal macro to keep implementation between build and test modes.
<pre><code><b>macro</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_migrate_legacy_metadata_impl">migrate_legacy_metadata_impl</a><$T>($registry: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">sui::coin_registry::CoinRegistry</a>, $legacy: &<a href="../sui/coin.md#sui_coin_CoinMetadata">sui::coin::CoinMetadata</a><$T>): <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a><$T> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>macro</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_migrate_legacy_metadata_impl">migrate_legacy_metadata_impl</a><$T>( $registry: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a>, $legacy: &CoinMetadata<$T>, ): <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><$T> { <b>let</b> registry = $registry; <b>let</b> legacy = $legacy; <b>assert</b>!(!registry.<a href="../sui/coin_registry.md#sui_coin_registry_exists">exists</a><$T>(), <a href="../sui/coin_registry.md#sui_coin_registry_ECurrencyAlreadyRegistered">ECurrencyAlreadyRegistered</a>); <b>assert</b>!(<a href="../sui/coin_registry.md#sui_coin_registry_is_ascii_printable">is_ascii_printable</a>!(&legacy.get_symbol().to_string()), <a href="../sui/coin_registry.md#sui_coin_registry_EInvalidSymbol">EInvalidSymbol</a>); <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a><$T> { id: <a href="../sui/derived_object.md#sui_derived_object_claim">derived_object::claim</a>(&<b>mut</b> registry.id, <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyKey">CurrencyKey</a><$T>()), <a href="../sui/coin_registry.md#sui_coin_registry_decimals">decimals</a>: legacy.get_decimals(), <a href="../sui/coin_registry.md#sui_coin_registry_name">name</a>: legacy.get_name(), <a href="../sui/coin_registry.md#sui_coin_registry_symbol">symbol</a>: legacy.get_symbol().to_string(), <a href="../sui/coin_registry.md#sui_coin_registry_description">description</a>: legacy.get_description(), <a href="../sui/coin_registry.md#sui_coin_registry_icon_url">icon_url</a>: legacy .get_icon_url() .map!(|<a href="../sui/url.md#sui_url">url</a>| <a href="../sui/url.md#sui_url">url</a>.inner_url().to_string()) .destroy_or!(b"".to_string()), supply: option::some(SupplyState::Unknown), regulated: RegulatedState::Unknown, <a href="../sui/coin_registry.md#sui_coin_registry_treasury_cap_id">treasury_cap_id</a>: option::none(), <a href="../sui/coin_registry.md#sui_coin_registry_metadata_cap_id">metadata_cap_id</a>: MetadataCapState::Unclaimed, extra_fields: <a href="../sui/vec_map.md#sui_vec_map_empty">vec_map::empty</a>(), } } </code></pre> </details><a name="sui_coin_registry_is_ascii_printable"></a>
is_ascii_printableNit: consider adding this function to <code><a href="../std/string.md#std_string">std::string</a></code> in the future.
<pre><code><b>macro</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_ascii_printable">is_ascii_printable</a>($s: &<a href="../std/string.md#std_string_String">std::string::String</a>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>macro</b> <b>fun</b> <a href="../sui/coin_registry.md#sui_coin_registry_is_ascii_printable">is_ascii_printable</a>($s: &String): bool { <b>let</b> s = $s; s.as_bytes().all!(|b| ascii::is_printable_char(*b)) } </code></pre> </details>