Appearance
包装 SOL
作者 崔棉大师 X:@MasterCui Youtube: 崔棉大师
知识点
Token 程序可用于包装 SOL。这样做允许 SOL 像任何其他 Token 程序令牌类型一样被处理,并且在与 Token 程序接口交互的其他程序调用时非常有用。
包含包装的 SOL 的账户使用公钥与称为“Native Mint”的特定 Mint 相关联 So11111111111111111111111111111111111111112。
课程
1.创建关联 Token 账户(ATA 账户)
创建 ATA 账户用于保存 wrapped SOL
js
// 获取或者创建ATA
const tokenAccount = await getOrCreateAssociatedTokenAccount(
connection, // 链接
payer, // 支付账户Keypair
mint, // mint账户公钥
owner, // ATA账户的所有者
allowOwnerOffCurve, // 允许所有者帐户成为 PDA(程序派生地址)
commitment, // 查询状态所需的承诺级别
confirmOptions, // 确认交易的选项
programId, // SPL Token 计划账户
associatedTokenProgramId // 关联Token程序账户
);
2.创建 SyncNative 指令
js
const ix = createSyncNativeInstruction(
account, // 用于同步 lampport 的本地帐户
programId // SPL Token 程序账户
);
3.打包多个指令到一笔交易
js
// 向此交易添加一个或多个指令
const tx = new Transaction().add(...items);
4.发送并确认交易
js
// 签名,发送并且确认交易
const sig = await sendAndConfirmTransaction(
connection, // 链接
transaction, // 交易
signers // 签名人
);
5.包装 SOL
js
// 创建Ata账户用来保存你的wrapped SOL
const associatedTokenAccount = await Ata(
connection,
payer,
NATIVE_MINT,
payer.publicKey
);
// 将 SOL 转移到关联的代币账户并使用 SyncNative 更新wrapped SOL 余额
const solTransferTransaction = AddTransaction(
// 第一个交易,发送sol
await Transfer(connection, payer, associatedTokenAccount, LAMPORTS_PER_SOL),
// 第二个交易,创建SyncNative指令
CreateSyncNativeIx(associatedTokenAccount)
);
// 发送和确认交易
await SendAndConfirmTx(connection, solTransferTransaction, [payer]);
6.关闭账户
js
// 关闭账户
await closeAccount(
connection, // 链接
payer, // 支付账户
account, // 账户地址
destination, // 接收已关闭账户剩余余额的账户
authority // 有权关闭账户的权限
);
7.解包装 SOL
js
// 查找用来保存你的wrapped SOL的Ata账户
const associatedTokenAccount = await Ata(
connection,
payer,
NATIVE_MINT,
payer.publicKey
);
// 关闭账户,回收SOL
await CloseAccount(
connection,
payer,
associatedTokenAccount,
payer.publicKey,
payer
);
8.计算交易成本
通过 Transaction 计算
js
// 计算交易费
const fees = await solTransferTransaction.getEstimatedFee(connection);
console.log(`Estimated SOL transfer cost: ${fees} lamports`);