跳到主要内容

token

SPL Token

SPL Token 是 Solana 上的代币标准(与以太坊的 ERC-20 类似)。常见概念:

  • Mint(铸币合约账户):记录总供给、精度(decimals)、铸造权限(mint authority)等。
  • Token Account(代币账户):持有人某个 mint 的余额账户。
  • Associated Token Account(ATA):钱包与某个 mint 的“推荐地址”,是一个唯一 PDA。

关联代币账户(ATA)

  • 唯一性:由(owner、Token Program Id、mint)决定
  • 由 ATA 程序创建并初始化为该 mint 的代币账户
  • 不同 Token Program(经典版、2022)需使用对应的常量
import { getAssociatedTokenAddress, createAssociatedTokenAccountInstruction, getMint, TOKEN_PROGRAM_ID } from '@solana/spl-token'
import { PublicKey, SystemProgram } from '@solana/web3.js'

const owner = new PublicKey('...')
const mint = new PublicKey('...')
const ata = await getAssociatedTokenAddress(mint, owner)

// 创建 ATA(若不存在)
const createAtaIx = createAssociatedTokenAccountInstruction(
/* payer */ owner,
/* ata */ ata,
/* owner */ owner,
/* mint */ mint,
)

转账与铸币

import { createTransferInstruction, createMintToInstruction } from '@solana/spl-token'

// 从 fromATA 转至 toATA(同一 mint)
const transferIx = createTransferInstruction(fromATA, toATA, owner, 1_000n /* amount in base units */)

// 铸币(需要 mint authority)
const mintToIx = createMintToInstruction(mint, recipientATA, mintAuthority, 100_000n)

注意:amount 单位是“最小单位”,展示时需按 decimals 缩放。

Token-2022

增强版 SPL Token(可选的转账费、冻结、利息等扩展)。使用 Token-2022 的程序常量与 API 与经典版不同,注意区分:

  • Token-2022 Program Id 与 ATA Program Id 均不同于经典版
  • 查询时可通过 getMint() 判定是否为 2022 扩展 mint

常见错误与排查

  • ATA 与 Token Program 不匹配(经典版 vs 2022)
  • 忘记创建 ATA 或初始化 → 余额查询/转账失败
  • 忘记按 decimals 换算金额 → 展示/汇总错误
  • 权限(mint authority、freeze authority)不正确 → 铸币/冻结失败