Appearance
创建 Token
作者 崔棉大师 X:@MasterCui Youtube: 崔棉大师
知识点
本章节将通过@solana/spl-token
依赖包创建 spl Token,在创建 spl token 之后进行铸造,销毁,转移的操作
课程
1.创建 mint 账户
不同于 Ethereum, Solana 系统中,每一个代币又叫 mint 账户,这个账户的地址是通过 Keypair 函数创建出来的,而 Ethereum 中个人地址创建的合约都是通过创建者地址和 nonce 计算出来的
js
// 随机创建密钥对用作mint账户
const mintKeypair = Keypair.generate();
// 创建mint账户
const mint = await createMint(
connection, // 链接
payer, // 支付账户
mintAuthority, // 铸造账户地址
freezeAuthority, // 冻结账户地址
decimals, // 小数点精度
mintKeypair, // 可选密钥对,默认为新的随机密钥对
undefined, // 确认交易的选项
programId // SPL Token程序账户
);
js
// 创建mint账户
const mint = await CreateMint(
connection,
payer,
payer.publicKey,
payer.publicKey,
2, // 小数点精度
"Token"
);
// 获取铸造详情
const mintInfo = await getMint(connection, mint);
console.log(mintInfo);
2.铸造 Token
在 Solana 系统中,个人账户持有 Token 必须通过关联 Token 的代币账户(ATA 账户)保存代币
js
const mintSig = await mintTo(
connection, // 网络链接
payer, // 支付账户
mint, // token地址
destination, // Ata地址
authority, // 铸造权限
amount // 数量
);
js
// Ata地址
const associatedTokenAccount = await Ata(
connection,
payer,
tokenMint,
payer.publicKey
);
// 2位精度,10000.00个
const amountOfTokensToMint = 1_000_000_000_000_000;
// 铸造方法
await MintTo(
connection,
payer,
tokenMint,
associatedTokenAccount,
payer,
amountOfTokensToMint
);
3.销毁 Token
js
// 销毁Token
const mintSig = await burn(
connection, // 网络链接
payer, // 支付账户
account, // Ata地址
mint, // token地址
owner, // 铸造权限
amount // 数量
);
js
// Ata地址
const associatedTokenAccount = await Ata(
connection,
payer,
tokenMint,
payer.publicKey
);
// 2位精度,10.00个
const amountOfTokensToBurn = 1_000;
// 销毁方法
await Burn(
connection,
payer,
associatedTokenAccount,
tokenMint,
payer,
amountOfTokensToBurn
);
4.销毁全部 Token
在销毁全部 Token 后,执行前面学过的关闭账户指令,这样可以回收租金 Sol
js
// Ata地址
const associatedTokenAccount = await Ata(
connection,
payer,
tokenMint,
payer.publicKey
);
const balance = await getAccount(connection, associatedTokenAccount);
// 销毁方法
await Burn(
connection,
payer,
associatedTokenAccount,
tokenMint,
payer,
balance.amount
);
// 关闭账户,回收SOL
await CloseAccount(
connection,
payer,
associatedTokenAccount,
payer.publicKey,
payer
);
5.查询账户下所有 Token
js
const tokenAccounts = await connection.getTokenAccountsByOwner(
payer.publicKey, // 查询的账户地址
{
programId: TOKEN_PROGRAM_ID, // Token程序id
}
);
6.发送 Token
js
// 发送Token
const signature = await transfer(
connection, // 链接
payer, // 支付账户
source, // 发送源的ATA账户地址
destination, // 接收账户的ATA地址
owner, // Token的拥有者地址
amount // 发送数量
);
js
// 随机计算接收地址
const toKeypair = Keypair.generate();
// 获取或创建From ATA
const fromTokenAccount = await Ata(
connection,
payer,
tokenMint,
payer.publicKey
);
// 获取或创建To ATA
const toTokenAccount = await Ata(
connection,
payer,
tokenMint,
toKeypair.publicKey
);
// 发送Token
await TransferToken(
connection,
payer,
fromTokenAccount,
toTokenAccount,
payer.publicKey,
10
);