Skip to content

创建 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
);