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

How to transfer (using Program instructions) custom SPL token from my own account to another user's wallet?

这是我的情况:

  1. 我已经创建了一个钱包

    新的 solana-keygen

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

    spl-token 创建令牌

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

    spl-token 创建账户

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

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

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

请告诉我该怎么做。非常感谢。

要在程序中转移 SPL 代币,最好的选择是让钱包 A 拥有一个 program-derived 地址,然后您的程序可以根据它想要的任何逻辑从钱包 A 转移代币。

所以首先,将所有权转移到您的 program-derived 地址:

spl-token authorize <WALLET_2_ADDRESS> owner <PROGRAM_DERIVED_ADDRESS>

然后在你的程序中,你可以用这样的方式转移给爱丽丝:

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",]
    ]
)?;

这改编自在程序中转移 SPL 代币的完整示例:https://solanacookbook.com/references/programs.html#how-to-do-cross-program-invocation

有关 program-derived 地址的更多信息 https://solanacookbook.com/references/programs.html#how-to-create-a-pda,以及如何创建帐户的示例。