I have the following MRE, where I create two PDAs and realloc them "in opposite directions" i.e. I make one account 1 byte larger and the other 1 byte smaller. Calling this, yields sum of account balances before and after instruction do not match.
. Only reallocing one account in either direction makes this error go away. Reallocing both accounts in the same direction i.e. making both bigger/smaller also makes the error go away. What am I doing wrong here? I'm using anchor v0.30.1.
MRE Program code:
use anchor_lang::prelude::*;
declare_id!("8owLmone5oQWwAZPKeYEmMciBg8Q533UcHBjcU6niV9E");
#[program]
pub mod realloc_demo {
use super::*;
pub fn init(_ctx: Context<Initialize>) -> Result<()> {
Ok(())
}
pub fn demo(_ctx: Context<Demo>) -> Result<()> {
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(mut)]
pub signer: Signer<'info>,
#[account(
init,
payer = signer,
seeds = [b"Acc1"],
space = 9,
bump
)]
pub acc1: Account<'info, DemoAcc>,
#[account(
init,
payer = signer,
seeds = [b"Acc2"],
space = 9,
bump
)]
pub acc2: Account<'info, DemoAcc>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct Demo<'info> {
#[account(mut)]
pub signer: Signer<'info>,
#[account(
mut,
realloc = 8,
realloc::payer = signer,
realloc::zero = false,
seeds = [b"Acc1"],
bump
)]
pub acc1: Account<'info, DemoAcc>,
#[account(
mut,
realloc = 10,
realloc::payer = signer,
realloc::zero = false,
seeds = [b"Acc2"],
bump
)]
pub acc2: Account<'info, DemoAcc>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct DemoAcc {}
MRE client typescript test code:
import * as anchor from "@coral-xyz/anchor";
import { Program } from "@coral-xyz/anchor";
import { ReallocDemo } from "../target/types/realloc_demo";
describe("example", () => {
const provider = anchor.AnchorProvider.env();
anchor.setProvider(provider);
const program = anchor.workspace.ReallocDemo as Program<ReallocDemo>;
it("Init", async () => {
const transactionSignature = await program.methods.init().rpc();
console.log("Your transaction signature", transactionSignature);
});
it("Realloc (fails)", async () => {
const sig = await program.methods.demo().rpc();
console.log("Your transaction signature", sig);
});
});