Невозможно подписать транзакцию на КПК в Солане с помощью привязки

Я работаю над изучением полного стека Solana с помощью Anchor. Я столкнулся с проблемой при подписании транзакции, отправляющей Сола на КПК, принадлежащий программе, которую я делаю. Я не могу вызвать rpc для функции с правильными подписями. Ниже мой код:

      await program.rpc.payPool(pool.data.name, new BN(payment), {
      accounts: {
        pool: pool.publicKey,
        poolOwner: owner.key.PublicKey, 
        user: adder.key.publicKey,
        systemProgram: SystemProgram.programId,
      },
      signers: [
        adder.key,
        // I need to put another signature here I think
      ],
    });

Ошибка, которую я получаю, связана с проблемой изменения транзакции.

       Error: Invalid arguments: poolOwner not provided.
      at ~/learnsolana/node_modules/@project-serum/anchor/dist/cjs/program/common.js:39:23
      at Array.forEach (<anonymous>)
      at validateAccounts (node_modules/@project-serum/anchor/dist/cjs/program/common.js:33:16)
      at ix (node_modules/@project-serum/anchor/dist/cjs/program/namespace/instruction.js:34:46)
      at txFn (node_modules/@project-serum/anchor/dist/cjs/program/namespace/transaction.js:16:20)
      at Object.rpc [as payPool] (node_modules/@project-serum/anchor/dist/cjs/program/namespace/rpc.js:28:24)
      at payPool (tests/learnsolana.js:70:23)
      at Context.<anonymous> (tests/learnsolana.js:117:28)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)

Соответствующая информация из программы Solana:

      pub fn pay_pool(ctx: Context<PayPool>, _pool_name: String, payment: u64,) -> 
    ProgramResult {
        let user = &ctx.accounts.user;
        let pool = &mut ctx.accounts.pool;
        if pool.payers.len() >= pool.capacity as usize {
            return Err(PoolError::PayersFull.into());
        }
        pool.payers.push(*user.to_account_info().key);
        invoke(
            &transfer(
                user.to_account_info().key,
                pool.to_account_info().key,
                payment,
            ),
            &[
                user.to_account_info(),
                pool.to_account_info(),
                ctx.accounts.system_program.to_account_info(),
            ],
        )?;
        Ok(())
    }

#[derive(Accounts)]
#[instruction(pool_name: String, payment: u64)]
pub struct PayPool<'info>{
    #[account(mut, has_one=pool_owner @ PoolError::WrongPoolOwner, seeds=[b"pool", pool_owner.to_account_info().key.as_ref(), name_seed(&pool_name)], bump=pool.bump)]
    pub pool: Account<'info, Pool>,
    pub pool_owner: AccountInfo<'info>,
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
}

#[account]
pub struct Pool {
    pub pool_owner: Pubkey,
    pub bump: u8,
    pub capacity: u16,
    pub name: String,
    pub payers: Vec<Pubkey>,
}

Любая помощь приветствуется. Спасибо.

1 ответ

poolOwner: owner.key.PublicKey-> poolOwner: owner.key.publicKey

Вам просто нужно сделать строчную букву «P» в publicKey. Вам также не нужно предоставлять signersparam as anchor сгенерирует это автоматически.

Другие вопросы по тегам