0

我对此进行了谷歌搜索,只找到了如何通过命令行发送令牌:

https://spl.solana.com/token

但我需要在 Rust 程序中/从 Rust 程序中质押/撤回 Native SOL,而不是代币。

我还发现了有关 Rust 原生令牌的信息:

https://docs.rs/solana-program/1.7.10/solana_program/native_token/index.html

https://docs.rs/solana-program/1.7.10/solana_program/native_token/struct.Sol.html

看来我必须声明这个 Sol 结构

pub struct Sol(pub u64);

然后使用它的“发送”特性发送它......对吗?有人可以通过 Rust 程序解释如何做到这一点吗?

4

1 回答 1

1

您可以通过 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,
  }),
);

所以本质上它在这里所做的是

  1. 创建一个随机帐户,您可以在其中存入一些 SOL 并存入所需金额加上租金金额(因此 parsedQuantity + 2.04e6)
  2. 使用令牌程序将帐户初始化为 WRAPPED_SOL_ACCOUNT
  3. 传输打包的 SOL(或者在您的情况下,您可能只想调用程序并将打包的 SOL 帐户作为参数)
  4. 关闭 Wrapped SOL 帐户,以便用户取回租金
于 2021-08-17T14:24:09.257 回答