Skip to content

Commit e9b17f2

Browse files
authored
[framework] minor cleanup in CoinRegistry + tests (MystenLabs#24077)
## Description - fix MystenLabs#24159 - fix MystenLabs#24173 - fix MystenLabs#24167 ## Test plan How did you test the new or updated feature? --- ## Release notes Check each box that your changes affect. If none of the boxes relate to your changes, release notes aren't required. For each box you select, include information after the relevant heading that describes the impact of your changes that a user might notice and any actions they must take to implement updates. - [ ] Protocol: - [ ] Nodes (Validators and Full nodes): - [ ] gRPC: - [ ] JSON-RPC: - [ ] GraphQL: - [ ] CLI: - [ ] Rust SDK:
1 parent 837b22c commit e9b17f2

File tree

5 files changed

+191
-128
lines changed

5 files changed

+191
-128
lines changed

crates/sui-framework/docs/sui/coin_registry.md

Lines changed: 106 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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&lt;u8&gt; = b"Type is expected to be OTW";
667+
</code></pre>
668+
669+
670+
659671
<a name="sui_coin_registry_REGULATED_COIN_VERSION"></a>
660672

661673
Incremental 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>&lt;T&gt;, TreasuryCap&lt;T&gt;) {
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>&lt;T&gt; {
@@ -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>&lt;T&gt;(builder: <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a>&lt;T&gt;, ctx: &<b>mut</b> TxContext): <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a>&lt;T&gt; {
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&lt;bool&gt;(), <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&lt;T&gt;,
12831286
_ctx: &<b>mut</b> TxContext,
12841287
) {
1285-
<b>assert</b>!(!registry.<a href="../sui/coin_registry.md#sui_coin_registry_exists">exists</a>&lt;T&gt;(), <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>&lt;T&gt; {
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>&lt;T&gt;()),
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>&lt;$T&gt;($builder: <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">sui::coin_registry::CurrencyInitializer</a>&lt;$T&gt;, $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>&lt;$T&gt;, <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">sui::coin_registry::MetadataCap</a>&lt;$T&gt;)
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>&lt;$T&gt;(
1860+
$builder: <a href="../sui/coin_registry.md#sui_coin_registry_CurrencyInitializer">CurrencyInitializer</a>&lt;$T&gt;,
1861+
$ctx: &<b>mut</b> TxContext,
1862+
): (<a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a>&lt;$T&gt;, <a href="../sui/coin_registry.md#sui_coin_registry_MetadataCap">MetadataCap</a>&lt;$T&gt;) {
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&lt;bool&gt;(), <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>&lt;$T&gt; { 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>&lt;$T&gt;($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>&lt;$T&gt;): <a href="../sui/coin_registry.md#sui_coin_registry_Currency">sui::coin_registry::Currency</a>&lt;$T&gt;
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>&lt;$T&gt;(
1900+
$registry: &<b>mut</b> <a href="../sui/coin_registry.md#sui_coin_registry_CoinRegistry">CoinRegistry</a>,
1901+
$legacy: &CoinMetadata&lt;$T&gt;,
1902+
): <a href="../sui/coin_registry.md#sui_coin_registry_Currency">Currency</a>&lt;$T&gt; {
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>&lt;$T&gt;(), <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>&lt;$T&gt; {
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>&lt;$T&gt;()),
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

Comments
 (0)