Skip to content

Commit

Permalink
Add heap tests (#2)
Browse files Browse the repository at this point in the history
* add heap size tests

* add instructions
  • Loading branch information
makarychev authored Jul 16, 2024
1 parent 7693a3b commit c474782
Show file tree
Hide file tree
Showing 9 changed files with 565 additions and 9 deletions.
4 changes: 4 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions programs/transfer-extensions/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,7 @@ idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"]
[dependencies]
anchor-lang = "0.30.1"
anchor-spl = { version = "0.30.1" }
solana-program = "1.18.15"
spl-transfer-hook-interface = { version = "0.6.3" }
spl-tlv-account-resolution ={ version = "0.6.3" }
spl-type-length-value = { version = "0.4.3" }
3 changes: 3 additions & 0 deletions programs/transfer-extensions/src/instructions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,6 @@ pub use initialize_mint_counter_out::*;

pub mod multi_transfers;
pub use multi_transfers::*;

pub mod multi_transfers_heap;
pub use multi_transfers_heap::*;
15 changes: 8 additions & 7 deletions programs/transfer-extensions/src/instructions/multi_transfers.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use anchor_lang::prelude::*;
use anchor_spl::token_2022::spl_token_2022::onchain::invoke_transfer_checked;
// use anchor_spl::token_2022::spl_token_2022::onchain::invoke_transfer_checked;
use anchor_spl::token_interface::{Mint, Token2022, TokenAccount};

use crate::errors::TransferExtensionsError;
use crate::{errors::TransferExtensionsError, sol_sdk::invoke_transfer_checked};

#[derive(Accounts)]
pub struct MultiTransfers<'info> {
Expand All @@ -11,24 +11,24 @@ pub struct MultiTransfers<'info> {
associated_token::mint = mint,
associated_token::authority = signer,
)]
source_account: Box<InterfaceAccount<'info, TokenAccount>>,
pub source_account: Box<InterfaceAccount<'info, TokenAccount>>,
#[account(mut,
token::mint = mint,
token::token_program = token_program,
)]
destination_account_1: Box<InterfaceAccount<'info, TokenAccount>>,
pub destination_account_1: Box<InterfaceAccount<'info, TokenAccount>>,
#[account(mut,
token::mint = mint,
token::token_program = token_program,
)]
destination_account_2: Box<InterfaceAccount<'info, TokenAccount>>,
pub destination_account_2: Box<InterfaceAccount<'info, TokenAccount>>,
#[account(
token::token_program = token_program,
)]
mint: Box<InterfaceAccount<'info, Mint>>,
pub mint: Box<InterfaceAccount<'info, Mint>>,

#[account(mut)]
signer: Signer<'info>,
pub signer: Signer<'info>,

#[account(
constraint = token_program.key() == anchor_spl::token_interface::spl_token_2022::id(),
Expand All @@ -52,6 +52,7 @@ pub fn multi_transfers<'info>(

let split_at_pos = ctx.remaining_accounts.len() / 2;
msg!("Invoke transfer 1");
msg!("Source balance: {}", ctx.accounts.source_account.amount);
invoke_transfer_checked(
ctx.accounts.token_program.key,
ctx.accounts.source_account.to_account_info().clone(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
use anchor_lang::prelude::*;
// use anchor_spl::token_2022::spl_token_2022::onchain::invoke_transfer_checked;

use crate::{errors::TransferExtensionsError, sol_sdk::invoke_transfer_checked, MultiTransfers};

pub fn multi_transfers_heap<'info>(
ctx: Context<'_, '_, '_, 'info, MultiTransfers<'info>>,
amount1: u64,
amount2: u64,
) -> Result<()> {
msg!("Multi transfers");
require!(
amount1 > 0 && amount2 > 0,
TransferExtensionsError::AmountMustBeGreaterThanZero
);

let mint = &ctx.accounts.mint;
let decimals = mint.decimals;

msg!("Invoke transfer 1");
msg!("Source balance: {}", ctx.accounts.source_account.amount);
invoke_transfer_checked(
ctx.accounts.token_program.key,
ctx.accounts.source_account.to_account_info().clone(),
mint.to_account_info().clone(),
ctx.accounts.destination_account_1.to_account_info().clone(),
ctx.accounts.signer.to_account_info().clone(),
&ctx.remaining_accounts,
amount1,
decimals,
&[],
)?;

msg!("Invoke transfer 2");
let mut heap_data: Box<[u8; 13_859]> = Box::new([0; 13_859]); // 13_859 - OK; 13_869 - FAILED
heap_data[0] = 1;
heap_data[10333] = 3;

Ok(())
}
9 changes: 9 additions & 0 deletions programs/transfer-extensions/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use instructions::*;
pub mod states;
pub mod seeds;
pub mod errors;
pub mod sol_sdk;

declare_id!("4MNxsMM7niQkurWFyDvzhVbD3wHQFyAhnGjrvuYPi6Zu");

Expand Down Expand Up @@ -48,6 +49,14 @@ pub mod transfer_extensions {
) -> Result<()> {
instructions::multi_transfers(ctx, amount1, amount2)
}

pub fn multi_transfers_heap<'info>(
ctx: Context<'_, '_, '_, 'info, MultiTransfers<'info>>,
amount1: u64,
amount2: u64,
) -> Result<()> {
instructions::multi_transfers_heap(ctx, amount1, amount2)
}
}


Loading

0 comments on commit c474782

Please sign in to comment.