Skip to content

包装 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`);