Getting Started: Launching and Deploying Tokens
This article assumes you understand Sui Move and have already installed your development environment with an IDE and Sui CLI. If you don’t, check out the first article to get set up. You’ll also need a Sui wallet. We’d be launching the token on the Sui mainnet so that you can trade it in real time across DEXs. You can deploy to any DEX, but in this case, we’d deploy to Aftermath (because it’s my favourite)Sui’s Token Model
Unlike other chains with a global key-value store or account-bound balances, Everything on Sui is an object. That design choice changes how you think about assets. It also gives you much more flexibility. Let’s marinate your point of view before launching tokens. On Sui, a token is just astruct
defined in a package, wrapped with the Coin<T>
type.
[sui.move]
Coin<MyToken>
instance is an object on-chain with its own unique ID.
Unlike traditional token standards (like ERC-20) that just keep balances, here every token is an actual owned resource.
When a user holds 1000 MyToken
, they’re not holding a “balance”—they have one or more Coin<MyToken>
objects totalling 1000 units.
You can merge, split, burn, or send them—because they’re owned objects, not just numbers in a map.
Token Treasury and Metadata
When you create a token, you’d use a treasury cap pattern to control token minting (the right to mint more tokens into the supply)/ When you create a token, you generate a(TreasuryCap<T>, Metadata)
tuple:
[sui.move]
Object
of type Metadata
.
[sui.move]
Coin<MyToken>
instances share the same metadata.
Now that you understand the mechanics of Sui tokens, let’s create one immediately.
Creating a token on Sui
First, set up your project if you haven’t done that already:[sui.move]
sources/
folder and Move.toml
. This is your token package.
[sui.move]
TreasuryCap
to manage the token’s treasury cap and the URL package to add an image to the token.
Now, create a coin instance like this:
[sui.move]
coin::create_currency
function.
[sui.move]
metadata
? So that it’s not modifiable.
You’d need to mint tokens duly, so it’s best to have a separate function you can call for that.
[sui.move]
[Terminal]
