Невозможно подписать транзакцию на КПК в Солане с помощью привязки
Я работаю над изучением полного стека 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. Вам также не нужно предоставлять
signers
param as anchor сгенерирует это автоматически.