如何将自定义 SPL 代币从我自己的帐户转移(使用程序指令)到另一个用户的钱包?

Vin*_*nce 6 solana solana-cli solana-program-library solana-web3js solana-transaction-instruction

这是我的情况:

  1. 我创建了一个钱包

    solana-注册机 新

  2. 我创建了自己的自定义 SPL 令牌

    spl 令牌创建令牌

  3. 然后我为此 SPL 令牌创建了一个帐户

    spl 令牌创建帐户

  4. SPL 代币现在在我的钱包 A 中

在 Solana 计划中,当满足某些条件时(例如,当 Alice 正确回答测验时,她将获得一些自定义 SPL 代币),我希望以编程方式将自定义 SPL 代币从钱包 A 转移到 Alice(用户)钱包。

如何授权 Solana 程序从我创建的钱包 A 中扣除代币并将代币转移到 Alice 钱包?

请告诉我如何去做这件事。真的很感激这一点。

Jon*_*n C 4

要在程序内转移 SPL 代币,最好的选择是让钱包 A 由程序派生地址拥有,然后您的程序可以根据它想要的任何逻辑从钱包 A 转移代币。

因此,首先,将所有权转移到您的程序派生地址:

spl-token authorize <WALLET_2_ADDRESS> owner <PROGRAM_DERIVED_ADDRESS>
Run Code Online (Sandbox Code Playgroud)

然后在您的程序中,您可以使用以下内容转移给 Alice:

let transfer_instruction = spl_token::instruction::transfer(
    &token_program.key,
    &wallet_a_token_account.key,
    &alice_token_account.key,
    &program_derived_account.key,
    &[],
    transfer_amount,
)?;

let required_accounts_for_transfer = [
    wallet_a_token_account.clone(),
    alice_token_account.clone(),
    program_derived_account.clone(),
];

invoke_signed(
    &transfer_instruction,
    &required_accounts_for_transfer,
    &[
        &[b"your", b"seeds", b"here",]
    ]
)?;
Run Code Online (Sandbox Code Playgroud)

这是根据在程序中传输 SPL 令牌的完整示例改编的:https ://solanacookbook.com/references/programs.html#how-to-do-cross-program-inplication

有关程序派生地址的更多信息,请访问https://solanacookbook.com/references/programs.html#how-to-create-a-pda,并提供如何创建帐户的示例。