lang: Make stack frames slimmer on ATA creation (#3065)
This commit is contained in:
parent
aa26a516b3
commit
5727865b65
|
@ -21,6 +21,7 @@ The minor version will be incremented upon a breaking change and the patch versi
|
|||
- idl: Make safety comment checks fail silently when program path env is not set ([#3045](https://github.com/coral-xyz/anchor/pull/3045)).
|
||||
- idl: Avoid interference from rust tests during IDL generation ([#3058](https://github.com/coral-xyz/anchor/pull/3058)).
|
||||
- lang: Fix `align` repr support in `declare-program!` ([#3056](https://github.com/coral-xyz/anchor/pull/3056)).
|
||||
- lang: Make stack frames slimmer on ATA creation ([#3065](https://github.com/coral-xyz/anchor/pull/3065)).
|
||||
|
||||
### Breaking
|
||||
|
||||
|
|
|
@ -624,17 +624,19 @@ fn generate_constraint_init_group(
|
|||
if !#if_needed || owner_program == &anchor_lang::solana_program::system_program::ID {
|
||||
#payer_optional_check
|
||||
|
||||
let cpi_program = associated_token_program.to_account_info();
|
||||
let cpi_accounts = ::anchor_spl::associated_token::Create {
|
||||
payer: #payer.to_account_info(),
|
||||
associated_token: #field.to_account_info(),
|
||||
authority: #owner.to_account_info(),
|
||||
mint: #mint.to_account_info(),
|
||||
system_program: system_program.to_account_info(),
|
||||
token_program: #token_program.to_account_info(),
|
||||
};
|
||||
let cpi_ctx = anchor_lang::context::CpiContext::new(cpi_program, cpi_accounts);
|
||||
::anchor_spl::associated_token::create(cpi_ctx)?;
|
||||
::anchor_spl::associated_token::create(
|
||||
anchor_lang::context::CpiContext::new(
|
||||
associated_token_program.to_account_info(),
|
||||
::anchor_spl::associated_token::Create {
|
||||
payer: #payer.to_account_info(),
|
||||
associated_token: #field.to_account_info(),
|
||||
authority: #owner.to_account_info(),
|
||||
mint: #mint.to_account_info(),
|
||||
system_program: system_program.to_account_info(),
|
||||
token_program: #token_program.to_account_info(),
|
||||
}
|
||||
)
|
||||
)?;
|
||||
}
|
||||
let pa: #ty_decl = #from_account_info_unchecked;
|
||||
if #if_needed {
|
||||
|
|
|
@ -693,3 +693,54 @@ pub struct TestAssociatedTokenWithTokenProgramConstraint<'info> {
|
|||
/// CHECK: ignore
|
||||
pub associated_token_token_program: Option<AccountInfo<'info>>,
|
||||
}
|
||||
|
||||
#[derive(Accounts)]
|
||||
pub struct InitManyAssociatedTokenAccounts<'info> {
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
mint::authority = user,
|
||||
mint::decimals = 9,
|
||||
)]
|
||||
pub mint: Account<'info, Mint>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = user,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata1: Account<'info, TokenAccount>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = system_program,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata2: Account<'info, TokenAccount>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = token_program,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata3: Account<'info, TokenAccount>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = associated_token_program,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata4: Account<'info, TokenAccount>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = mint,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata5: Account<'info, TokenAccount>,
|
||||
#[account(mut)]
|
||||
pub user: Signer<'info>,
|
||||
pub system_program: Program<'info, System>,
|
||||
pub token_program: Program<'info, Token>,
|
||||
pub associated_token_program: Program<'info, AssociatedToken>,
|
||||
}
|
||||
|
|
|
@ -395,4 +395,11 @@ pub mod misc_optional {
|
|||
) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[allow(unused_variables)]
|
||||
pub fn test_init_many_associated_token_accounts(
|
||||
_ctx: Context<InitManyAssociatedTokenAccounts>,
|
||||
) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -601,6 +601,7 @@ pub struct TestOnlyTokenProgramConstraint<'info> {
|
|||
token::token_program = token_token_program
|
||||
)]
|
||||
pub token: Account<'info, TokenAccount>,
|
||||
/// CHECK: ignore
|
||||
pub token_token_program: AccountInfo<'info>,
|
||||
}
|
||||
|
||||
|
@ -751,3 +752,54 @@ pub struct TestUsedIdentifiers<'info> {
|
|||
/// CHECK: ignore
|
||||
pub test4: AccountInfo<'info>,
|
||||
}
|
||||
|
||||
#[derive(Accounts)]
|
||||
pub struct InitManyAssociatedTokenAccounts<'info> {
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
mint::authority = user,
|
||||
mint::decimals = 9,
|
||||
)]
|
||||
pub mint: Account<'info, Mint>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = user,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata1: Account<'info, TokenAccount>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = system_program,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata2: Account<'info, TokenAccount>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = token_program,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata3: Account<'info, TokenAccount>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = associated_token_program,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata4: Account<'info, TokenAccount>,
|
||||
#[account(
|
||||
init,
|
||||
payer = user,
|
||||
associated_token::authority = mint,
|
||||
associated_token::mint = mint,
|
||||
)]
|
||||
pub ata5: Account<'info, TokenAccount>,
|
||||
#[account(mut)]
|
||||
pub user: Signer<'info>,
|
||||
pub system_program: Program<'info, System>,
|
||||
pub token_program: Program<'info, Token>,
|
||||
pub associated_token_program: Program<'info, AssociatedToken>,
|
||||
}
|
||||
|
|
|
@ -385,4 +385,11 @@ pub mod misc {
|
|||
) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[allow(unused_variables)]
|
||||
pub fn test_init_many_associated_token_accounts(
|
||||
_ctx: Context<InitManyAssociatedTokenAccounts>,
|
||||
) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2451,6 +2451,15 @@ const miscTest = (
|
|||
assert.deepStrictEqual(dataAccount.data, array2d);
|
||||
});
|
||||
|
||||
it("Can initialize 5 associated token accounts in one instruction", async () => {
|
||||
const mint = anchor.web3.Keypair.generate();
|
||||
await program.methods
|
||||
.testInitManyAssociatedTokenAccounts()
|
||||
.accounts({ mint: mint.publicKey, user: provider.wallet.publicKey })
|
||||
.signers([mint])
|
||||
.rpc();
|
||||
});
|
||||
|
||||
describe("Can validate PDAs derived from other program ids", () => {
|
||||
it("With bumps using create_program_address", async () => {
|
||||
const [firstPDA, firstBump] =
|
||||
|
|
Loading…
Reference in New Issue