我正在创建一个dapp,多个用户可以将SOL存入一个活动帐户,并根据谁赢得了活动,他们可以赎回SOL回到他们的钱包。
如何在锚智能合约指令中将原生SOL(而不是任何其他spl-token)直接传输到事件账户的金库地址?
下面的锚指令是否有效?如果有效,下面的PROGRAM_ACCOUNT
应该是什么?应该是处理本机SOL的帐户,但在文档中找不到。
token::transfer(
CpiContext::new(
PROGRAM_ACCOUNT,
anchor_spl::token::Transfer {
from: source_user_info,
to: destination_user_info,
authority: source_user_info,
},
),
1,
)?;
先谢了!
5条答案
按热度按时间xam8gpfp1#
要使用锚发送本机SOL,可以在指令中使用以下代码:
其中,数量是表示Lamports(0.00000001 SOL)的数字(u64)。
您可以查看Solana程序文档中的Transfer函数和发送SOL的Solana Cookbook部分。
qcbq4gxm2#
不幸的是,到目前为止,所有的答案都是普通的索拉纳,而不是锚。
锚已经提供了额外的便利,使转账更容易。您在问题中的代码是正确的:
这是假设此帐户结构:
当然,如果您使用的是
Account<>
Package 器,只需将clone()
替换为to_account_info()
即可。dba5bblo3#
对于本机SOL,您必须做一些不同的事情,用系统程序调用
system_instruction::transfer
,而不是SPL令牌程序。锚中没有方便的 Package 器(我能找到),所以这里有一个不使用Anchor的例子:https://github.com/solana-labs/solana-program-library/blob/78cb32435296eb258ec3de76ee4ee2d391f397ee/associated-token-account/program/src/tools/account.rs#L29
oewdyzsn4#
你必须做这样的事
此外,确保将system_program传递给您的程序。
希望这个有用。
wj8zmpe15#
发送带锚的本地SOL
参考
https://solanacookbook.com/references/programs.html#how-to-transfer-sol-in-a-program