如何在Serum Anchor中签名通证交易?跨程序调用未授权报错如何解决
报错根因与修复方案
1. 核心错误:收款账户未标记可写权限
你定义的Interaction账户结构体中,收款账户to没有添加mut可写标记。SPL Token转账操作需要同时修改付款方、收款方两个Token账户的余额,二者都需要声明可写权限,你仅为付款账户from添加了mut标记,导致跨程序调用SPL Token程序时,因收款账户无写入权限触发该报错。
修复后的账户结构体代码如下:
#[derive(Accounts)] pub struct Interaction<'info> { #[account(mut, has_one = owner)] from: CpiAccount<'info, TokenAccount>, // 新增mut标记,同时把检查逻辑放到constraint中符合Anchor规范 #[account(mut, constraint = from.mint == to.mint)] to: CpiAccount<'info, TokenAccount>, #[account(signer)] owner: AccountInfo<'info>, token_program: AccountInfo<'info>, }
2. 可选校验项
如果修改后仍报错,可逐一检查以下配置:
- 确认
god账户(付款Token账户)的owner字段与你传入的program.provider.wallet.publicKey完全一致,保证has_one = owner校验通过 - 确认你传入的
TOKEN_PROGRAM_ID为官方SPL Token程序地址TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,不要填错程序ID - 确认转账金额
INTERACTION_FEE没有超过god账户的可用余额
内容的提问来源于stack exchange,提问作者harkl
相关产品推荐
相关产品推荐

