Skip to content

Commit

Permalink
feat: add decimal fuzzing through manual randomness
Browse files Browse the repository at this point in the history
  • Loading branch information
jsonDoge committed Jan 13, 2025
1 parent 5af2269 commit 9e8f18c
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 10 deletions.
1 change: 1 addition & 0 deletions anchor/Cargo.lock

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

1 change: 1 addition & 0 deletions anchor/trident-tests/fuzz_tests/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ arbitrary = "1.3.0"
assert_matches = "1.4.0"
mpl-token-metadata = "4.1.2"
anchor-spl = "0.30.1"
rand = "0.8"

[dependencies.trident-client]
version = "0.8.1"
Expand Down
17 changes: 11 additions & 6 deletions anchor/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use trident_client::fuzzing::*;
use crate::utils::{get_token_x_decimals, get_token_y_decimals};

/// FuzzInstruction contains all available Instructions.
/// Below, the instruction arguments (accounts and data) are defined.
Expand Down Expand Up @@ -101,6 +102,7 @@ pub struct InitializePoolAccounts {
/// For more details, see: https://ackee.xyz/trident/docs/latest/features/fuzz-instructions/#custom-data-types
#[derive(Arbitrary, Debug)]
pub struct InitializePoolData {}

#[derive(Arbitrary, Debug)]
pub struct RemoveLiquidity {
pub accounts: RemoveLiquidityAccounts,
Expand Down Expand Up @@ -159,6 +161,9 @@ pub struct UpgradePoolAccounts {
#[derive(Arbitrary, Debug)]
pub struct UpgradePoolData {}




// ADD LIQUIDITY

///IxOps implementation for `AddLiquidity` with all required functions.
Expand Down Expand Up @@ -212,12 +217,12 @@ impl IxOps for AddLiquidity {
let mut token_mint_x =
fuzz_accounts
.token_mint_x
.get_or_create_account(10, client, 6, &user.pubkey(), None);
.get_or_create_account(10, client, get_token_x_decimals(), &user.pubkey(), None);

let mut token_mint_y =
fuzz_accounts
.token_mint_y
.get_or_create_account(11, client, 6, &user.pubkey(), None);
.get_or_create_account(11, client, get_token_y_decimals(), &user.pubkey(), None);

if token_mint_x.key() > token_mint_y.key() {
std::mem::swap(&mut token_mint_x, &mut token_mint_y);
Expand Down Expand Up @@ -601,12 +606,12 @@ impl IxOps for InitializePool {
let mut token_mint_x =
fuzz_accounts
.token_mint_x
.get_or_create_account(10, client, 6, &user.pubkey(), None);
.get_or_create_account(10, client, get_token_x_decimals(), &user.pubkey(), None);

let mut token_mint_y =
fuzz_accounts
.token_mint_y
.get_or_create_account(11, client, 6, &user.pubkey(), None);
.get_or_create_account(11, client, get_token_y_decimals(), &user.pubkey(), None);

if token_mint_x.key() > token_mint_y.key() {
std::mem::swap(&mut token_mint_x, &mut token_mint_y);
Expand Down Expand Up @@ -729,12 +734,12 @@ impl IxOps for RemoveLiquidity {
let mut token_mint_x =
_fuzz_accounts
.token_mint_x
.get_or_create_account(10, _client, 6, &user.pubkey(), None);
.get_or_create_account(10, _client, get_token_x_decimals(), &user.pubkey(), None);

let mut token_mint_y =
_fuzz_accounts
.token_mint_y
.get_or_create_account(11, _client, 6, &user.pubkey(), None);
.get_or_create_account(11, _client, get_token_y_decimals(), &user.pubkey(), None);

if token_mint_x.key() > token_mint_y.key() {
std::mem::swap(&mut token_mint_x, &mut token_mint_y);
Expand Down
19 changes: 15 additions & 4 deletions anchor/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,22 @@ mod fuzz_instructions;
use darklake::entry as entry_darklake;
use darklake::ID as PROGRAM_ID;
use fuzz_instructions::FuzzInstruction;
mod utils;
use utils::set_token_decimals;
use rand::Rng;

const PROGRAM_NAME: &str = "darklake";
struct InstructionsSequence;
/// Define instruction sequences for invocation.
/// `pre` runs at the start, `middle` in the middle, and `post` at the end.
/// For example, to call `InitializeFn`, `UpdateFn` and then `WithdrawFn` during
/// each fuzzing iteration:
/// ```
use fuzz_instructions::{InitializePool,AddLiquidity,RemoveLiquidity};
use fuzz_instructions::{AddLiquidity, InitializePool, RemoveLiquidity};
impl FuzzDataBuilder<FuzzInstruction> for InstructionsSequence {
pre_sequence!(InitializePool);
middle_sequence!(AddLiquidity);
post_sequence!(RemoveLiquidity);
pre_sequence!(InitializePool);
middle_sequence!(AddLiquidity);
post_sequence!(RemoveLiquidity);
}
// ```
// For more details, see: https://ackee.xyz/trident/docs/latest/features/instructions-sequences/#instructions-sequences
Expand All @@ -32,6 +36,13 @@ fn fuzz_iteration<T: FuzzTestExecutor<U> + std::fmt::Display, U>(
processor!(convert_entry!(entry_darklake)),
);
let mut client = ProgramTestClientBlocking::new(&[fuzzing_program_darklake], config).unwrap();

// outside flow decimal generation to persist across all instructions
let mut rng = rand::thread_rng();
let token_decimals_x: u8 = rng.gen_range(0..18);
let token_decimals_y: u8 = rng.gen_range(0..18);

set_token_decimals(token_decimals_x, token_decimals_y);
let _ = fuzz_data.run_with_runtime(&mut client, config);
}
fn main() {
Expand Down
32 changes: 32 additions & 0 deletions anchor/trident-tests/fuzz_tests/fuzz_0/utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
use std::sync::{Mutex, OnceLock};

pub struct AmmParameters {
token_x_decimals: u8,
token_y_decimals: u8,
}

pub static GLOBAL_COUNTER: OnceLock<Mutex<AmmParameters>> = OnceLock::new();

pub fn get_token_x_decimals() -> u8
{
let amm_params = GLOBAL_COUNTER.get_or_init(|| Mutex::new(AmmParameters { token_x_decimals: 6, token_y_decimals: 6 })); // Initialize if not already set
let decimals = amm_params.lock().unwrap();

return decimals.token_x_decimals;
}

pub fn get_token_y_decimals() -> u8
{
let amm_params = GLOBAL_COUNTER.get_or_init(|| Mutex::new(AmmParameters { token_x_decimals: 6, token_y_decimals: 6 })); // Initialize if not already set
let decimals = amm_params.lock().unwrap();

return decimals.token_y_decimals;
}

pub fn set_token_decimals(x: u8, y: u8) {
let amm_params = GLOBAL_COUNTER.get_or_init(|| Mutex::new(AmmParameters { token_x_decimals: 6, token_y_decimals: 6 })); // Initialize if not already set
let mut decimals = amm_params.lock().unwrap();

decimals.token_x_decimals = x;
decimals.token_y_decimals = y;
}

0 comments on commit 9e8f18c

Please sign in to comment.