Solana实战Bug记录

Solana实战Bug记录

Cross-program invocation with unauthorized signer or writable account

问题 解决方案
PDA 派生路径不一致 统一 seedssigner_seeds
Mint Authority 未授权 在 CPI 中使用 signer_seeds 显式授权
Metadata 账户约束错误 显式指定 Token Metadata Program 地址
Mint Authority 设置错误 确保 mint::authority 指向 PDA 并通过签名授权
let signer_seeds: &[&[&[u8]]] = &[&[
        EtfToken::SEEDS_PREFIX.as_bytes(),
        m.as_ref(),
        &[ctx.bumps.etf_token_info],
    ]];
// 	需要和创建账户的时候设置的约束一致
-----
 #[account(
        init_if_needed,
        payer = authority,
        space = 8 + EtfToken::INIT_SPACE,
        seeds = [
            EtfToken::SEEDS_PREFIX.as_bytes(),
            etf_token_mint_account.key().as_ref()
        ],
        bump,
    )]
    pub etf_token_info: Account<'info, EtfToken>,

TypeError: anchor.BN is not a constructor

可参考:

https://solana.stackexchange.com/questions/22096/typeerror-anchor-bn-is-not-a-constructor-due-to-tsconfig-json

最终是手动导入

import { BN } from "bn.js";