Solana 如何将原生 SOL 抵押到 Rust 程序并从程序中提取 SOL?
Solana how to stake native SOL to a Rust program and withdraw SOL from a program?
我用谷歌搜索了这个,只找到了如何通过命令行发送令牌:
但我需要 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。这是一个很好的例子
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 帐户,以便用户取回租金
我用谷歌搜索了这个,只找到了如何通过命令行发送令牌:
但我需要 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。这是一个很好的例子
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 帐户,以便用户取回租金