1

我正在创建一个 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,
)?; 

提前致谢!

4

2 回答 2

3

要使用 Anchor 发送本机 SOL,您可以在指令中使用以下代码:

    let ix = anchor_lang::solana_program::system_instruction::transfer(
        &ctx.accounts.from.key(),
        &ctx.accounts.to.key(),
        amount,
    );
    anchor_lang::solana_program::program::invoke(
        &ix,
        &[
            ctx.accounts.from.to_account_info(),
            ctx.accounts.to.to_account_info(),
        ],
    );

其中,amount 是代表Lampports (0.000000001 SOL) 的数字 (u64)。

您可以查看Solana 程序文档和发送 SOL的Solana Cookbook部分中的传输函数。

于 2022-01-04T04:55:17.540 回答
0

对于本机 SOL,您必须做一些不同的事情,system_instruction::transfer使用系统程序而不是 SPL 令牌程序调用。

Anchor 中没有方便的包装器(我可以找到),所以这里有一个没有 Anchor 的示例:https ://github.com/solana-labs/solana-program-library/blob/78cb32435296eb258ec3de76ee4ee2d391f397ee/associated-令牌帐户/程序/src/tools/account.rs#L29

于 2021-12-31T04:41:32.063 回答