【问题标题】:Anchor: Solana Account Initialization Issue锚点:Solana 帐户初始化问题
【发布时间】:2022-07-31 14:18:06
【问题描述】:

我正在为 solana 使用血清锚定框架。我正在尝试使用#[account] 属性宏初始化新帐户。
每次我运行锚构建时,都会出现以下错误。

Error("the payer specified for an init constraint must be mutable.")

thread 'main' panicked at 'Code not parseable: Error("the payer specified for an init constraint must be mutable.")', lang/syn/src/idl/file.rs:360:58 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

下面是代码 sn-p,我正在这里尝试帐户初始化

#[derive(Accounts)]
#[instruction(pool_nonce: u8, vault_nonce: u8)]
pub struct InitializePool<'info> {
    /// CHECK: This is not dangerous because we don't read or write from this account
    authority: UncheckedAccount<'info>,

    #[account(
        mut,
        // constraint = lp_token_pool_vault.mint == LP_TOKEN_MINT_PUBKEY.parse::<Pubkey>().unwrap(),
        constraint = lp_token_pool_vault.owner == pool_signer.key(),
    )]
    lp_token_pool_vault: Box<Account<'info, TokenAccount>>,
    #[account(
        mut,
        // constraint = lp_token_depositor.mint == LP_TOKEN_MINT_PUBKEY.parse::<Pubkey>().unwrap()
    )]
    lp_token_depositor: Box<Account<'info, TokenAccount>>,
    lp_token_deposit_authority: Signer<'info>,

    reward_mint: Box<Account<'info, Mint>>,
    #[account(
        constraint = reward_vault.mint == reward_mint.key(),
        constraint = reward_vault.owner == pool_signer.key(),
        constraint = reward_vault.close_authority == COption::None,
    )]
    reward_vault: Box<Account<'info, TokenAccount>>,

    #[account(
        seeds = [
            pool.to_account_info().key.as_ref()
        ],
        bump,
    )]
    /// CHECK: This is not dangerous because we don't read or write from this account
    pool_signer: UncheckedAccount<'info>,

    #[account(
        zero,
    )]
    pool: Box<Account<'info, Pool>>,
    #[account(
        init,
        payer = owner,
        seeds = [
            owner.key.as_ref(), 
            pool.to_account_info().key.as_ref()
        ],
        bump,
        space = 10240,
    )]
    vault: Box<Account<'info, Vault>>,
    owner: Signer<'info>,
    
    token_program: Program<'info, Token>,
    system_program: Program<'info, System>,
}

【问题讨论】:

    标签: rust anchor solana


    【解决方案1】:

    在初始化新帐户时,您需要支付费用和租金,并指定付款人

    #[account(
        init,
        payer = owner,
        seeds = [
            owner.key.as_ref(), 
            pool.to_account_info().key.as_ref()
        ],
        bump,
        space = 10240,
    )]
    vault: Box<Account<'info, Vault>>,
    

    为了修改付款人帐户,它必须是可变的。
    我们将其指定为

    #[account(mut)] // <== add this missing macro
    owner: Signer<'info>,
    

    【讨论】:

      【解决方案2】:
      #[derive(Accounts)]
      pub struct Initialize<'info> {
          #[account(init, payer = owner, space = 9000)]
          pub base_account: Account<'info, BaseAccount>,
          #[account(mut)]
          pub owner: Signer<'info>,
          pub system_program: Program<'info, System>,
      }
      

      您应该将付款人设置为上述帐户中的签名者之一

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-25
        • 2011-10-13
        • 2011-10-29
        • 2020-10-17
        • 2020-09-24
        • 2012-09-04
        • 1970-01-01
        相关资源
        最近更新 更多