Solana 如何将原生 SOL 抵押到 Rust 程序并从程序中提取 SOL?

Solana how to stake native SOL to a Rust program and withdraw SOL from a program?

我用谷歌搜索了这个,只找到了如何通过命令行发送令牌:

https://spl.solana.com/token

但我需要 stake/withdraw 原生 SOL,而不是令牌,into/from Rust 程序。

我还发现了有关 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 程序做到这一点吗?

您可以通过SPL Token程序将Sol包装成一个wrapped 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 帐户,以便用户取回租金