1

我正在写一个简单的合同,从一个普通支票保险库中的 2 个账户转移代币。我以cashiers-check基本示例为基础并使用它。

    // Create check
    #[access_control(CreateCheck::accounts(&ctx, nonce))]
    pub fn create_check(ctx: Context<CreateCheck>, amount: u64, nonce: u8) -> Result<()> {
        // Transfer funds to the check.
        let cpi_accounts = Transfer {
            from: ctx.accounts.from.to_account_info().clone(),
            to: ctx.accounts.vault.to_account_info().clone(),
            authority: ctx.accounts.owner.clone(),
        };
        let cpi_program = ctx.accounts.token_program.clone();
        let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts);
        token::transfer(cpi_ctx, amount)?;
        // Print the check.
        let check = &mut ctx.accounts.check;
        check.amount = amount;
        check.from = *ctx.accounts.from.to_account_info().key;
        check.vault = *ctx.accounts.vault.to_account_info().key;
        check.nonce = nonce;
        Ok(())
    }

这是从第二个帐户收取

    pub fn second_send(ctx: Context<SecondSend>) -> Result<()> {
        let seeds = &[
            ctx.accounts.check.to_account_info().key.as_ref(),
            &[ctx.accounts.check.nonce],
        ];
        let signer = &[&seeds[..]];
        let cpi_accounts = Transfer {
            from: ctx.accounts.from.to_account_info().clone(),
            to: ctx.accounts.vault.to_account_info().clone(),
            authority: ctx.accounts.check_signer.clone(),
        };
        let cpi_program = ctx.accounts.token_program.clone();
        let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, signer);
        token::transfer(cpi_ctx, ctx.accounts.check.amount)?;
        // Burn the check for one time use.
        ctx.accounts.check.burned = true;
        Ok(())
    }

结构:

#[derive(Accounts)]
pub struct SecondSend<'info> {
    #[account(mut, has_one = vault)]
    check: ProgramAccount<'info, Check>,
    #[account(mut)]
    vault: AccountInfo<'info>,

    check_signer: AccountInfo<'info>,

    #[account(mut, has_one = owner)]
    from: CpiAccount<'info, TokenAccount>,
    #[account(signer)]
    owner: AccountInfo<'info>,
    token_program: AccountInfo<'info>,
}

这是我写的测试:

  it("Sends token from satan", async () => {
    await program.rpc.secondSend({
      accounts: {
        check: check.publicKey,
        vault: vault.publicKey,
        checkSigner: checkSigner,
        from: satan,
        owner: program.provider.wallet.publicKey,
        tokenProgram: TOKEN_PROGRAM_ID,
      },
    });
  });

无论我做什么,我都会收到此错误: Error: failed to send transaction: Transaction simulation failed: Error processing Instruction 0: custom program error: 0x3

我做错了什么?

4

1 回答 1

0

我认为您错过了查看此处提到的错误上方的程序日志。尝试向上滚动,应该有某些日志。

这应该提供更多的上下文,但如果你仍然卡住,你可以在这里更新你的问题:D

于 2021-12-24T04:17:56.153 回答