如何使用@solana-labs/web3.js实现USDC-SPL代币转账
SPL-USDC 转账实现方案
USDC属于标准SPL代币,转账逻辑和通用SPL代币完全一致,仅需使用Solana官方公布的USDC固定铸币地址即可适配,无需额外定制逻辑。
前置依赖
需要先安装SPL代币专用SDK:npm install @solana/spl-token
完整实现代码
import { getAssociatedTokenAddress, createTransferCheckedInstruction, getOrCreateAssociatedTokenAccount } from "@solana/spl-token"; import { Connection, Transaction, PublicKey } from "@solana/web3.js"; // 核心配置 const USDC_MINT = new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'); // 主网USDC铸币地址 // 测试网USDC铸币地址替换为:4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU const USDC_DECIMALS = 6; // USDC精度固定为6位 // ....... const connection = new Connection(network); const transaction = new Transaction(); // 1. 获取发送方USDC关联账户(ATA) const fromAta = await getAssociatedTokenAddress( USDC_MINT, publicKey // 发送方钱包公钥 ); // 2. 获取/创建接收方USDC关联账户 const toPubkey = new PublicKey(to); // 接收方钱包公钥 const toAta = await getOrCreateAssociatedTokenAccount( connection, publicKey, // 支付创建账户费用的地址,这里用付款人钱包 USDC_MINT, toPubkey ); // 3. 添加USDC转账指令 transaction.add( createTransferCheckedInstruction( fromAta, // 发送方ATA USDC_MINT, // USDC铸币地址 toAta.address, // 接收方ATA publicKey, // 发送方公钥(转账权限所有者) Number(amount) * (10 ** USDC_DECIMALS), // 转账金额要乘以6位精度,不是SOL的9位 USDC_DECIMALS ) ); // 后续区块哈希、签名逻辑和你原有SOL转账的逻辑完全一致 const { blockhash } = await connection.getRecentBlockhash(); transaction.recentBlockhash = blockhash; transaction.feePayer = publicKey; let signedTransaction = null; if ("solana" in window) { signedTransaction = await window.solana.signTransaction(transaction) } else if ("solflare" in window) { signedTransaction = await window.solflare.signTransaction(transaction); } // .......
注意事项
- 必须匹配对应网络的USDC铸币地址,主网和测试网地址不同,填错会转账到错误代币
- USDC精度为6,计算最小单位时不要误用SOL的9位精度,否则金额会差1000倍
- 若接收方从未持有过对应网络的USDC,
getOrCreateAssociatedTokenAccount会自动在交易中添加创建ATA的指令,创建费用由付款方承担,约0.002 SOL - 转账前可先调用
connection.getTokenAccountBalance(fromAta)校验发送方USDC余额是否充足,避免交易失败
内容的提问来源于stack exchange,提问作者zandtifing
相关产品推荐
相关产品推荐

