您可以通过 SPL Token 程序将 Sol 包装成一个包装好的 sol Token。从那里您可以像使用任何 SPL 令牌一样使用 Wrapped SOL。这是一个很好的例子
https://github.com/project-serum/serum-dex-ui/blob/5b4487634e3738c57ace6da1377704e95f53c588/src/pages/pools/PoolPage/PoolAdminPanel.tsx#L250-L272
const wrappedSolAccount = new Account();
transaction.add(
SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
lamports: parsedQuantity + 2.04e6,
newAccountPubkey: wrappedSolAccount.publicKey,
programId: TokenInstructions.TOKEN_PROGRAM_ID,
space: 165,
}),
TokenInstructions.initializeAccount({
account: wrappedSolAccount.publicKey,
mint: TokenInstructions.WRAPPED_SOL_MINT,
owner: wallet.publicKey,
}),
TokenInstructions.transfer({
source: wrappedSolAccount.publicKey,
destination: vaultAddress,
amount: parsedQuantity,
owner: wallet.publicKey,
}),
TokenInstructions.closeAccount({
source: wrappedSolAccount.publicKey,
destination: walletTokenAccount.pubkey,
owner: wallet.publicKey,
}),
);
所以本质上它在这里所做的是
- 创建一个随机帐户,您可以在其中存入一些 SOL 并存入所需金额加上租金金额(因此 parsedQuantity + 2.04e6)
- 使用令牌程序将帐户初始化为 WRAPPED_SOL_ACCOUNT
- 传输打包的 SOL(或者在您的情况下,您可能只想调用程序并将打包的 SOL 帐户作为参数)
- 关闭 Wrapped SOL 帐户,以便用户取回租金