@@ -56,6 +56,8 @@ supply information, regulatory status, and metadata capabilities.
5656- [ Function ` total_supply ` ] ( #sui_coin_registry_total_supply )
5757- [ Function ` exists ` ] ( #sui_coin_registry_exists )
5858- [ Function ` create ` ] ( #sui_coin_registry_create )
59+ - [ Macro function ` finalize_impl ` ] ( #sui_coin_registry_finalize_impl )
60+ - [ Macro function ` migrate_legacy_metadata_impl ` ] ( #sui_coin_registry_migrate_legacy_metadata_impl )
5961- [ Macro function ` is_ascii_printable ` ] ( #sui_coin_registry_is_ascii_printable )
6062
6163
@@ -656,6 +658,16 @@ Attempt to migrate legacy metadata for a <code><a href="../sui/coin_registry.md#
656658
657659
658660
661+ <a name =" sui_coin_registry_ENotOneTimeWitness " ></a >
662+
663+
664+
665+ <pre ><code >#[error]
666+ <b >const</b > <a href =" ../sui/coin_registry.md#sui_coin_registry_ENotOneTimeWitness " >ENotOneTimeWitness</a >: vector< ; u8> ; = b"Type is expected to be OTW";
667+ </code ></pre >
668+
669+
670+
659671<a name =" sui_coin_registry_REGULATED_COIN_VERSION " ></a >
660672
661673Incremental identifier for regulated coin versions in the deny list.
@@ -758,7 +770,7 @@ This is a two-step operation:
758770 <a href =" ../sui/coin_registry.md#sui_coin_registry_icon_url " >icon_url</a >: String,
759771 ctx: &<b >mut</b > TxContext,
760772): (<a href =" ../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer " >CurrencyInitializer</a >< ; T> ; , TreasuryCap< ; T> ; ) {
761- <b >assert</b >!(<a href =" ../sui/types.md#sui_types_is_one_time_witness " >sui::types::is_one_time_witness</a >(&otw));
773+ <b >assert</b >!(<a href =" ../sui/types.md#sui_types_is_one_time_witness " >sui::types::is_one_time_witness</a >(&otw), < a href = " ../sui/coin_registry.md#sui_coin_registry_ENotOneTimeWitness " >ENotOneTimeWitness</ a > );
762774 <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 >);
763775 <b >let</b > treasury_cap = <a href =" ../sui/coin.md#sui_coin_new_treasury_cap " >coin::new_treasury_cap</a >(ctx);
764776 <b >let</b > currency = <a href =" ../sui/coin_registry.md#sui_coin_registry_Currency " >Currency</a >< ; T> ; {
@@ -991,21 +1003,12 @@ Finalize the coin initialization, returning <code><a href="../sui/coin_registry.
9911003
9921004
9931005<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> ; {
994- <b >let</b > <a href =" ../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer " >CurrencyInitializer</a > { <b >mut</b > currency, is_otw, extra_fields } = builder;
995- extra_fields.destroy_empty();
996- <b >let</b > id = <a href =" ../sui/object.md#sui_object_new " >object::new</a >(ctx);
997- currency.<a href =" ../sui/coin_registry.md#sui_coin_registry_metadata_cap_id " >metadata_cap_id</a > = MetadataCapState::Claimed(id.to_inner());
998- // Mark the currency <b >as</b > new, so in the future we can support borrowing of the
999- // legacy metadata.
1000- currency
1001- .extra_fields
1002- .insert(
1003- <a href =" ../sui/coin_registry.md#sui_coin_registry_NEW_CURRENCY_MARKER " >NEW_CURRENCY_MARKER</a >.to_string(),
1004- <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 >),
1005- );
1006+ <b >let</b > is_otw = builder.is_otw;
1007+ <b >let</b > (currency, metadata_cap) = <a href =" ../sui/coin_registry.md#sui_coin_registry_finalize_impl " >finalize_impl</a >!(builder, ctx);
1008+ // 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 >`.
10061009 <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 >())
10071010 <b >else</b > <a href =" ../sui/transfer.md#sui_transfer_share_object " >transfer::share_object</a >(currency);
1008- < a href = " ../sui/coin_registry.md#sui_coin_registry_MetadataCap " >MetadataCap</ a > & lt ; T & gt ; { id }
1011+ metadata_cap
10091012}
10101013</code ></pre >
10111014
@@ -1282,24 +1285,8 @@ Register <code>CoinMetadata</code> in the <code><a href="../sui/coin_registry.md
12821285 legacy: &CoinMetadata< ; T> ; ,
12831286 _ctx: &<b >mut</b > TxContext,
12841287) {
1285- <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 >);
1286- <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 >);
1287- <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 >< ; T> ; {
1288- 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> ; ()),
1289- <a href =" ../sui/coin_registry.md#sui_coin_registry_decimals " >decimals</a >: legacy.get_decimals(),
1290- <a href =" ../sui/coin_registry.md#sui_coin_registry_name " >name</a >: legacy.get_name(),
1291- <a href =" ../sui/coin_registry.md#sui_coin_registry_symbol " >symbol</a >: legacy.get_symbol().to_string(),
1292- <a href =" ../sui/coin_registry.md#sui_coin_registry_description " >description</a >: legacy.get_description(),
1293- <a href =" ../sui/coin_registry.md#sui_coin_registry_icon_url " >icon_url</a >: legacy
1294- .get_icon_url()
1295- .map!(|<a href =" ../sui/url.md#sui_url " >url</a >| <a href =" ../sui/url.md#sui_url " >url</a >.inner_url().to_string())
1296- .destroy_or!(b"".to_string()),
1297- supply: option::some(SupplyState::Unknown),
1298- regulated: RegulatedState::Unknown, // We don't know <b >if</b > it's regulated or not!
1299- <a href =" ../sui/coin_registry.md#sui_coin_registry_treasury_cap_id " >treasury_cap_id</a >: option::none(),
1300- <a href =" ../sui/coin_registry.md#sui_coin_registry_metadata_cap_id " >metadata_cap_id</a >: MetadataCapState::Unclaimed,
1301- extra_fields: <a href =" ../sui/vec_map.md#sui_vec_map_empty " >vec_map::empty</a >(),
1302- });
1288+ <b >let</b > currency = <a href =" ../sui/coin_registry.md#sui_coin_registry_migrate_legacy_metadata_impl " >migrate_legacy_metadata_impl</a >!(registry, legacy);
1289+ <a href =" ../sui/transfer.md#sui_transfer_share_object " >transfer::share_object</a >(currency);
13031290}
13041291</code ></pre >
13051292
@@ -1851,6 +1838,93 @@ Only the system address (0x0) can create the registry.
18511838
18521839
18531840
1841+ </details >
1842+
1843+ <a name =" sui_coin_registry_finalize_impl " ></a >
1844+
1845+ ## Macro function ` finalize_impl `
1846+
1847+ Internal macro to keep implementation between build and test modes.
1848+
1849+
1850+ <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> ; )
1851+ </code ></pre >
1852+
1853+
1854+
1855+ <details >
1856+ <summary >Implementation</summary >
1857+
1858+
1859+ <pre ><code ><b >macro</b > <b >fun</b > <a href =" ../sui/coin_registry.md#sui_coin_registry_finalize_impl " >finalize_impl</a >< ; $T> ; (
1860+ $builder: <a href =" ../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer " >CurrencyInitializer</a >< ; $T> ; ,
1861+ $ctx: &<b >mut</b > TxContext,
1862+ ): (<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> ; ) {
1863+ <b >let</b > <a href =" ../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer " >CurrencyInitializer</a > { <b >mut</b > currency, extra_fields, is_otw: _ } = $builder;
1864+ extra_fields.destroy_empty();
1865+ <b >let</b > id = <a href =" ../sui/object.md#sui_object_new " >object::new</a >($ctx);
1866+ currency.<a href =" ../sui/coin_registry.md#sui_coin_registry_metadata_cap_id " >metadata_cap_id</a > = MetadataCapState::Claimed(id.to_inner());
1867+ // Mark the currency <b >as</b > new, so in the future we can support borrowing of the
1868+ // legacy metadata.
1869+ currency
1870+ .extra_fields
1871+ .insert(
1872+ <a href =" ../sui/coin_registry.md#sui_coin_registry_NEW_CURRENCY_MARKER " >NEW_CURRENCY_MARKER</a >.to_string(),
1873+ <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 >),
1874+ );
1875+ (currency, <a href =" ../sui/coin_registry.md#sui_coin_registry_MetadataCap " >MetadataCap</a >< ; $T> ; { id })
1876+ }
1877+ </code ></pre >
1878+
1879+
1880+
1881+ </details >
1882+
1883+ <a name =" sui_coin_registry_migrate_legacy_metadata_impl " ></a >
1884+
1885+ ## Macro function ` migrate_legacy_metadata_impl `
1886+
1887+ Internal macro to keep implementation between build and test modes.
1888+
1889+
1890+ <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> ;
1891+ </code ></pre >
1892+
1893+
1894+
1895+ <details >
1896+ <summary >Implementation</summary >
1897+
1898+
1899+ <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> ; (
1900+ $registry: &<b >mut</b > <a href =" ../sui/coin_registry.md#sui_coin_registry_CoinRegistry " >CoinRegistry</a >,
1901+ $legacy: &CoinMetadata< ; $T> ; ,
1902+ ): <a href =" ../sui/coin_registry.md#sui_coin_registry_Currency " >Currency</a >< ; $T> ; {
1903+ <b >let</b > registry = $registry;
1904+ <b >let</b > legacy = $legacy;
1905+ <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 >);
1906+ <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 >);
1907+ <a href =" ../sui/coin_registry.md#sui_coin_registry_Currency " >Currency</a >< ; $T> ; {
1908+ 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> ; ()),
1909+ <a href =" ../sui/coin_registry.md#sui_coin_registry_decimals " >decimals</a >: legacy.get_decimals(),
1910+ <a href =" ../sui/coin_registry.md#sui_coin_registry_name " >name</a >: legacy.get_name(),
1911+ <a href =" ../sui/coin_registry.md#sui_coin_registry_symbol " >symbol</a >: legacy.get_symbol().to_string(),
1912+ <a href =" ../sui/coin_registry.md#sui_coin_registry_description " >description</a >: legacy.get_description(),
1913+ <a href =" ../sui/coin_registry.md#sui_coin_registry_icon_url " >icon_url</a >: legacy
1914+ .get_icon_url()
1915+ .map!(|<a href =" ../sui/url.md#sui_url " >url</a >| <a href =" ../sui/url.md#sui_url " >url</a >.inner_url().to_string())
1916+ .destroy_or!(b"".to_string()),
1917+ supply: option::some(SupplyState::Unknown),
1918+ regulated: RegulatedState::Unknown,
1919+ <a href =" ../sui/coin_registry.md#sui_coin_registry_treasury_cap_id " >treasury_cap_id</a >: option::none(),
1920+ <a href =" ../sui/coin_registry.md#sui_coin_registry_metadata_cap_id " >metadata_cap_id</a >: MetadataCapState::Unclaimed,
1921+ extra_fields: <a href =" ../sui/vec_map.md#sui_vec_map_empty " >vec_map::empty</a >(),
1922+ }
1923+ }
1924+ </code ></pre >
1925+
1926+
1927+
18541928</details >
18551929
18561930<a name =" sui_coin_registry_is_ascii_printable " ></a >
0 commit comments