Creating Move Coin
Overview
This tutorial guides you through the process of creating and minting your own coin using the 0x1::managed_coin
module on the Initia blockchain. It includes initializing your coin, obtaining metadata, minting coins, and checking the balances.
Tutorial
Step 1: Initialize Your Coin
To initialize your coin, you must call the 0x1::managed_coin::initialize
function.
public entry fun initialize(
account: &signer,
maximum_supply: Option<u128>,
name: String,
symbol: String,
decimals: u8,
icon_uri: String,
project_uri: String,
)
> initiad tx move execute 0x1 managed_coin initialize \
--args "option<u128>:null string:my_coin string:MYCOIN u8:6 string: string:" \
--from [key-name] \
--gas auto --gas-adjustment 1.5 --gas-prices 0.15uinit \
--node [rpc-url]:[rpc-port] --chain-id [chain-id]
import {
bcs,
LCDClient,
MnemonicKey,
MsgExecute,
Wallet,
} from '@initia/initia.js';
async function createCoin() {
const lcd = new LCDClient('[rest-url]', {
gasPrices: '0.15uinit',
gasAdjustment: '1.5',
});
const key = new MnemonicKey({
mnemonic: 'beauty sniff protect ...',
});
const wallet = new Wallet(lcd, key);
const msgs = [
new MsgExecute(
key.accAddress,
'0x1',
'managed_coin',
'initialize',
[],
[
// max supply, if you want to set max supply, insert number instaed of null
bcs.option(bcs.u128()).serialize(null).toBase64(),
bcs.string().serialize('my_coin').toBase64(), // name
bcs.string().serialize('MYCOIN').toBase64(), // symbol
// decimal point (raw value 1 consider to 10 ** (- decimalPoint))
bcs.u8().serialize(6).toBase64(),
bcs.string().serialize('').toBase64(), // icon uri
bcs.string().serialize('').toBase64(), // project uri
]
),
];
// sign tx
const signedTx = await wallet.createAndSignTx({ msgs });
// send(broadcast) tx
lcd.tx.broadcastSync(signedTx).then(res => console.log(res));
// {
// height: 0,
// txhash: '40E0D5633D37E207B2463D275F5B479FC67D545B666C37DC7B121ED551FA18FC',
// raw_log: '[]'
// }
}
createCoin();
Step 2: Mint Coin
To mint coins, you will use the 0x1::managed_coin::mint
function.
public entry fun mint(
account: &signer,
dst_addr: address,
metadata: Object<Metadata>,
amount: u64,
)
Before minting, you need to obtain the metadata for your coin, which can be done through the 0x1::coin::metadata
view function or by using sha3_256(creator+symbol+0xFE)
.
Obtaining Metadata
> initiad query move view 0x1 coin metadata \
--args "address:[addr] string:MYCOIN" \
--node [rpc-url]:[rpc-port]
data: '"0x2d81ce0b6708fccc77a537d3d1abac8c9f1f674f4f76390e3e78a89a52d4aacb"'
import { bcs, LCDClient, MnemonicKey } from '@initia/initia.js';
import * as crypto from 'crypto';
async function getCoinMetadata() {
const lcd = new LCDClient('https://stone-rest.initia.tech', {
gasPrices: '0.15uinit',
gasAdjustment: '1.5',
});
const key = new MnemonicKey({
mnemonic: 'beauty sniff protect ...',
});
// Method 1: use view function
lcd.move
.viewFunction(
'0x1',
'coin',
'metadata',
[],
[
bcs.address().serialize(key.accAddress).toBase64(),
bcs.string().serialize('MYCOIN').toBase64(),
]
)
.then(console.log);
// 0xcf921815f2b4827930ac01b3116ed3caad08ccd443f9df6eb22cd5344a548660
// Method 2: use sha3-256
console.log(coinMetadata(key.accAddress, 'MYCOIN'));
// cf921815f2b4827930ac01b3116ed3caad08ccd443f9df6eb22cd5344a548660
}
getCoinMetadata();
function coinMetadata(creator: string, symbol: string): string {
const OBJECT_FROM_SEED_ADDRESS_SCHEME = 0xfe;
const addrBytes = bcs.address().serialize(creator).toBytes();
const seed = Buffer.from(symbol, 'ascii');
const bytes = [...addrBytes, ...seed, OBJECT_FROM_SEED_ADDRESS_SCHEME];
const hash = crypto.createHash('SHA3-256');
const digest = hash.update(Buffer.from(bytes)).digest();
return digest.toString('hex');
}
Minting Coins
> initiad tx move execute 0x1 managed_coin mint \
--args "address:[addr] object:0x2d81ce0b6708fccc77a537d3d1abac8c9f1f674f4f76390e3e78a89a52d4aacb u64:100000000" \
--from [key-name] \
--gas auto --gas-adjustment 1.5 --gas-prices 0.15uinit \
--node [rpc-url]:[rpc-port] --chain-id [chain-id]
import {
bcs,
LCDClient,
MnemonicKey,
MsgExecute,
Wallet,
} from '@initia/initia.js';
import * as crypto from 'crypto';
async function mintCoin() {
const lcd = new LCDClient('[rest-url]', {
gasPrices: '0.15uinit',
gasAdjustment: '1.5',
});
const key = new MnemonicKey({
mnemonic: 'beauty sniff protect ...',
});
const wallet = new Wallet(lcd, key);
const msgs = [
new MsgExecute(
key.accAddress,
'0x1',
'managed_coin',
'mint',
[],
[
bcs.address().serialize(key.accAddress).toBase64(),
bcs
.object()
.serialize(coinMetadata(key.accAddress, 'MYCOIN'))
.toBase64(),
bcs.u64().serialize(100000000).toBase64(),
]
),
];
// sign tx
const signedTx = await wallet.createAndSignTx({ msgs });
// send(broadcast) tx
lcd.tx.broadcastSync(signedTx).then(res => console.log(res));
// {
// height: 0,
// txhash: '593827F58F3E811686EC6FFDAD2E27E91DA707965F0FF33093DC071D47A46786',
// raw_log: '[]'
// }
}
mintCoin();
function coinMetadata(creator: string, symbol: string): string {
const OBJECT_FROM_SEED_ADDRESS_SCHEME = 0xfe;
const addrBytes = bcs.address().serialize(creator).toBytes();
const seed = Buffer.from(symbol, 'ascii');
const bytes = [...addrBytes, ...seed, OBJECT_FROM_SEED_ADDRESS_SCHEME];
const hash = crypto.createHash('SHA3-256');
const digest = hash.update(Buffer.from(bytes)).digest();
return digest.toString('hex');
}
After minting, you can check the balances to verify the minting process. You can refer to this section for checking balances.
Last updated