Fungible Tokens
Sui provides two standards for creating fungible tokens. Both produce Coin<T> objects that are fully interoperable with wallets, DeFi protocols, and address balances. The difference is in how you create, configure, and manage the token's metadata and supply.
What is the difference between the Coin Standard and the Currency Standard?
| Feature | Coin Standard | Currency Standard |
|---|---|---|
| Creation function | coin::create_currency | coin_registry::new_currency or coin_registry::new_currency_with_otw |
| Metadata storage | Standalone CoinMetadata object | Centralized in CoinRegistry at address 0xc |
| Supply models | Uncontrolled only | Fixed, burn-only, or uncontrolled |
| Regulatory support | create_regulated_currency_v2 | make_regulated() during initialization |
| Metadata updates | Requires TreasuryCap | Dedicated MetadataCap (can be frozen or deleted) |
| RPC discovery | Requires knowing CoinMetadata object ID | Queryable from the central registry |
| Status | Active | Recommended for new projects |
Which standard should I choose?
Use the following guidance to pick the right standard for your project:
For new tokens, use the Currency Standard. It provides richer supply controls, centralized metadata discovery, and a dedicated MetadataCap for metadata management.
How do I create a new token?
-
Most projects: Use
coin_registry::new_currency. You can call this at any time after publishing your package. See Create Fungible Tokens: Currency Standard. -
Need a One-Time Witness (OTW) proof: Use
coin_registry::new_currency_with_otwin your module'sinitfunction. This requires a two-step publish-then-finalize process. -
Need the legacy Coin Standard: Use
coin::create_currencyin your module'sinitfunction. See Create Fungible Tokens: Coin Standard.
Configuring supply
Only the Currency Standard supports supply model configuration. Coin Standard tokens always use uncontrolled supply, where the TreasuryCap holder can mint and burn freely.
- Fixed supply: Mint the total supply during initialization, then call
make_supply_fixedto lock theTreasuryCapinside theCurrency. No further minting or burning is possible. - Burn-only (deflationary): Mint the initial supply, then call
make_supply_burn_onlyto prevent future minting while still allowing burns. - Uncontrolled: The default. The
TreasuryCapholder can mint and burn freely.
Adding regulatory controls
Both standards support regulated tokens with deny-list capabilities. The Currency Standard simplifies this with make_regulated(allow_global_pause, ctx) during initialization, which returns a DenyCapV2 for managing the deny list. See Regulated Tokens for deny-list management.
Migrating an existing token
If you have an existing Coin Standard token, the Currency Standard provides migration functions to register your coin in the CoinRegistry while preserving its existing CoinMetadata object ID. See the Currency Standard reference for migration details.
Example patterns
These guides show common token configurations in action:
- Fixed-supply token: Mint a capped supply at creation and freeze it permanently.
- In-game currency: Mintable game tokens with admin controls.
- Loyalty tokens: Non-transferable reward points using the Closed-Loop Token standard.
- Regulated tokens: Tokens with deny-list and global pause capabilities.
Coin Standard
Currency Standard
Regulated Currencies
Create regulated currencies on Sui using the Currency Standard's Coin Registry, with support for deny list access control, global pause functionality, compliance tooling integration, and migration from legacy regulated coins.
Token Vesting Strategies
Implement a vesting strategy for your token launch on Sui to strengthen long-term commitment, prevent market dumps, and align stakeholder incentives.
Bridging Tokens
Bridging moves tokens from one blockchain to another. To bridge tokens from another blockchain to Sui, you can use Sui Bridge, Wormhole Connect, Wormhole Portal Bridge, or ZetaChain.
Migrate a Coin Standard token to the Coin Registry
Before you migrate an existing Coin Standard token, review how migration behaves:
migrate_legacy_metadataregisters yourCoinMetadatain theCoinRegistryand shares the resultingCurrency. You can call it only once, and only if noCurrencyexists for the type yet.- Until you claim the
MetadataCap,update_from_legacy_metadatacopies changes fromCoinMetadatainto theCurrency. After you claim the cap, you can update metadata only through theset_*functions. - You cannot delete the legacy
CoinMetadataafter migration.delete_migrated_legacy_metadatais disabled and aborts. - A migrated
Currencydoes not record its treasury cap ID automatically. Callset_treasury_cap_idwith yourTreasuryCapto register it. - For regulated coins, anyone can call
migrate_regulated_state_by_metadatawith theRegulatedCoinMetadataobject, and only once. You can also callmigrate_regulated_state_by_capwith yourDenyCapV2.