From 05f41f81e97973d7ed24209c88f5606baa92dca7 Mon Sep 17 00:00:00 2001 From: Moudy Date: Thu, 14 May 2026 18:14:37 +0200 Subject: [PATCH 01/33] feat: add cycle_bench tool for executor, prove, PPE, and verify cycle measurements --- Cargo.toml | 1 + docs/benchmarks/README.md | 11 + docs/benchmarks/cycle_bench.md | 117 ++++++ tools/cycle_bench/Cargo.toml | 29 ++ tools/cycle_bench/README.md | 36 ++ tools/cycle_bench/src/main.rs | 639 +++++++++++++++++++++++++++++++++ tools/cycle_bench/src/ppe.rs | 307 ++++++++++++++++ tools/cycle_bench/src/stats.rs | 54 +++ 8 files changed, 1194 insertions(+) create mode 100644 docs/benchmarks/README.md create mode 100644 docs/benchmarks/cycle_bench.md create mode 100644 tools/cycle_bench/Cargo.toml create mode 100644 tools/cycle_bench/README.md create mode 100644 tools/cycle_bench/src/main.rs create mode 100644 tools/cycle_bench/src/ppe.rs create mode 100644 tools/cycle_bench/src/stats.rs diff --git a/Cargo.toml b/Cargo.toml index 1bce967f..a69a71dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ members = [ "examples/program_deployment/methods/guest", "testnet_initial_state", "indexer/ffi", + "tools/cycle_bench", ] [workspace.dependencies] diff --git a/docs/benchmarks/README.md b/docs/benchmarks/README.md new file mode 100644 index 00000000..18f22225 --- /dev/null +++ b/docs/benchmarks/README.md @@ -0,0 +1,11 @@ +# Benchmarks + +Bench tools live under `tools/` with READMEs for how to run each one. +This directory holds the result write-ups: machine, raw tables, and +short findings. + +| Bench | Doc | +|---|---| +| cycle_bench | [cycle_bench.md](cycle_bench.md) | + +All numbers are from a single M2 Pro dev box unless noted otherwise. diff --git a/docs/benchmarks/cycle_bench.md b/docs/benchmarks/cycle_bench.md new file mode 100644 index 00000000..62db9b1d --- /dev/null +++ b/docs/benchmarks/cycle_bench.md @@ -0,0 +1,117 @@ +# cycle_bench + +Per-program Risc0 cycle counts, prover wall time, PPE composition cost, +and verifier wall time for the built-in LEZ programs. Inputs for the +fee model's `G_executor`, `G_prove`, `G_verify`, and `S_agg` parameters. + +## Machine + +| Field | Value | +|---|---| +| Chip | Apple M2 Pro (8P+4E) | +| RAM | 16 GB | +| OS | macOS 15.5 | +| Rust | 1.94.0 | +| Risc0 zkVM | 3.0.5 | +| Profile | release | +| GPU acceleration | none | + +## Executor cycles + +`SessionInfo::cycles()` per instruction. Deterministic across runs. Wall time +is `best / mean ± stdev` over 5 timed iterations (1 warmup discarded). + +| Program | Instruction | user_cycles | segments | exec_ms (best / mean ± stdev) | +|---|---|---:|---:|---| +| authenticated_transfer | Initialize | 43,642 | 1 | 18.86 / 19.41 ± 0.48 | +| authenticated_transfer | Transfer | 77,095 | 1 | 19.67 / 20.84 ± 1.16 | +| token | Burn | 116,546 | 1 | 24.86 / 25.46 ± 0.63 | +| token | Mint | 116,862 | 1 | 24.47 / 25.08 ± 0.42 | +| token | Transfer | 127,726 | 1 | 25.00 / 25.40 ± 0.29 | +| clock | Tick (no rollups) | 137,022 | 1 | 21.18 / 21.57 ± 0.41 | +| ata | Create | 175,056 | 1 | 23.64 / 24.94 ± 1.09 | +| amm | SwapExactInput | 508,634 | 1 | 34.21 / 34.77 ± 0.55 | +| amm | AddLiquidity | 642,774 | 1 | 37.59 / 37.87 ± 0.28 | + +## Real proving (`--prove`) + +`prover.prove(env, elf)` wall time per program on CPU. `total_cycles` is +`user_cycles` rounded up to the next power of two (Risc0 padding). + +| Program | Instruction | total_cycles | prove_ms | prove_s | +|---|---|---:|---:|---:| +| authenticated_transfer | Initialize | 131,072 | 11,881 | 11.9 | +| authenticated_transfer | Transfer | 131,072 | 13,705 | 13.7 | +| token | Burn | 262,144 | 22,893 | 22.9 | +| token | Mint | 262,144 | 23,927 | 23.9 | +| token | Transfer | 262,144 | 27,178 | 27.2 | +| clock | Tick | 262,144 | 23,486 | 23.5 | +| ata | Create | 262,144 | 21,093 | 21.1 | +| amm | AddLiquidity | 1,048,576 | 111,654 | 111.7 | +| amm | SwapExactInput | 1,048,576 | 126,400 | 126.4 | + +Linear fit across po2 buckets: ≈ 100 µs per total cycle (≈ 10k cycles/s +throughput on this CPU). + +## PPE composition + chain-call sweep (`--ppe`) + +Same `auth_transfer Transfer` instruction, standalone vs wrapped in the +privacy circuit; plus the `chain_caller` test program with N chained +`authenticated_transfer` calls. `proof_bytes` is the borsh-serialized +InnerReceipt (S_agg in the fee model). + +| Case | prove_ms | prove_s | proof_bytes | +|---|---:|---:|---:| +| auth_transfer Transfer standalone | 13,705 | 13.7 | n/a | +| auth_transfer Transfer in PPE | 61,486 | 61.5 | 223,551 | +| chain_caller depth=1 | 122,590 | 122.6 | 223,551 | +| chain_caller depth=3 | 231,974 | 232.0 | 223,551 | +| chain_caller depth=5 | 372,123 | 372.1 | 223,551 | +| chain_caller depth=9 | 544,280 | 544.3 | 223,551 | + +Linear fit depth=1..9: ≈ 53 s per additional chained call, intercept ≈ 73 s. +Composition tax (single program PPE − standalone): ≈ 48 s. `proof_bytes` is +constant: the outer succinct proof has fixed size; the journal carried +alongside it scales with public state and is reported separately by `--verify`. + +## Verifier (`--verify`) + +One PPE receipt generated once (auth_transfer Transfer in PPE), then +`Receipt::verify(PRIVACY_PRESERVING_CIRCUIT_ID)` measured over 1000 iterations. + +| Field | Value | +|---|---| +| case | auth_transfer Transfer in PPE | +| proof_bytes (S_agg) | 223,551 | +| journal_bytes | 412 | +| verify_ms (best / mean ± stdev, n=1000) | 11.71 / 12.06 ± 1.99 | + +## Findings + +- Proving cost scales with po2-bucketed `total_cycles`, not raw `user_cycles`. + Trimming user_cycles only helps if it crosses a 2^N boundary. +- Single-program PPE composition tax on M2 Pro CPU: ≈ 48 s (61.5 − 13.7). +- Chained-call cost is linear at ≈ 53 s per call. A max-depth chain (10) would + take ≈ 600 s standalone on this CPU. +- `G_verify` is ≈ 12 ms and roughly constant per outer receipt (1000-iter + stdev ≈ 2 ms). The succinct outer proof is fixed at 223,551 bytes (S_agg); + verify is not on the latency critical path. + +## Reproduce + +```sh +cargo run --release -p cycle_bench +cargo run --release -p cycle_bench --features prove -- --prove +cargo run --release -p cycle_bench --features ppe -- --prove --ppe +cargo run --release -p cycle_bench --features ppe -- --verify --verify-iters 1000 +``` + +JSON output: `target/cycle_bench.json`. + +## Caveats + +- CPU-only proving on a dev laptop. Production prover hardware (GPU, + specialised CPU pipelines) will produce much smaller numbers; relative + ordering should be preserved. +- Single-segment cases only; multi-segment programs would pay continuation + overhead not measured here. diff --git a/tools/cycle_bench/Cargo.toml b/tools/cycle_bench/Cargo.toml new file mode 100644 index 00000000..6847b0c5 --- /dev/null +++ b/tools/cycle_bench/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "cycle_bench" +version = "0.1.0" +edition = "2024" +license = { workspace = true } +publish = false + +[lints] +workspace = true + +[features] +default = [] +prove = ["nssa/prove", "risc0-zkvm/prove"] +ppe = ["prove"] + +[dependencies] +nssa = { workspace = true } +nssa_core = { workspace = true, features = ["host"] } +clock_core.workspace = true +token_core.workspace = true +amm_core.workspace = true +ata_core.workspace = true + +risc0-zkvm.workspace = true +borsh.workspace = true +serde.workspace = true +serde_json.workspace = true +anyhow.workspace = true +clap = { workspace = true } diff --git a/tools/cycle_bench/README.md b/tools/cycle_bench/README.md new file mode 100644 index 00000000..2bc5462f --- /dev/null +++ b/tools/cycle_bench/README.md @@ -0,0 +1,36 @@ +# cycle_bench + +Per-program Risc0 cycle counts, prover wall time, PPE composition cost, and +verifier wall time for the built-in LEZ programs. Feeds the fee model +(`G_executor`, `G_prove`, `G_verify`, `S_agg`). + +## Run + +```sh +# Executor cycles only (fast, ~seconds) +cargo run --release -p cycle_bench + +# + real proving per program (slow, ~minutes) +cargo run --release -p cycle_bench --features prove -- --prove + +# + PPE composition cases (very slow, ~hour) +cargo run --release -p cycle_bench --features ppe -- --prove --ppe + +# + verifier microbench (G_verify): generates one PPE receipt, times verify x1000 +cargo run --release -p cycle_bench --features ppe -- --verify --verify-iters 1000 +``` + +`RISC0_DEV_MODE=1` skips proving entirely and is only useful for the executor path. +Combine flags freely; output is printed to stdout and written to +`target/cycle_bench.json` for regression diffs. + +## What you'll see + +- Per-program executor cycles and segments, plus exec wall time as + `best / mean ± stdev (n=N)`. +- With `--prove`: prover total cycles, paging cycles, segments, and wall time. +- With `--ppe`: end-to-end `execute_and_prove` wall time and S_agg + (the borsh-serialized InnerReceipt length) for one auth-transfer-in-PPE + case and a chain-caller depth sweep. +- With `--verify`: verify wall time `best / mean ± stdev`, plus + `proof_bytes` and `journal_bytes`. diff --git a/tools/cycle_bench/src/main.rs b/tools/cycle_bench/src/main.rs new file mode 100644 index 00000000..6b4c0e57 --- /dev/null +++ b/tools/cycle_bench/src/main.rs @@ -0,0 +1,639 @@ +//! Measures Risc0 user cycles per built-in program instruction. +//! +//! Runs each guest ELF through the Risc0 executor (no proving) with realistic inputs +//! drawn from the existing per-program unit tests, then prints a table and writes a +//! JSON dump for regression comparison. +//! +//! Run with `cargo run --release -p cycle_bench`. `RISC0_DEV_MODE` has no effect on +//! executor cycle counts. + +#![allow( + clippy::arithmetic_side_effects, + clippy::print_stdout, + clippy::print_stderr, + clippy::std_instead_of_alloc, + clippy::std_instead_of_core, + reason = "Bench tool: matches test-style fixture code" +)] + +use std::{path::PathBuf, time::Instant}; + +mod ppe; +mod stats; + +use stats::Stats; + +use amm_core::{ + PoolDefinition, compute_liquidity_token_pda, compute_pool_pda, compute_vault_pda, +}; +use anyhow::Result; +use ata_core::{compute_ata_seed, get_associated_token_account_id}; +use clap::Parser; +use clock_core::{ + CLOCK_01_PROGRAM_ACCOUNT_ID, CLOCK_10_PROGRAM_ACCOUNT_ID, CLOCK_50_PROGRAM_ACCOUNT_ID, + ClockAccountData, +}; +use nssa::program_methods::{ + AMM_ELF, ASSOCIATED_TOKEN_ACCOUNT_ELF, AUTHENTICATED_TRANSFER_ELF, CLOCK_ELF, TOKEN_ELF, +}; +use nssa_core::{ + Timestamp, + account::{Account, AccountId, AccountWithMetadata, Data}, + program::{InstructionData, ProgramId}, +}; +use risc0_zkvm::{ExecutorEnv, default_executor, default_prover}; +use serde::Serialize; +use token_core::{TokenDefinition, TokenHolding}; + +#[derive(Parser, Debug)] +#[command(about = "Per-program executor and (optionally) prover cycle measurements")] +struct Cli { + /// Also run prover.prove for each case and report wall time + cycles. Slow. + #[arg(long)] + prove: bool, + + /// Also run privacy-preserving execution circuit (PPE) composition cases: + /// (a) single auth_transfer Transfer through `execute_and_prove`, (b) chain_caller + /// with depth N=1,3,5,9. Requires --features ppe at build time. Very slow. + #[arg(long)] + ppe: bool, + + /// After running --ppe-style proving once for auth_transfer-in-PPE, time + /// receipt.verify(PRIVACY_PRESERVING_CIRCUIT_ID) over many iterations. + /// Produces G_verify for the fee model. Requires --features ppe. + #[arg(long)] + verify: bool, + + /// Iterations for --verify. Default matches the fee-model handoff target. + #[arg(long, default_value_t = 1000)] + verify_iters: usize, + + /// Iterations for executor wall-time sampling per case. First iter is + /// discarded as warmup, remaining N feed the stats. + #[arg(long, default_value_t = 5)] + exec_iters: usize, +} + +const AMM_PROGRAM_ID: ProgramId = [42; 8]; +const TOKEN_PROGRAM_ID: ProgramId = [15; 8]; +const ATA_PROGRAM_ID: ProgramId = [88; 8]; +const CLOCK_PROGRAM_ID: ProgramId = [13; 8]; +const AUTH_TRANSFER_PROGRAM_ID: ProgramId = [7; 8]; + +#[derive(Debug, Serialize)] +struct BenchResult { + program: &'static str, + instruction: &'static str, + user_cycles: u64, + segments: usize, + exec_stats: Stats, + /// Stats over prover.prove(env, elf) wall-clock samples. Only populated when --prove is set. + /// Single-sample (n=1) when --prove is on without explicit repetition, since proving is slow. + prove_stats: Option, + /// Total cycles (with continuation overhead, paging, po2 padding) from ProveInfo.stats. + prove_total_cycles: Option, + /// User cycles from ProveInfo.stats (should match executor cycles). + prove_user_cycles: Option, + /// Paging cycles from ProveInfo.stats. + prove_paging_cycles: Option, + /// Segments from ProveInfo.stats. + prove_segments: Option, +} + +fn run_case( + program: &'static str, + instruction_label: &'static str, + elf: &[u8], + self_program_id: ProgramId, + pre_states: Vec, + instruction: &I, + prove: bool, + exec_iters: usize, +) -> Result { + let caller_program_id: Option = None; + let instruction_words: InstructionData = risc0_zkvm::serde::to_vec(instruction)?; + + // One warmup pass discarded, then `exec_iters` samples. The executor has + // large per-call setup overhead (ELF parsing, env init); reporting both + // best-of-N and mean ± stdev shows whether jitter is significant. + let mut samples: Vec = Vec::with_capacity(exec_iters); + let mut last_info = None; + let total = exec_iters.saturating_add(1).max(2); + for iter in 0..total { + let mut env_builder = ExecutorEnv::builder(); + env_builder + .write(&self_program_id)? + .write(&caller_program_id)? + .write(&pre_states)? + .write(&instruction_words)?; + let env = env_builder.build()?; + + let started = Instant::now(); + let info = default_executor().execute(env, elf)?; + let elapsed_ms = started.elapsed().as_secs_f64() * 1_000.0; + + if iter > 0 { + samples.push(elapsed_ms); + } + last_info = Some(info); + } + let info = last_info.expect("at least one iteration"); + let exec_stats = Stats::from_samples(&samples); + + let mut prove_stats = None; + let mut prove_total_cycles = None; + let mut prove_user_cycles = None; + let mut prove_paging_cycles = None; + let mut prove_segments = None; + if prove { + let mut env_builder = ExecutorEnv::builder(); + env_builder + .write(&self_program_id)? + .write(&caller_program_id)? + .write(&pre_states)? + .write(&instruction_words)?; + let env = env_builder.build()?; + + let started = Instant::now(); + let prove_info = default_prover() + .prove(env, elf) + .map_err(|e| anyhow::anyhow!("prove failed: {e}"))?; + let prove_ms = started.elapsed().as_secs_f64() * 1_000.0; + prove_stats = Some(Stats::from_samples(&[prove_ms])); + prove_total_cycles = Some(prove_info.stats.total_cycles); + prove_user_cycles = Some(prove_info.stats.user_cycles); + prove_paging_cycles = Some(prove_info.stats.paging_cycles); + prove_segments = Some(prove_info.stats.segments); + eprintln!( + " prove({program}/{instruction_label}): {prove_ms:.1} ms ({:.1}s), total_cycles={}, segments={}", + prove_ms / 1_000.0, prove_info.stats.total_cycles, prove_info.stats.segments, + ); + } + + Ok(BenchResult { + program, + instruction: instruction_label, + user_cycles: info.cycles(), + segments: info.segments.len(), + exec_stats, + prove_stats, + prove_total_cycles, + prove_user_cycles, + prove_paging_cycles, + prove_segments, + }) +} + +fn authenticated_transfer_init() -> Vec { + vec![AccountWithMetadata { + account: Account::default(), + is_authorized: true, + account_id: AccountId::new([1; 32]), + }] +} + +fn authenticated_transfer_transfer() -> Vec { + let sender = AccountWithMetadata { + account: Account { + balance: 1_000_000, + ..Account::default() + }, + is_authorized: true, + account_id: AccountId::new([1; 32]), + }; + let recipient = AccountWithMetadata { + account: Account::default(), + is_authorized: false, + account_id: AccountId::new([2; 32]), + }; + vec![sender, recipient] +} + +fn token_holding( + definition_id: AccountId, + account_id: AccountId, + balance: u128, + is_authorized: bool, +) -> AccountWithMetadata { + AccountWithMetadata { + account: Account { + program_owner: TOKEN_PROGRAM_ID, + balance: 0, + data: Data::from(&TokenHolding::Fungible { + definition_id, + balance, + }), + nonce: 0_u128.into(), + }, + is_authorized, + account_id, + } +} + +fn token_definition( + account_id: AccountId, + total_supply: u128, + is_authorized: bool, +) -> AccountWithMetadata { + AccountWithMetadata { + account: Account { + program_owner: TOKEN_PROGRAM_ID, + balance: 0, + data: Data::from(&TokenDefinition::Fungible { + name: String::from("test"), + total_supply, + metadata_id: None, + }), + nonce: 0_u128.into(), + }, + is_authorized, + account_id, + } +} + +fn token_transfer_pre_states() -> Vec { + let def = AccountId::new([15; 32]); + let sender = token_holding(def, AccountId::new([17; 32]), 100_000, true); + let recipient = token_holding(def, AccountId::new([42; 32]), 50_000, true); + vec![sender, recipient] +} + +fn token_mint_pre_states() -> Vec { + let def_id = AccountId::new([15; 32]); + let def = token_definition(def_id, 100_000, true); + let holding = token_holding(def_id, AccountId::new([17; 32]), 1_000, true); + vec![def, holding] +} + +fn token_burn_pre_states() -> Vec { + let def_id = AccountId::new([15; 32]); + let def = token_definition(def_id, 100_000, true); + let holding = token_holding(def_id, AccountId::new([17; 32]), 1_000, true); + vec![def, holding] +} + +fn clock_account(account_id: AccountId, block_id: u64) -> AccountWithMetadata { + AccountWithMetadata { + account: Account { + program_owner: CLOCK_PROGRAM_ID, + balance: 0, + data: ClockAccountData { + block_id, + timestamp: Timestamp::from(0_u64), + } + .to_bytes() + .try_into() + .expect("ClockAccountData should fit in account data"), + nonce: 0_u128.into(), + }, + is_authorized: false, + account_id, + } +} + +fn clock_pre_states_tick_at(block_id: u64) -> Vec { + vec![ + clock_account(CLOCK_01_PROGRAM_ACCOUNT_ID, block_id), + clock_account(CLOCK_10_PROGRAM_ACCOUNT_ID, block_id), + clock_account(CLOCK_50_PROGRAM_ACCOUNT_ID, block_id), + ] +} + +fn amm_token_a_def_id() -> AccountId { + AccountId::new([42; 32]) +} +fn amm_token_b_def_id() -> AccountId { + AccountId::new([43; 32]) +} +fn amm_pool_id() -> AccountId { + compute_pool_pda(AMM_PROGRAM_ID, amm_token_a_def_id(), amm_token_b_def_id()) +} +fn amm_vault_a_id() -> AccountId { + compute_vault_pda(AMM_PROGRAM_ID, amm_pool_id(), amm_token_a_def_id()) +} +fn amm_vault_b_id() -> AccountId { + compute_vault_pda(AMM_PROGRAM_ID, amm_pool_id(), amm_token_b_def_id()) +} +fn amm_lp_def_id() -> AccountId { + compute_liquidity_token_pda(AMM_PROGRAM_ID, amm_pool_id()) +} + +/// Pool seeded with reserves 1_000 / 500, lp supply sqrt(1000*500) = 707. +fn amm_pool_account() -> AccountWithMetadata { + let reserve_a: u128 = 1_000; + let reserve_b: u128 = 500; + let lp_supply: u128 = (reserve_a * reserve_b).isqrt(); + AccountWithMetadata { + account: Account { + program_owner: AMM_PROGRAM_ID, + balance: 0, + data: Data::from(&PoolDefinition { + definition_token_a_id: amm_token_a_def_id(), + definition_token_b_id: amm_token_b_def_id(), + vault_a_id: amm_vault_a_id(), + vault_b_id: amm_vault_b_id(), + liquidity_pool_id: amm_lp_def_id(), + liquidity_pool_supply: lp_supply, + reserve_a, + reserve_b, + fees: 0, + active: true, + }), + nonce: 0_u128.into(), + }, + is_authorized: true, + account_id: amm_pool_id(), + } +} + +fn amm_swap_pre_states() -> Vec { + let pool = amm_pool_account(); + let vault_a = token_holding(amm_token_a_def_id(), amm_vault_a_id(), 1_000, true); + let vault_b = token_holding(amm_token_b_def_id(), amm_vault_b_id(), 500, true); + let user_a = token_holding(amm_token_a_def_id(), AccountId::new([45; 32]), 1_000, true); + let user_b = token_holding(amm_token_b_def_id(), AccountId::new([46; 32]), 500, false); + vec![pool, vault_a, vault_b, user_a, user_b] +} + +fn amm_add_liquidity_pre_states() -> Vec { + let pool = amm_pool_account(); + let vault_a = token_holding(amm_token_a_def_id(), amm_vault_a_id(), 1_000, true); + let vault_b = token_holding(amm_token_b_def_id(), amm_vault_b_id(), 500, true); + let lp_supply: u128 = (1_000_u128 * 500_u128).isqrt(); + let lp_def = token_definition(amm_lp_def_id(), lp_supply, true); + let user_a = token_holding(amm_token_a_def_id(), AccountId::new([45; 32]), 1_000, true); + let user_b = token_holding(amm_token_b_def_id(), AccountId::new([46; 32]), 500, true); + let user_lp = token_holding(amm_lp_def_id(), AccountId::new([47; 32]), 0, true); + vec![pool, vault_a, vault_b, lp_def, user_a, user_b, user_lp] +} + +fn ata_create_pre_states() -> Vec { + let owner_id = AccountId::new([91; 32]); + let definition_id = AccountId::new([15; 32]); + let owner = AccountWithMetadata { + account: Account::default(), + is_authorized: true, + account_id: owner_id, + }; + let token_def = token_definition(definition_id, 100_000, false); + let seed = compute_ata_seed(owner_id, definition_id); + let ata_id = get_associated_token_account_id(&ATA_PROGRAM_ID, &seed); + let ata_account = AccountWithMetadata { + account: Account::default(), + is_authorized: false, + account_id: ata_id, + }; + vec![owner, token_def, ata_account] +} + +fn main() -> Result<()> { + let cli = Cli::parse(); + let prove = cli.prove; + let exec_iters = cli.exec_iters.max(1); + if prove { + eprintln!("cycle_bench: prove mode ON, this will be slow (~minutes per program)"); + } + + let mut results: Vec = Vec::new(); + + let transfer_amount: u128 = 5_000; + results.push(run_case( + "authenticated_transfer", + "Transfer", + AUTHENTICATED_TRANSFER_ELF, + AUTH_TRANSFER_PROGRAM_ID, + authenticated_transfer_transfer(), + &transfer_amount, + prove, + exec_iters, + )?); + let init_amount: u128 = 0; + results.push(run_case( + "authenticated_transfer", + "Initialize", + AUTHENTICATED_TRANSFER_ELF, + AUTH_TRANSFER_PROGRAM_ID, + authenticated_transfer_init(), + &init_amount, + prove, + exec_iters, + )?); + + results.push(run_case( + "token", + "Transfer", + TOKEN_ELF, + TOKEN_PROGRAM_ID, + token_transfer_pre_states(), + &token_core::Instruction::Transfer { + amount_to_transfer: 5_000, + }, + prove, + exec_iters, + )?); + results.push(run_case( + "token", + "Mint", + TOKEN_ELF, + TOKEN_PROGRAM_ID, + token_mint_pre_states(), + &token_core::Instruction::Mint { + amount_to_mint: 5_000, + }, + prove, + exec_iters, + )?); + results.push(run_case( + "token", + "Burn", + TOKEN_ELF, + TOKEN_PROGRAM_ID, + token_burn_pre_states(), + &token_core::Instruction::Burn { + amount_to_burn: 500, + }, + prove, + exec_iters, + )?); + + let clock_timestamp = Timestamp::from(1_700_000_000_u64); + results.push(run_case( + "clock", + "Tick (block_id+1, no multiples)", + CLOCK_ELF, + CLOCK_PROGRAM_ID, + clock_pre_states_tick_at(0), + &clock_timestamp, + prove, + exec_iters, + )?); + + results.push(run_case( + "amm", + "SwapExactInput", + AMM_ELF, + AMM_PROGRAM_ID, + amm_swap_pre_states(), + &amm_core::Instruction::SwapExactInput { + swap_amount_in: 200, + min_amount_out: 1, + token_definition_id_in: amm_token_a_def_id(), + }, + prove, + exec_iters, + )?); + results.push(run_case( + "amm", + "AddLiquidity", + AMM_ELF, + AMM_PROGRAM_ID, + amm_add_liquidity_pre_states(), + &amm_core::Instruction::AddLiquidity { + min_amount_liquidity: 1, + max_amount_to_add_token_a: 400, + max_amount_to_add_token_b: 200, + }, + prove, + exec_iters, + )?); + + results.push(run_case( + "ata", + "Create", + ASSOCIATED_TOKEN_ACCOUNT_ELF, + ATA_PROGRAM_ID, + ata_create_pre_states(), + &ata_core::Instruction::Create { + ata_program_id: ATA_PROGRAM_ID, + }, + prove, + exec_iters, + )?); + + print_table(&results, prove); + + #[cfg(feature = "ppe")] + let ppe_results = if cli.ppe { + ppe::run_all()? + } else { + Vec::new() + }; + #[cfg(not(feature = "ppe"))] + let ppe_results: Vec = { + if cli.ppe { + eprintln!("cycle_bench: --ppe requires --features ppe at build time. Ignoring."); + } + Vec::new() + }; + if !ppe_results.is_empty() { + ppe::print_table(&ppe_results); + } + + #[cfg(feature = "ppe")] + let verify_result = if cli.verify { + Some(ppe::run_verify(cli.verify_iters)?) + } else { + None + }; + #[cfg(not(feature = "ppe"))] + let verify_result: Option = { + if cli.verify { + eprintln!("cycle_bench: --verify requires --features ppe at build time. Ignoring."); + } + None + }; + if let Some(ref vr) = verify_result { + ppe::print_verify(vr); + } + + let workspace_root = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("..") + .join("..") + .canonicalize()?; + let out_path = workspace_root.join("target").join("cycle_bench.json"); + if let Some(parent) = out_path.parent() { + std::fs::create_dir_all(parent)?; + } + let combined = serde_json::json!({ + "standalone": results, + "ppe": ppe_results, + "verify": verify_result, + }); + std::fs::write(&out_path, serde_json::to_string_pretty(&combined)?)?; + println!("\nJSON written to {}", out_path.display()); + + Ok(()) +} + +fn print_table(results: &[BenchResult], prove: bool) { + let pw = results + .iter() + .map(|r| r.program.len()) + .max() + .unwrap_or(0) + .max("program".len()); + let iw = results + .iter() + .map(|r| r.instruction.len()) + .max() + .unwrap_or(0) + .max("instruction".len()); + let cw = 12_usize; + let sw = 8_usize; + let exec_w = results + .iter() + .map(|r| r.exec_stats.format().len()) + .max() + .unwrap_or(0) + .max("exec_ms (best / mean ± stdev)".len()); + + println!( + "{:cw$} {:>sw$} {:cw$} {:>sw$} {:pcw$} {:>pwallw$} {:>psw$}", + "program", "instruction", "prove_total_c", "prove_ms (s)", "prove_segs", + ); + println!("{}", "-".repeat(pw + iw + pcw + pwallw + psw + 8)); + for r in results { + let total = r + .prove_total_cycles + .map(|c| c.to_string()) + .unwrap_or_else(|| "-".to_owned()); + let pms = r + .prove_stats + .map(|s| format!("{:.1} ({:.1}s)", s.best_ms, s.best_ms / 1_000.0)) + .unwrap_or_else(|| "-".to_owned()); + let psegs = r + .prove_segments + .map(|s| s.to_string()) + .unwrap_or_else(|| "-".to_owned()); + println!( + "{:pcw$} {:>pwallw$} {:>psw$}", + r.program, r.instruction, total, pms, psegs, + ); + } + } +} diff --git a/tools/cycle_bench/src/ppe.rs b/tools/cycle_bench/src/ppe.rs new file mode 100644 index 00000000..f83f38bd --- /dev/null +++ b/tools/cycle_bench/src/ppe.rs @@ -0,0 +1,307 @@ +//! Privacy-preserving execution (PPE) cases for cycle_bench. +//! +//! Composition cost is the delta between standalone `prover.prove(env, elf)` for +//! a single program (measured in the main bench) and a full `execute_and_prove` +//! that wraps the same program in the privacy circuit. Chained-call depth sweep +//! uses the `chain_caller` test program (loaded from artifacts/) with N=1, 3, 5, 9. +//! +//! `run_verify` produces G_verify for the fee model: it generates one PPE +//! receipt (auth_transfer Transfer in PPE) and times `Receipt::verify` over +//! `iters` iterations. The proof bytes captured here are also the on-wire +//! "outer proof" payload (S_agg in the fee model). + +#![allow( + dead_code, + reason = "Stubs are used when the `ppe` feature is disabled." +)] + +use anyhow::Result; +use serde::Serialize; + +use crate::stats::Stats; + +#[derive(Debug, Serialize, Clone)] +pub struct PpeBenchResult { + pub label: String, + pub chain_depth: usize, + pub prove_wall_ms: Option, + /// borsh-serialized InnerReceipt length (S_agg in the fee model). + pub proof_bytes: Option, + pub error: Option, +} + +#[derive(Debug, Serialize, Clone)] +pub struct VerifyBenchResult { + pub label: String, + pub stats: Stats, + pub proof_bytes: usize, + pub journal_bytes: usize, +} + +#[cfg(not(feature = "ppe"))] +pub fn run_all() -> Result> { + Ok(Vec::new()) +} + +#[cfg(feature = "ppe")] +pub fn run_all() -> Result> { + let mut results = Vec::new(); + + eprintln!("PPE: running composition cost (auth_transfer Transfer in PPE)"); + results.push(ppe_impl::run_auth_transfer_in_ppe()); + + for depth in [1_u32, 3, 5, 9] { + eprintln!("PPE: running chain_caller depth={depth}"); + results.push(ppe_impl::run_chain_caller(depth)); + } + + Ok(results) +} + +#[cfg(not(feature = "ppe"))] +pub fn run_verify(_iters: usize) -> Result { + anyhow::bail!("--verify requires --features ppe at build time") +} + +#[cfg(feature = "ppe")] +pub fn run_verify(iters: usize) -> Result { + ppe_impl::run_verify(iters) +} + +pub fn print_table(results: &[PpeBenchResult]) { + let lw = results + .iter() + .map(|r| r.label.len()) + .max() + .unwrap_or(0) + .max("label".len()); + + println!( + "\n{:5} {:>20} {:>12} {}", + "label", "depth", "prove_ms (s)", "proof_bytes", "error", + lw = lw, + ); + println!("{}", "-".repeat(lw + 60)); + for r in results { + let p = r + .prove_wall_ms + .map(|v| format!("{v:.1} ({:.1}s)", v / 1_000.0)) + .unwrap_or_else(|| "-".to_owned()); + let b = r + .proof_bytes + .map(|n| n.to_string()) + .unwrap_or_else(|| "-".to_owned()); + let e = r.error.as_deref().unwrap_or(""); + println!( + "{:5} {:>20} {:>12} {}", + r.label, r.chain_depth, p, b, e, + lw = lw, + ); + } +} + +pub fn print_verify(r: &VerifyBenchResult) { + println!("\nVerify (G_verify):"); + println!(" case : {}", r.label); + println!(" proof_bytes : {} (borsh InnerReceipt, S_agg)", r.proof_bytes); + println!(" journal_bytes : {}", r.journal_bytes); + println!(" verify_ms : {}", r.stats.format()); +} + +#[cfg(feature = "ppe")] +mod ppe_impl { + use std::{collections::HashMap, time::Instant}; + + use nssa::{ + execute_and_prove, + privacy_preserving_transaction::circuit::{Proof, ProgramWithDependencies}, + program::Program, + program_methods::PRIVACY_PRESERVING_CIRCUIT_ID, + }; + use nssa_core::{ + InputAccountIdentity, PrivacyPreservingCircuitOutput, + account::{Account, AccountId, AccountWithMetadata}, + program::ProgramId, + }; + use risc0_zkvm::{InnerReceipt, Receipt, serde::to_vec}; + + use super::{PpeBenchResult, VerifyBenchResult}; + use crate::stats::Stats; + + const AUTH_TRANSFER_ID: ProgramId = + nssa::program_methods::AUTHENTICATED_TRANSFER_ID; + const AUTH_TRANSFER_ELF: &[u8] = nssa::program_methods::AUTHENTICATED_TRANSFER_ELF; + + /// chain_caller bytecode shipped at artifacts/test_program_methods/chain_caller.bin. + /// Loaded at compile time so we don't need a dev-dependency on test_program_methods. + const CHAIN_CALLER_ELF: &[u8] = + include_bytes!("../../../artifacts/test_program_methods/chain_caller.bin"); + + pub fn run_auth_transfer_in_ppe() -> PpeBenchResult { + let label = "auth_transfer Transfer in PPE".to_owned(); + let started = Instant::now(); + match prove_auth_transfer_in_ppe() { + Ok((_out, proof)) => { + let prove_ms = started.elapsed().as_secs_f64() * 1_000.0; + PpeBenchResult { + label, + chain_depth: 0, + prove_wall_ms: Some(prove_ms), + proof_bytes: Some(proof.into_inner().len()), + error: None, + } + } + Err(err) => PpeBenchResult { + label, + chain_depth: 0, + prove_wall_ms: None, + proof_bytes: None, + error: Some(err.to_string()), + }, + } + } + + fn prove_auth_transfer_in_ppe() + -> anyhow::Result<(PrivacyPreservingCircuitOutput, Proof)> { + let program = Program::new(AUTH_TRANSFER_ELF.to_vec())?; + let pwd = ProgramWithDependencies::from(program); + + // For PPE to allow the sender's balance to be decremented by this + // program, the sender must already be claimed by auth_transfer. + // Recipient stays default-owned so the first call can claim it. + let sender = AccountWithMetadata { + account: Account { + program_owner: AUTH_TRANSFER_ID, + balance: 1_000_000, + ..Account::default() + }, + is_authorized: true, + account_id: AccountId::new([1; 32]), + }; + let recipient = AccountWithMetadata { + account: Account::default(), + is_authorized: true, + account_id: AccountId::new([2; 32]), + }; + let pre_states = vec![sender, recipient]; + + let balance_to_move: u128 = 5_000; + let instruction_data = to_vec(&balance_to_move)?; + + let account_identities = vec![InputAccountIdentity::Public; pre_states.len()]; + + Ok(execute_and_prove( + pre_states, + instruction_data, + account_identities, + &pwd, + )?) + } + + pub fn run_chain_caller(depth: u32) -> PpeBenchResult { + let label = format!("chain_caller depth={depth}"); + let started = Instant::now(); + match prove_chain_caller(depth) { + Ok((_out, proof)) => { + let prove_ms = started.elapsed().as_secs_f64() * 1_000.0; + PpeBenchResult { + label, + chain_depth: depth as usize, + prove_wall_ms: Some(prove_ms), + proof_bytes: Some(proof.into_inner().len()), + error: None, + } + } + Err(err) => PpeBenchResult { + label, + chain_depth: depth as usize, + prove_wall_ms: None, + proof_bytes: None, + error: Some(err.to_string()), + }, + } + } + + fn prove_chain_caller( + num_chain_calls: u32, + ) -> anyhow::Result<(PrivacyPreservingCircuitOutput, Proof)> { + let chain_caller = Program::new(CHAIN_CALLER_ELF.to_vec())?; + let auth_transfer = Program::new(AUTH_TRANSFER_ELF.to_vec())?; + let mut deps = HashMap::new(); + deps.insert(AUTH_TRANSFER_ID, auth_transfer); + let pwd = ProgramWithDependencies::new(chain_caller, deps); + + // Both accounts pre-claimed by auth_transfer. chain_caller doesn't + // track recipient's post-claim program_owner, so a default recipient + // would cause a state mismatch on subsequent chained calls. + let recipient_pre = AccountWithMetadata { + account: Account { + program_owner: AUTH_TRANSFER_ID, + ..Account::default() + }, + is_authorized: true, + account_id: AccountId::new([2; 32]), + }; + let sender_pre = AccountWithMetadata { + account: Account { + program_owner: AUTH_TRANSFER_ID, + balance: 1_000_000, + ..Account::default() + }, + is_authorized: true, + account_id: AccountId::new([1; 32]), + }; + // chain_caller expects pre_states = [recipient, sender]. + let pre_states = vec![recipient_pre, sender_pre]; + + let balance: u128 = 1; + let pda_seed: Option = None; + let instruction = (balance, AUTH_TRANSFER_ID, num_chain_calls, pda_seed); + let instruction_data = to_vec(&instruction)?; + + let account_identities = vec![InputAccountIdentity::Public; pre_states.len()]; + + Ok(execute_and_prove( + pre_states, + instruction_data, + account_identities, + &pwd, + )?) + } + + pub fn run_verify(iters: usize) -> anyhow::Result { + eprintln!("verify: generating PPE receipt for auth_transfer Transfer (~1 prove)"); + let (output, proof) = prove_auth_transfer_in_ppe()?; + let journal = output.to_bytes(); + let journal_bytes = journal.len(); + let proof_bytes_vec = proof.into_inner(); + let proof_bytes = proof_bytes_vec.len(); + + let inner: InnerReceipt = borsh::from_slice(&proof_bytes_vec) + .map_err(|e| anyhow::anyhow!("InnerReceipt deserialize: {e}"))?; + let receipt = Receipt::new(inner, journal); + + // Sanity-check before the timing loop so we don't measure 1000 failures. + receipt + .verify(PRIVACY_PRESERVING_CIRCUIT_ID) + .map_err(|e| anyhow::anyhow!("verify sanity check failed: {e}"))?; + + eprintln!("verify: timing {iters} iters of receipt.verify(...)"); + let mut samples = Vec::with_capacity(iters); + for _ in 0..iters { + let started = Instant::now(); + receipt + .verify(PRIVACY_PRESERVING_CIRCUIT_ID) + .map_err(|e| anyhow::anyhow!("verify failed mid-loop: {e}"))?; + samples.push(started.elapsed().as_secs_f64() * 1_000.0); + } + let stats = Stats::from_samples(&samples); + + Ok(VerifyBenchResult { + label: "auth_transfer Transfer in PPE".to_owned(), + stats, + proof_bytes, + journal_bytes, + }) + } +} diff --git a/tools/cycle_bench/src/stats.rs b/tools/cycle_bench/src/stats.rs new file mode 100644 index 00000000..b1e45b56 --- /dev/null +++ b/tools/cycle_bench/src/stats.rs @@ -0,0 +1,54 @@ +//! Small helper for best / mean / stdev over wall-time samples. +//! +//! We report both best-of-N (the figure that strips OS noise and matches what most +//! bench READMEs print) and mean +/- stdev (the figure the fee model wants, since +//! it cares about the steady-state cost not a single fastest sample). + +use serde::Serialize; + +#[derive(Debug, Serialize, Clone, Copy, Default)] +pub struct Stats { + pub n: usize, + pub best_ms: f64, + pub mean_ms: f64, + pub stdev_ms: f64, +} + +impl Stats { + pub fn from_samples(samples: &[f64]) -> Self { + let n = samples.len(); + if n == 0 { + return Self::default(); + } + let best_ms = samples.iter().copied().fold(f64::INFINITY, f64::min); + let sum: f64 = samples.iter().sum(); + let mean_ms = sum / n as f64; + let stdev_ms = if n > 1 { + let var: f64 = samples + .iter() + .map(|s| { + let d = s - mean_ms; + d * d + }) + .sum::() + / (n - 1) as f64; + var.sqrt() + } else { + 0.0 + }; + Self { + n, + best_ms, + mean_ms, + stdev_ms, + } + } + + /// Format as `best / mean ± stdev (n=N)` for table display. + pub fn format(&self) -> String { + format!( + "{:.2} / {:.2} ± {:.2} (n={})", + self.best_ms, self.mean_ms, self.stdev_ms, self.n, + ) + } +} From 5f30e382d13d911dae436a02acb731ed303b7d19 Mon Sep 17 00:00:00 2001 From: Moudy Date: Thu, 14 May 2026 18:43:26 +0200 Subject: [PATCH 02/33] fix: satisfy nightly rustfmt and pedantic clippy in cycle_bench --- tools/cycle_bench/src/main.rs | 53 ++++++++++++++++++++++++----------- tools/cycle_bench/src/ppe.rs | 25 +++++++++++------ 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/tools/cycle_bench/src/main.rs b/tools/cycle_bench/src/main.rs index 6b4c0e57..3b0e53a2 100644 --- a/tools/cycle_bench/src/main.rs +++ b/tools/cycle_bench/src/main.rs @@ -8,11 +8,39 @@ //! executor cycle counts. #![allow( + clippy::arbitrary_source_item_ordering, clippy::arithmetic_side_effects, - clippy::print_stdout, + clippy::as_conversions, + clippy::cast_precision_loss, + clippy::doc_markdown, + clippy::float_arithmetic, + clippy::ignored_unit_patterns, + clippy::items_after_statements, + clippy::let_underscore_must_use, + clippy::let_underscore_untyped, + clippy::map_unwrap_or, + clippy::missing_const_for_fn, + clippy::missing_docs_in_private_items, + clippy::module_inception, + clippy::module_name_repetitions, + clippy::needless_pass_by_value, + clippy::no_effect_underscore_binding, + clippy::print_literal, clippy::print_stderr, + clippy::print_stdout, + clippy::ref_option, + clippy::ref_patterns, + clippy::similar_names, + clippy::single_call_fn, + clippy::single_match_else, clippy::std_instead_of_alloc, clippy::std_instead_of_core, + clippy::too_many_arguments, + clippy::too_many_lines, + clippy::unnecessary_wraps, + clippy::unwrap_used, + clippy::useless_format, + clippy::wildcard_enum_match_arm, reason = "Bench tool: matches test-style fixture code" )] @@ -21,11 +49,7 @@ use std::{path::PathBuf, time::Instant}; mod ppe; mod stats; -use stats::Stats; - -use amm_core::{ - PoolDefinition, compute_liquidity_token_pda, compute_pool_pda, compute_vault_pda, -}; +use amm_core::{PoolDefinition, compute_liquidity_token_pda, compute_pool_pda, compute_vault_pda}; use anyhow::Result; use ata_core::{compute_ata_seed, get_associated_token_account_id}; use clap::Parser; @@ -43,6 +67,7 @@ use nssa_core::{ }; use risc0_zkvm::{ExecutorEnv, default_executor, default_prover}; use serde::Serialize; +use stats::Stats; use token_core::{TokenDefinition, TokenHolding}; #[derive(Parser, Debug)] @@ -166,7 +191,9 @@ fn run_case( prove_segments = Some(prove_info.stats.segments); eprintln!( " prove({program}/{instruction_label}): {prove_ms:.1} ms ({:.1}s), total_cycles={}, segments={}", - prove_ms / 1_000.0, prove_info.stats.total_cycles, prove_info.stats.segments, + prove_ms / 1_000.0, + prove_info.stats.total_cycles, + prove_info.stats.segments, ); } @@ -513,11 +540,7 @@ fn main() -> Result<()> { print_table(&results, prove); #[cfg(feature = "ppe")] - let ppe_results = if cli.ppe { - ppe::run_all()? - } else { - Vec::new() - }; + let ppe_results = if cli.ppe { ppe::run_all()? } else { Vec::new() }; #[cfg(not(feature = "ppe"))] let ppe_results: Vec = { if cli.ppe { @@ -589,11 +612,7 @@ fn print_table(results: &[BenchResult], prove: bool) { println!( "{:cw$} {:>sw$} {:5} {:>20} {:>12} {}", - "label", "depth", "prove_ms (s)", "proof_bytes", "error", + "label", + "depth", + "prove_ms (s)", + "proof_bytes", + "error", lw = lw, ); println!("{}", "-".repeat(lw + 60)); @@ -94,7 +98,11 @@ pub fn print_table(results: &[PpeBenchResult]) { let e = r.error.as_deref().unwrap_or(""); println!( "{:5} {:>20} {:>12} {}", - r.label, r.chain_depth, p, b, e, + r.label, + r.chain_depth, + p, + b, + e, lw = lw, ); } @@ -103,7 +111,10 @@ pub fn print_table(results: &[PpeBenchResult]) { pub fn print_verify(r: &VerifyBenchResult) { println!("\nVerify (G_verify):"); println!(" case : {}", r.label); - println!(" proof_bytes : {} (borsh InnerReceipt, S_agg)", r.proof_bytes); + println!( + " proof_bytes : {} (borsh InnerReceipt, S_agg)", + r.proof_bytes + ); println!(" journal_bytes : {}", r.journal_bytes); println!(" verify_ms : {}", r.stats.format()); } @@ -114,7 +125,7 @@ mod ppe_impl { use nssa::{ execute_and_prove, - privacy_preserving_transaction::circuit::{Proof, ProgramWithDependencies}, + privacy_preserving_transaction::circuit::{ProgramWithDependencies, Proof}, program::Program, program_methods::PRIVACY_PRESERVING_CIRCUIT_ID, }; @@ -128,8 +139,7 @@ mod ppe_impl { use super::{PpeBenchResult, VerifyBenchResult}; use crate::stats::Stats; - const AUTH_TRANSFER_ID: ProgramId = - nssa::program_methods::AUTHENTICATED_TRANSFER_ID; + const AUTH_TRANSFER_ID: ProgramId = nssa::program_methods::AUTHENTICATED_TRANSFER_ID; const AUTH_TRANSFER_ELF: &[u8] = nssa::program_methods::AUTHENTICATED_TRANSFER_ELF; /// chain_caller bytecode shipped at artifacts/test_program_methods/chain_caller.bin. @@ -161,8 +171,7 @@ mod ppe_impl { } } - fn prove_auth_transfer_in_ppe() - -> anyhow::Result<(PrivacyPreservingCircuitOutput, Proof)> { + fn prove_auth_transfer_in_ppe() -> anyhow::Result<(PrivacyPreservingCircuitOutput, Proof)> { let program = Program::new(AUTH_TRANSFER_ELF.to_vec())?; let pwd = ProgramWithDependencies::from(program); From 2870bc364be338bba571eb6563f3b774c3bf390e Mon Sep 17 00:00:00 2001 From: Moudy Date: Thu, 14 May 2026 18:58:53 +0200 Subject: [PATCH 03/33] fix: allow non_ascii_literal and redundant_type_annotations clippy lints --- tools/cycle_bench/src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/cycle_bench/src/main.rs b/tools/cycle_bench/src/main.rs index 3b0e53a2..32316b89 100644 --- a/tools/cycle_bench/src/main.rs +++ b/tools/cycle_bench/src/main.rs @@ -25,9 +25,11 @@ clippy::module_name_repetitions, clippy::needless_pass_by_value, clippy::no_effect_underscore_binding, + clippy::non_ascii_literal, clippy::print_literal, clippy::print_stderr, clippy::print_stdout, + clippy::redundant_type_annotations, clippy::ref_option, clippy::ref_patterns, clippy::similar_names, From 1e2d41f9417c3b9757f4902cd47f2bf019a6f94b Mon Sep 17 00:00:00 2001 From: Moudy Date: Fri, 15 May 2026 00:23:49 +0200 Subject: [PATCH 04/33] Update cycle_bench.md --- docs/benchmarks/cycle_bench.md | 43 ++++++++++------------------------ 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/docs/benchmarks/cycle_bench.md b/docs/benchmarks/cycle_bench.md index 62db9b1d..fca9f12c 100644 --- a/docs/benchmarks/cycle_bench.md +++ b/docs/benchmarks/cycle_bench.md @@ -1,8 +1,6 @@ # cycle_bench -Per-program Risc0 cycle counts, prover wall time, PPE composition cost, -and verifier wall time for the built-in LEZ programs. Inputs for the -fee model's `G_executor`, `G_prove`, `G_verify`, and `S_agg` parameters. +Per-program Risc0 cycle counts, prover wall time, PPE composition cost, and verifier wall time for the built-in LEZ programs. Inputs for the fee model's `G_executor`, `G_prove`, `G_verify`, and `S_agg` parameters. ## Machine @@ -18,8 +16,7 @@ fee model's `G_executor`, `G_prove`, `G_verify`, and `S_agg` parameters. ## Executor cycles -`SessionInfo::cycles()` per instruction. Deterministic across runs. Wall time -is `best / mean ± stdev` over 5 timed iterations (1 warmup discarded). +`SessionInfo::cycles()` per instruction. Deterministic across runs. Wall time is `best / mean ± stdev` over 5 timed iterations (1 warmup discarded). | Program | Instruction | user_cycles | segments | exec_ms (best / mean ± stdev) | |---|---|---:|---:|---| @@ -35,8 +32,7 @@ is `best / mean ± stdev` over 5 timed iterations (1 warmup discarded). ## Real proving (`--prove`) -`prover.prove(env, elf)` wall time per program on CPU. `total_cycles` is -`user_cycles` rounded up to the next power of two (Risc0 padding). +`prover.prove(env, elf)` wall time per program on CPU. `total_cycles` is `user_cycles` rounded up to the next power of two (Risc0 padding). | Program | Instruction | total_cycles | prove_ms | prove_s | |---|---|---:|---:|---:| @@ -50,15 +46,11 @@ is `best / mean ± stdev` over 5 timed iterations (1 warmup discarded). | amm | AddLiquidity | 1,048,576 | 111,654 | 111.7 | | amm | SwapExactInput | 1,048,576 | 126,400 | 126.4 | -Linear fit across po2 buckets: ≈ 100 µs per total cycle (≈ 10k cycles/s -throughput on this CPU). +Linear fit across po2 buckets: ≈ 100 µs per total cycle (≈ 10k cycles/s throughput on this CPU). ## PPE composition + chain-call sweep (`--ppe`) -Same `auth_transfer Transfer` instruction, standalone vs wrapped in the -privacy circuit; plus the `chain_caller` test program with N chained -`authenticated_transfer` calls. `proof_bytes` is the borsh-serialized -InnerReceipt (S_agg in the fee model). +Same `auth_transfer Transfer` instruction, standalone vs wrapped in the privacy circuit; plus the `chain_caller` test program with N chained `authenticated_transfer` calls. `proof_bytes` is the borsh-serialized. InnerReceipt (S_agg in the fee model). | Case | prove_ms | prove_s | proof_bytes | |---|---:|---:|---:| @@ -69,15 +61,11 @@ InnerReceipt (S_agg in the fee model). | chain_caller depth=5 | 372,123 | 372.1 | 223,551 | | chain_caller depth=9 | 544,280 | 544.3 | 223,551 | -Linear fit depth=1..9: ≈ 53 s per additional chained call, intercept ≈ 73 s. -Composition tax (single program PPE − standalone): ≈ 48 s. `proof_bytes` is -constant: the outer succinct proof has fixed size; the journal carried -alongside it scales with public state and is reported separately by `--verify`. +Linear fit depth=1..9: ≈ 53 s per additional chained call, intercept ≈ 73 s. Composition tax (single program PPE − standalone): ≈ 48 s. `proof_bytes` is constant: the outer succinct proof has fixed size; the journal carried alongside it scales with public state and is reported separately by `--verify`. ## Verifier (`--verify`) -One PPE receipt generated once (auth_transfer Transfer in PPE), then -`Receipt::verify(PRIVACY_PRESERVING_CIRCUIT_ID)` measured over 1000 iterations. +One PPE receipt generated once (auth_transfer Transfer in PPE), then `Receipt::verify(PRIVACY_PRESERVING_CIRCUIT_ID)` measured over 1000 iterations. | Field | Value | |---|---| @@ -88,14 +76,10 @@ One PPE receipt generated once (auth_transfer Transfer in PPE), then ## Findings -- Proving cost scales with po2-bucketed `total_cycles`, not raw `user_cycles`. - Trimming user_cycles only helps if it crosses a 2^N boundary. +- Proving cost scales with po2-bucketed `total_cycles`, not raw `user_cycles`. Trimming user_cycles only helps if it crosses a 2^N boundary. - Single-program PPE composition tax on M2 Pro CPU: ≈ 48 s (61.5 − 13.7). -- Chained-call cost is linear at ≈ 53 s per call. A max-depth chain (10) would - take ≈ 600 s standalone on this CPU. -- `G_verify` is ≈ 12 ms and roughly constant per outer receipt (1000-iter - stdev ≈ 2 ms). The succinct outer proof is fixed at 223,551 bytes (S_agg); - verify is not on the latency critical path. +- Chained-call cost is linear at ≈ 53 s per call. A max-depth chain (10) would take ≈ 600 s standalone on this CPU. +- `G_verify` is ≈ 12 ms and roughly constant per outer receipt (1000-iter stdev ≈ 2 ms). The succinct outer proof is fixed at 223,551 bytes (S_agg); verify is not on the latency critical path. ## Reproduce @@ -110,8 +94,5 @@ JSON output: `target/cycle_bench.json`. ## Caveats -- CPU-only proving on a dev laptop. Production prover hardware (GPU, - specialised CPU pipelines) will produce much smaller numbers; relative - ordering should be preserved. -- Single-segment cases only; multi-segment programs would pay continuation - overhead not measured here. +- CPU-only proving on a dev laptop. Production prover hardware (GPU, specialised CPU pipelines) will produce much smaller numbers; relative ordering should be preserved. +- Single-segment cases only; multi-segment programs would pay continuation overhead not measured here. From 75e1cc51d543d094139910fa80ebd932e0078ca8 Mon Sep 17 00:00:00 2001 From: Moudy Date: Fri, 15 May 2026 00:24:16 +0200 Subject: [PATCH 05/33] Update README.md --- docs/benchmarks/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/benchmarks/README.md b/docs/benchmarks/README.md index 18f22225..269272b0 100644 --- a/docs/benchmarks/README.md +++ b/docs/benchmarks/README.md @@ -1,8 +1,6 @@ # Benchmarks -Bench tools live under `tools/` with READMEs for how to run each one. -This directory holds the result write-ups: machine, raw tables, and -short findings. +Bench tools live under `tools/` with READMEs for how to run each one. This directory holds the result write-ups: machine, raw tables, and short findings. | Bench | Doc | |---|---| From e74fe368666ae4106842ce08b737539d40264a03 Mon Sep 17 00:00:00 2001 From: Moudy Date: Fri, 15 May 2026 00:24:56 +0200 Subject: [PATCH 06/33] Update README.md --- tools/cycle_bench/README.md | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/tools/cycle_bench/README.md b/tools/cycle_bench/README.md index 2bc5462f..3b416dc8 100644 --- a/tools/cycle_bench/README.md +++ b/tools/cycle_bench/README.md @@ -1,8 +1,6 @@ # cycle_bench -Per-program Risc0 cycle counts, prover wall time, PPE composition cost, and -verifier wall time for the built-in LEZ programs. Feeds the fee model -(`G_executor`, `G_prove`, `G_verify`, `S_agg`). +Per-program Risc0 cycle counts, prover wall time, PPE composition cost, and verifier wall time for the built-in LEZ programs. Feeds the fee model (`G_executor`, `G_prove`, `G_verify`, `S_agg`). ## Run @@ -20,17 +18,11 @@ cargo run --release -p cycle_bench --features ppe -- --prove --ppe cargo run --release -p cycle_bench --features ppe -- --verify --verify-iters 1000 ``` -`RISC0_DEV_MODE=1` skips proving entirely and is only useful for the executor path. -Combine flags freely; output is printed to stdout and written to -`target/cycle_bench.json` for regression diffs. +`RISC0_DEV_MODE=1` skips proving entirely and is only useful for the executor path. Combine flags freely; output is printed to stdout and written to `target/cycle_bench.json` for regression diffs. ## What you'll see -- Per-program executor cycles and segments, plus exec wall time as - `best / mean ± stdev (n=N)`. +- Per-program executor cycles and segments, plus exec wall time as `best / mean ± stdev (n=N)`. - With `--prove`: prover total cycles, paging cycles, segments, and wall time. -- With `--ppe`: end-to-end `execute_and_prove` wall time and S_agg - (the borsh-serialized InnerReceipt length) for one auth-transfer-in-PPE - case and a chain-caller depth sweep. -- With `--verify`: verify wall time `best / mean ± stdev`, plus - `proof_bytes` and `journal_bytes`. +- With `--ppe`: end-to-end `execute_and_prove` wall time and S_agg (the borsh-serialized InnerReceipt length) for one auth-transfer-in-PPE case and a chain-caller depth sweep. +- With `--verify`: verify wall time `best / mean ± stdev`, plus `proof_bytes` and `journal_bytes`. From 2ae9e4da7fb2deab8ce013665ce8f31b60cc914d Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Fri, 15 May 2026 00:43:45 -0300 Subject: [PATCH 07/33] add tests and fix mechanism --- Cargo.lock | 1 + common/src/transaction.rs | 27 +-- program_methods/guest/src/bin/vault.rs | 2 +- sequencer/core/src/lib.rs | 179 ++++++++++++++++++ test_program_methods/guest/Cargo.toml | 1 + .../guest/src/bin/faucet_chain_caller.rs | 50 +++++ 6 files changed, 246 insertions(+), 14 deletions(-) create mode 100644 test_program_methods/guest/src/bin/faucet_chain_caller.rs diff --git a/Cargo.lock b/Cargo.lock index 195a5087..cf1943f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9181,6 +9181,7 @@ version = "0.1.0" dependencies = [ "authenticated_transfer_core", "clock_core", + "faucet_core", "nssa_core", "risc0-zkvm", "serde", diff --git a/common/src/transaction.rs b/common/src/transaction.rs index 6175f1a1..21cbfd75 100644 --- a/common/src/transaction.rs +++ b/common/src/transaction.rs @@ -67,26 +67,17 @@ impl NSSATransaction { } /// Validates the transaction against the current state and returns the resulting diff - /// without applying it. Rejects transactions that modify clock system accounts and - /// rejects unsafe modifications of the system faucet account. Also rejects direct - /// invocation of the faucet program for user-submitted transactions. + /// without applying it. Rejects transactions that modify clock or faucet system accounts, + /// whether directly or indirectly via chain calls. /// - /// This check is required for all user transactions. Only sequencer transaction may bypass this - /// check. + /// This check is required for all user transactions. Only sequencer transactions may bypass + /// this check. pub fn validate_on_state( &self, state: &V03State, block_id: BlockId, timestamp: Timestamp, ) -> Result { - if let Self::Public(tx) = self - && tx.message().program_id == nssa::program::Program::faucet().id() - { - return Err(nssa::error::NssaError::InvalidInput( - "Transaction invokes restricted faucet program".into(), - )); - } - let diff = match self { Self::Public(tx) => { ValidatedStateDiff::from_public_transaction(tx, state, block_id, timestamp) @@ -111,6 +102,16 @@ impl NSSATransaction { )); } + let faucet_id = nssa::system_faucet_account_id(); + if public_diff + .get(&faucet_id) + .is_some_and(|post| *post != state.get_account_by_id(faucet_id)) + { + return Err(nssa::error::NssaError::InvalidInput( + "Transaction modifies system faucet account".into(), + )); + } + Ok(diff) } diff --git a/program_methods/guest/src/bin/vault.rs b/program_methods/guest/src/bin/vault.rs index c691e8f6..c56c1a7f 100644 --- a/program_methods/guest/src/bin/vault.rs +++ b/program_methods/guest/src/bin/vault.rs @@ -40,7 +40,7 @@ fn main() { } => { let [sender, recipient_vault] = pre_states .try_into() - .expect("Transfer requires exactly 3 accounts"); + .expect("Transfer requires exactly 2 accounts"); let seed = vault_core::compute_vault_seed(recipient_id); diff --git a/sequencer/core/src/lib.rs b/sequencer/core/src/lib.rs index c6606145..054c8731 100644 --- a/sequencer/core/src/lib.rs +++ b/sequencer/core/src/lib.rs @@ -1060,4 +1060,183 @@ mod tests { "Block production should abort when clock account data is corrupted" ); } + + #[tokio::test] + async fn user_tx_that_chain_calls_faucet_is_dropped() { + let (mut sequencer, mempool_handle) = common_setup().await; + + // Deploy the faucet_chain_caller test program. + let deploy_tx = + NSSATransaction::ProgramDeployment(nssa::ProgramDeploymentTransaction::new( + nssa::program_deployment_transaction::Message::new( + test_program_methods::FAUCET_CHAIN_CALLER_ELF.to_vec(), + ), + )); + mempool_handle.push(deploy_tx).await.unwrap(); + sequencer.produce_new_block().await.unwrap(); + + // The attacker chain-calls the faucet through their own program: + // faucet_chain_caller → faucet → vault → authenticated_transfer. + // Funds from the system faucet would land in the attacker's vault PDA. + let faucet_account_id = nssa::system_faucet_account_id(); + let attacker_id = initial_accounts()[0].account_id; + let faucet_program_id = nssa::program::Program::faucet().id(); + let vault_program_id = nssa::program::Program::vault().id(); + let attacker_vault_id = + vault_core::compute_vault_account_id(vault_program_id, attacker_id); + let amount: u128 = 1_000; + + let faucet_chain_caller_id = + nssa::program::Program::new(test_program_methods::FAUCET_CHAIN_CALLER_ELF.to_vec()) + .unwrap() + .id(); + + let message = nssa::public_transaction::Message::try_new( + faucet_chain_caller_id, + vec![faucet_account_id, attacker_vault_id], + vec![], // no signers — faucet PDA authorization is handled internally + (faucet_program_id, vault_program_id, attacker_id, amount), + ) + .unwrap(); + let attack_tx = NSSATransaction::Public(nssa::PublicTransaction::new( + message, + nssa::public_transaction::WitnessSet::from_raw_parts(vec![]), + )); + + let faucet_balance_before = sequencer.state.get_account_by_id(faucet_account_id).balance; + let vault_balance_before = sequencer.state.get_account_by_id(attacker_vault_id).balance; + + mempool_handle.push(attack_tx).await.unwrap(); + sequencer.produce_new_block().await.unwrap(); + + let block = sequencer + .store + .get_block_at_id(sequencer.chain_height) + .unwrap() + .unwrap(); + let faucet_balance_after = sequencer.state.get_account_by_id(faucet_account_id).balance; + let vault_balance_after = sequencer.state.get_account_by_id(attacker_vault_id).balance; + + // The attack tx must be dropped; only the mandatory clock invocation remains. + assert_eq!( + block.body.transactions, + vec![NSSATransaction::Public(clock_invocation( + block.header.timestamp + ))] + ); + assert_eq!(faucet_balance_after, faucet_balance_before); + assert_eq!(vault_balance_after, vault_balance_before); + } + + #[tokio::test] + async fn ppt_that_chain_calls_faucet_is_dropped() { + use nssa::privacy_preserving_transaction::circuit::ProgramWithDependencies; + use nssa_core::{InputAccountIdentity, account::AccountWithMetadata}; + + let (mut sequencer, mempool_handle) = common_setup().await; + + // Deploy the faucet_chain_caller test program. + let deploy_tx = + NSSATransaction::ProgramDeployment(nssa::ProgramDeploymentTransaction::new( + nssa::program_deployment_transaction::Message::new( + test_program_methods::FAUCET_CHAIN_CALLER_ELF.to_vec(), + ), + )); + mempool_handle.push(deploy_tx).await.unwrap(); + sequencer.produce_new_block().await.unwrap(); + + // The attacker runs faucet_chain_caller inside a PPT circuit, producing a valid proof + // that the faucet was drained into their vault PDA. + let faucet_account_id = nssa::system_faucet_account_id(); + let attacker_id = initial_accounts()[0].account_id; + let faucet_program_id = nssa::program::Program::faucet().id(); + let vault_program_id = nssa::program::Program::vault().id(); + let auth_transfer_program_id = nssa::program::Program::authenticated_transfer_program().id(); + let attacker_vault_id = + vault_core::compute_vault_account_id(vault_program_id, attacker_id); + let amount: u128 = 1_000; + + let faucet_pre = AccountWithMetadata::new( + sequencer.state.get_account_by_id(faucet_account_id), + false, + faucet_account_id, + ); + let vault_pda_pre = AccountWithMetadata::new( + sequencer.state.get_account_by_id(attacker_vault_id), + false, + attacker_vault_id, + ); + + let faucet_chain_caller = + nssa::program::Program::new(test_program_methods::FAUCET_CHAIN_CALLER_ELF.to_vec()) + .unwrap(); + let program_with_deps = ProgramWithDependencies::new( + faucet_chain_caller, + [ + (faucet_program_id, nssa::program::Program::faucet()), + (vault_program_id, nssa::program::Program::vault()), + (auth_transfer_program_id, nssa::program::Program::authenticated_transfer_program()), + ] + .into(), + ); + + let instruction = nssa::program::Program::serialize_instruction(( + faucet_program_id, + vault_program_id, + attacker_id, + amount, + )) + .unwrap(); + + let (output, proof) = nssa::execute_and_prove( + vec![faucet_pre, vault_pda_pre], + instruction, + vec![ + InputAccountIdentity::Public, + InputAccountIdentity::Public, + ], + &program_with_deps, + ) + .unwrap(); + + let message = nssa::privacy_preserving_transaction::Message::try_from_circuit_output( + vec![faucet_account_id, attacker_vault_id], + vec![], // no public signers + vec![], + output, + ) + .unwrap(); + let witness_set = nssa::privacy_preserving_transaction::WitnessSet::for_message( + &message, + proof, + &[], // no signatures + ); + let attack_ppt = NSSATransaction::PrivacyPreserving( + nssa::PrivacyPreservingTransaction::new(message, witness_set), + ); + + let faucet_balance_before = sequencer.state.get_account_by_id(faucet_account_id).balance; + let vault_balance_before = sequencer.state.get_account_by_id(attacker_vault_id).balance; + + mempool_handle.push(attack_ppt).await.unwrap(); + sequencer.produce_new_block().await.unwrap(); + + let block = sequencer + .store + .get_block_at_id(sequencer.chain_height) + .unwrap() + .unwrap(); + let faucet_balance_after = sequencer.state.get_account_by_id(faucet_account_id).balance; + let vault_balance_after = sequencer.state.get_account_by_id(attacker_vault_id).balance; + + // The attack PPT must be dropped; only the mandatory clock invocation remains. + assert_eq!( + block.body.transactions, + vec![NSSATransaction::Public(clock_invocation( + block.header.timestamp + ))] + ); + assert_eq!(faucet_balance_after, faucet_balance_before); + assert_eq!(vault_balance_after, vault_balance_before); + } } diff --git a/test_program_methods/guest/Cargo.toml b/test_program_methods/guest/Cargo.toml index ca8cdc1d..47ea10e1 100644 --- a/test_program_methods/guest/Cargo.toml +++ b/test_program_methods/guest/Cargo.toml @@ -11,6 +11,7 @@ workspace = true nssa_core.workspace = true authenticated_transfer_core.workspace = true clock_core.workspace = true +faucet_core.workspace = true risc0-zkvm.workspace = true serde = { workspace = true, default-features = false } diff --git a/test_program_methods/guest/src/bin/faucet_chain_caller.rs b/test_program_methods/guest/src/bin/faucet_chain_caller.rs new file mode 100644 index 00000000..ca2e851b --- /dev/null +++ b/test_program_methods/guest/src/bin/faucet_chain_caller.rs @@ -0,0 +1,50 @@ +use nssa_core::{ + account::AccountId, + program::{AccountPostState, ChainedCall, ProgramId, ProgramInput, ProgramOutput, read_nssa_inputs}, +}; +use risc0_zkvm::serde::to_vec; + +type Instruction = (ProgramId, ProgramId, AccountId, u128); +// (faucet_program_id, vault_program_id, recipient_id, amount) + +fn main() { + let ( + ProgramInput { + self_program_id, + caller_program_id, + pre_states, + instruction: (faucet_program_id, vault_program_id, recipient_id, amount), + }, + instruction_words, + ) = read_nssa_inputs::(); + + let post_states: Vec<_> = pre_states + .iter() + .map(|pre| AccountPostState::new(pre.account.clone())) + .collect(); + + assert_eq!(pre_states.len(), 2); + let [faucet_pre, vault_pda_pre] = [pre_states[0].clone(), pre_states[1].clone()]; + + let chained_calls = vec![ChainedCall { + program_id: faucet_program_id, + instruction_data: to_vec(&faucet_core::Instruction::Transfer { + vault_program_id, + recipient_id, + amount, + }) + .unwrap(), + pre_states: vec![faucet_pre, vault_pda_pre], + pda_seeds: vec![], + }]; + + ProgramOutput::new( + self_program_id, + caller_program_id, + instruction_words, + pre_states, + post_states, + ) + .with_chained_calls(chained_calls) + .write(); +} From 84a1fec9420fcbb6e17afeeb4ffa513a05f4e045 Mon Sep 17 00:00:00 2001 From: Moudy Date: Fri, 15 May 2026 10:51:51 +0200 Subject: [PATCH 08/33] feat: add wallet_crypto_bench tool for wallet-side cryptographic primitives --- Cargo.toml | 1 + docs/benchmarks/README.md | 10 ++ docs/benchmarks/wallet_crypto_bench.md | 43 ++++++ tools/wallet_crypto_bench/Cargo.toml | 19 +++ tools/wallet_crypto_bench/README.md | 20 +++ tools/wallet_crypto_bench/src/main.rs | 173 +++++++++++++++++++++++++ 6 files changed, 266 insertions(+) create mode 100644 docs/benchmarks/README.md create mode 100644 docs/benchmarks/wallet_crypto_bench.md create mode 100644 tools/wallet_crypto_bench/Cargo.toml create mode 100644 tools/wallet_crypto_bench/README.md create mode 100644 tools/wallet_crypto_bench/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index 1bce967f..f41a41df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ members = [ "examples/program_deployment/methods/guest", "testnet_initial_state", "indexer/ffi", + "tools/wallet_crypto_bench", ] [workspace.dependencies] diff --git a/docs/benchmarks/README.md b/docs/benchmarks/README.md new file mode 100644 index 00000000..65a57c80 --- /dev/null +++ b/docs/benchmarks/README.md @@ -0,0 +1,10 @@ +# Benchmarks + +Bench tools live under `tools/` with READMEs for how to run each one. This directory holds the result write-ups: machine, raw tables, and short findings. + +| Bench | Doc | +|---|---| +| cycle_bench | [cycle_bench.md](cycle_bench.md) | +| wallet_crypto_bench | [wallet_crypto_bench.md](wallet_crypto_bench.md) | + +All numbers are from a single M2 Pro dev box unless noted otherwise. diff --git a/docs/benchmarks/wallet_crypto_bench.md b/docs/benchmarks/wallet_crypto_bench.md new file mode 100644 index 00000000..a786f875 --- /dev/null +++ b/docs/benchmarks/wallet_crypto_bench.md @@ -0,0 +1,43 @@ +# wallet_crypto_bench + +Wallet-side cryptographic primitives. Measures the per-call cost of key derivation, sender-side DH for note encryption, and Account note symmetric encrypt/decrypt. Standalone host binary, no live stack required. + +## Machine + +| Field | Value | +|---|---| +| Chip | Apple M2 Pro (8P+4E) | +| RAM | 16 GB | +| OS | macOS 15.5 | +| Rust | 1.94.0 | +| Profile | release | + +## Results + +100 timed iterations per operation, 2 warmup discarded. + +| Operation | best (µs) | mean (µs) | stdev (µs) | +|---|---:|---:|---:| +| KeyChain::new_os_random | 2,979.62 (2.98 ms) | 3,138.18 (3.14 ms) | 258.59 (0.26 ms) | +| KeyChain::new_mnemonic | 2,979.12 (2.98 ms) | 3,012.76 (3.01 ms) | 46.09 (0.05 ms) | +| SharedSecretKey::new (sender DH) | 74.17 (0.07 ms) | 74.48 (0.07 ms) | 0.22 (<0.01 ms) | +| EncryptionScheme::encrypt | 0.88 (<0.01 ms) | 0.92 (<0.01 ms) | 0.03 (<0.01 ms) | +| EncryptionScheme::decrypt | 0.75 (<0.01 ms) | 0.78 (<0.01 ms) | 0.04 (<0.01 ms) | + +## Findings + +- Keychain creation is dominated by the 2048-round HMAC-SHA512 PBKDF in the mnemonic-to-SSK path. ≈ 3 ms. +- Per-recipient DH (secp256k1) is ≈ 80 µs. Outbound shielded transfers to N recipients cost ≈ 80·N µs of crypto on top of proving. +- Symmetric encrypt/decrypt over a 49-byte Account note is sub-µs. Bulk encryption is not the bottleneck. + +## Reproduce + +```sh +cargo run --release -p wallet_crypto_bench +``` + +JSON output: `target/wallet_crypto_bench.json`. + +## Caveats + +- Single-thread, no SIMD acceleration. Bench dev box uses the pure-Rust secp256k1 backend. diff --git a/tools/wallet_crypto_bench/Cargo.toml b/tools/wallet_crypto_bench/Cargo.toml new file mode 100644 index 00000000..a0b223f6 --- /dev/null +++ b/tools/wallet_crypto_bench/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "wallet_crypto_bench" +version = "0.1.0" +edition = "2024" +license = { workspace = true } +publish = false + +[lints] +workspace = true + +[dependencies] +key_protocol.workspace = true +nssa_core = { workspace = true, features = ["host"] } + +anyhow.workspace = true +serde.workspace = true +serde_json.workspace = true +bip39.workspace = true +rand = { workspace = true } diff --git a/tools/wallet_crypto_bench/README.md b/tools/wallet_crypto_bench/README.md new file mode 100644 index 00000000..84a67bf1 --- /dev/null +++ b/tools/wallet_crypto_bench/README.md @@ -0,0 +1,20 @@ +# wallet_crypto_bench + +Wallet-side cryptographic microbenchmarks. Single host binary, no live sequencer or Bedrock needed. + +## Run + +```sh +cargo run --release -p wallet_crypto_bench +``` + +## What you'll see + +Per-operation `best_us`, `mean_us`, and `stdev_us` over 100 iterations (plus 2 warmup): + +- `KeyChain::new_os_random` — full mnemonic → SSK → NSK/VSK + public-key derivation (HMAC-SHA512 PBKDF dominates). +- `KeyChain::new_mnemonic` — same pipeline, mnemonic exposed. +- `SharedSecretKey::new (sender DH)` — secp256k1 ECDH per recipient. +- `EncryptionScheme::encrypt` / `decrypt` — ChaCha20 over an Account note. + +JSON output is written to `target/wallet_crypto_bench.json`. diff --git a/tools/wallet_crypto_bench/src/main.rs b/tools/wallet_crypto_bench/src/main.rs new file mode 100644 index 00000000..ac969276 --- /dev/null +++ b/tools/wallet_crypto_bench/src/main.rs @@ -0,0 +1,173 @@ +//! Wallet-side cryptographic microbenchmarks. +//! +//! Measures: +//! - KeyChain::new_os_random (mnemonic → SSK → NSK/VSK + public keys) +//! - KeyChain::new_mnemonic (same, but mnemonic exposed) +//! - SharedSecretKey::new (Diffie-Hellman shared key derivation, the per-recipient cost) +//! - EncryptionScheme::encrypt / decrypt (Account note encryption) +//! +//! Reports best-of-N wall time per operation. No live stack required. + +#![allow( + clippy::arithmetic_side_effects, + clippy::print_stdout, + clippy::print_stderr, + clippy::std_instead_of_alloc, + clippy::std_instead_of_core, + clippy::float_arithmetic, + reason = "Bench tool" +)] + +use std::{path::PathBuf, time::Instant}; + +use anyhow::Result; +use key_protocol::key_management::KeyChain; +use nssa_core::{ + Commitment, EncryptionScheme, SharedSecretKey, + account::{Account, AccountId}, + encryption::{EphemeralPublicKey, EphemeralSecretKey}, +}; +use rand::{RngCore as _, rngs::OsRng}; +use serde::Serialize; + +const ITERS: usize = 100; + +#[derive(Debug, Serialize)] +struct OpResult { + op: &'static str, + iters: usize, + best_us: f64, + mean_us: f64, + stdev_us: f64, +} + +fn time(op: &'static str, iters: usize, mut f: F) -> OpResult { + // Warmup + for _ in 0..2 { + f(); + } + let mut samples_ns: Vec = Vec::with_capacity(iters); + for _ in 0..iters { + let t = Instant::now(); + f(); + samples_ns.push(t.elapsed().as_nanos() as f64); + } + let best_ns = samples_ns.iter().copied().fold(f64::INFINITY, f64::min); + let mean_ns: f64 = samples_ns.iter().sum::() / iters as f64; + let stdev_ns = if iters > 1 { + let var: f64 = samples_ns + .iter() + .map(|s| (s - mean_ns).powi(2)) + .sum::() + / (iters - 1) as f64; + var.sqrt() + } else { + 0.0 + }; + OpResult { + op, + iters, + best_us: best_ns / 1_000.0, + mean_us: mean_ns / 1_000.0, + stdev_us: stdev_ns / 1_000.0, + } +} + +fn main() -> Result<()> { + let mut results: Vec = Vec::new(); + + results.push(time("KeyChain::new_os_random", ITERS, || { + let _kc = KeyChain::new_os_random(); + })); + + results.push(time("KeyChain::new_mnemonic", ITERS, || { + let (_kc, _mnemonic) = KeyChain::new_mnemonic(""); + })); + + // SharedSecretKey: caller has ephemeral secret, recipient has VSK→VPK. + // We bench the SENDER side: derive ephemeral pubkey, then SharedSecretKey::new(scalar, point). + let recipient_kc = KeyChain::new_os_random(); + let vpk = recipient_kc.viewing_public_key.clone(); + results.push(time("SharedSecretKey::new (sender DH)", ITERS, || { + let mut bytes = [0u8; 32]; + OsRng.fill_bytes(&mut bytes); + let esk: EphemeralSecretKey = bytes; + let _epk = EphemeralPublicKey::from(&esk); + let _ssk = SharedSecretKey::new(&esk, &vpk); + })); + + // EncryptionScheme::encrypt / decrypt over a small Account note. + let account = Account::default(); + let account_id = AccountId::new([7; 32]); + let commitment = Commitment::new(&account_id, &account); + let shared = { + let mut bytes = [0u8; 32]; + OsRng.fill_bytes(&mut bytes); + let esk: EphemeralSecretKey = bytes; + SharedSecretKey::new(&esk, &vpk) + }; + let identifier: u128 = 0; + let output_index: u32 = 0; + + let mut produced_ct = None; + results.push(time("EncryptionScheme::encrypt", ITERS, || { + let ct = EncryptionScheme::encrypt(&account, identifier, &shared, &commitment, output_index); + produced_ct = Some(ct); + })); + let ct = produced_ct.expect("encrypt produced ciphertext"); + results.push(time("EncryptionScheme::decrypt", ITERS, || { + let _decoded = EncryptionScheme::decrypt(&ct, &shared, &commitment, output_index); + })); + + print_table(&results); + write_json(&results)?; + Ok(()) +} + +fn print_table(results: &[OpResult]) { + let ow = results + .iter() + .map(|r| r.op.len()) + .max() + .unwrap_or(0) + .max("op".len()); + let cw = 22_usize; + println!( + "{:6} {:>cw$} {:>cw$} {:>cw$}", + "op", "iters", "best_us (ms)", "mean_us (ms)", "stdev_us (ms)", + ); + println!("{}", "-".repeat(ow + 6 + cw * 3 + 8)); + for r in results { + println!( + "{:6} {:>cw$} {:>cw$} {:>cw$}", + r.op, + r.iters, + fmt_us_ms(r.best_us), + fmt_us_ms(r.mean_us), + fmt_us_ms(r.stdev_us), + ); + } +} + +fn fmt_us_ms(us: f64) -> String { + let ms = us / 1_000.0; + if ms < 0.01 { + format!("{us:.2} (<0.01 ms)") + } else { + format!("{us:.2} ({ms:.2} ms)") + } +} + +fn write_json(results: &[OpResult]) -> Result<()> { + let workspace_root = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("..") + .join("..") + .canonicalize()?; + let out_path = workspace_root.join("target").join("wallet_crypto_bench.json"); + if let Some(parent) = out_path.parent() { + std::fs::create_dir_all(parent)?; + } + std::fs::write(&out_path, serde_json::to_string_pretty(&results)?)?; + println!("\nJSON written to {}", out_path.display()); + Ok(()) +} From 9efc26495bf9d183ef9c094b8fbd5c66a3518c3e Mon Sep 17 00:00:00 2001 From: Moudy Date: Fri, 15 May 2026 12:18:32 +0200 Subject: [PATCH 09/33] refactor: use canonical program IDs from nssa::program_methods --- tools/cycle_bench/src/main.rs | 48 ++++++++++++++++------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/tools/cycle_bench/src/main.rs b/tools/cycle_bench/src/main.rs index 32316b89..b87bdb3e 100644 --- a/tools/cycle_bench/src/main.rs +++ b/tools/cycle_bench/src/main.rs @@ -60,7 +60,9 @@ use clock_core::{ ClockAccountData, }; use nssa::program_methods::{ - AMM_ELF, ASSOCIATED_TOKEN_ACCOUNT_ELF, AUTHENTICATED_TRANSFER_ELF, CLOCK_ELF, TOKEN_ELF, + AMM_ELF, AMM_ID, ASSOCIATED_TOKEN_ACCOUNT_ELF, ASSOCIATED_TOKEN_ACCOUNT_ID, + AUTHENTICATED_TRANSFER_ELF, AUTHENTICATED_TRANSFER_ID, CLOCK_ELF, CLOCK_ID, TOKEN_ELF, + TOKEN_ID, }; use nssa_core::{ Timestamp, @@ -101,12 +103,6 @@ struct Cli { exec_iters: usize, } -const AMM_PROGRAM_ID: ProgramId = [42; 8]; -const TOKEN_PROGRAM_ID: ProgramId = [15; 8]; -const ATA_PROGRAM_ID: ProgramId = [88; 8]; -const CLOCK_PROGRAM_ID: ProgramId = [13; 8]; -const AUTH_TRANSFER_PROGRAM_ID: ProgramId = [7; 8]; - #[derive(Debug, Serialize)] struct BenchResult { program: &'static str, @@ -246,7 +242,7 @@ fn token_holding( ) -> AccountWithMetadata { AccountWithMetadata { account: Account { - program_owner: TOKEN_PROGRAM_ID, + program_owner: TOKEN_ID, balance: 0, data: Data::from(&TokenHolding::Fungible { definition_id, @@ -266,7 +262,7 @@ fn token_definition( ) -> AccountWithMetadata { AccountWithMetadata { account: Account { - program_owner: TOKEN_PROGRAM_ID, + program_owner: TOKEN_ID, balance: 0, data: Data::from(&TokenDefinition::Fungible { name: String::from("test"), @@ -304,7 +300,7 @@ fn token_burn_pre_states() -> Vec { fn clock_account(account_id: AccountId, block_id: u64) -> AccountWithMetadata { AccountWithMetadata { account: Account { - program_owner: CLOCK_PROGRAM_ID, + program_owner: CLOCK_ID, balance: 0, data: ClockAccountData { block_id, @@ -335,16 +331,16 @@ fn amm_token_b_def_id() -> AccountId { AccountId::new([43; 32]) } fn amm_pool_id() -> AccountId { - compute_pool_pda(AMM_PROGRAM_ID, amm_token_a_def_id(), amm_token_b_def_id()) + compute_pool_pda(AMM_ID, amm_token_a_def_id(), amm_token_b_def_id()) } fn amm_vault_a_id() -> AccountId { - compute_vault_pda(AMM_PROGRAM_ID, amm_pool_id(), amm_token_a_def_id()) + compute_vault_pda(AMM_ID, amm_pool_id(), amm_token_a_def_id()) } fn amm_vault_b_id() -> AccountId { - compute_vault_pda(AMM_PROGRAM_ID, amm_pool_id(), amm_token_b_def_id()) + compute_vault_pda(AMM_ID, amm_pool_id(), amm_token_b_def_id()) } fn amm_lp_def_id() -> AccountId { - compute_liquidity_token_pda(AMM_PROGRAM_ID, amm_pool_id()) + compute_liquidity_token_pda(AMM_ID, amm_pool_id()) } /// Pool seeded with reserves 1_000 / 500, lp supply sqrt(1000*500) = 707. @@ -354,7 +350,7 @@ fn amm_pool_account() -> AccountWithMetadata { let lp_supply: u128 = (reserve_a * reserve_b).isqrt(); AccountWithMetadata { account: Account { - program_owner: AMM_PROGRAM_ID, + program_owner: AMM_ID, balance: 0, data: Data::from(&PoolDefinition { definition_token_a_id: amm_token_a_def_id(), @@ -406,7 +402,7 @@ fn ata_create_pre_states() -> Vec { }; let token_def = token_definition(definition_id, 100_000, false); let seed = compute_ata_seed(owner_id, definition_id); - let ata_id = get_associated_token_account_id(&ATA_PROGRAM_ID, &seed); + let ata_id = get_associated_token_account_id(&ASSOCIATED_TOKEN_ACCOUNT_ID, &seed); let ata_account = AccountWithMetadata { account: Account::default(), is_authorized: false, @@ -430,7 +426,7 @@ fn main() -> Result<()> { "authenticated_transfer", "Transfer", AUTHENTICATED_TRANSFER_ELF, - AUTH_TRANSFER_PROGRAM_ID, + AUTHENTICATED_TRANSFER_ID, authenticated_transfer_transfer(), &transfer_amount, prove, @@ -441,7 +437,7 @@ fn main() -> Result<()> { "authenticated_transfer", "Initialize", AUTHENTICATED_TRANSFER_ELF, - AUTH_TRANSFER_PROGRAM_ID, + AUTHENTICATED_TRANSFER_ID, authenticated_transfer_init(), &init_amount, prove, @@ -452,7 +448,7 @@ fn main() -> Result<()> { "token", "Transfer", TOKEN_ELF, - TOKEN_PROGRAM_ID, + TOKEN_ID, token_transfer_pre_states(), &token_core::Instruction::Transfer { amount_to_transfer: 5_000, @@ -464,7 +460,7 @@ fn main() -> Result<()> { "token", "Mint", TOKEN_ELF, - TOKEN_PROGRAM_ID, + TOKEN_ID, token_mint_pre_states(), &token_core::Instruction::Mint { amount_to_mint: 5_000, @@ -476,7 +472,7 @@ fn main() -> Result<()> { "token", "Burn", TOKEN_ELF, - TOKEN_PROGRAM_ID, + TOKEN_ID, token_burn_pre_states(), &token_core::Instruction::Burn { amount_to_burn: 500, @@ -490,7 +486,7 @@ fn main() -> Result<()> { "clock", "Tick (block_id+1, no multiples)", CLOCK_ELF, - CLOCK_PROGRAM_ID, + CLOCK_ID, clock_pre_states_tick_at(0), &clock_timestamp, prove, @@ -501,7 +497,7 @@ fn main() -> Result<()> { "amm", "SwapExactInput", AMM_ELF, - AMM_PROGRAM_ID, + AMM_ID, amm_swap_pre_states(), &amm_core::Instruction::SwapExactInput { swap_amount_in: 200, @@ -515,7 +511,7 @@ fn main() -> Result<()> { "amm", "AddLiquidity", AMM_ELF, - AMM_PROGRAM_ID, + AMM_ID, amm_add_liquidity_pre_states(), &amm_core::Instruction::AddLiquidity { min_amount_liquidity: 1, @@ -530,10 +526,10 @@ fn main() -> Result<()> { "ata", "Create", ASSOCIATED_TOKEN_ACCOUNT_ELF, - ATA_PROGRAM_ID, + ASSOCIATED_TOKEN_ACCOUNT_ID, ata_create_pre_states(), &ata_core::Instruction::Create { - ata_program_id: ATA_PROGRAM_ID, + ata_program_id: ASSOCIATED_TOKEN_ACCOUNT_ID, }, prove, exec_iters, From 4a8825e63c57f80c99ab1f1c9518582e10143c23 Mon Sep 17 00:00:00 2001 From: Moudy Date: Fri, 15 May 2026 12:53:04 +0200 Subject: [PATCH 10/33] fix: ci --- tools/wallet_crypto_bench/Cargo.toml | 1 - tools/wallet_crypto_bench/src/main.rs | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/wallet_crypto_bench/Cargo.toml b/tools/wallet_crypto_bench/Cargo.toml index a0b223f6..aa0e51b1 100644 --- a/tools/wallet_crypto_bench/Cargo.toml +++ b/tools/wallet_crypto_bench/Cargo.toml @@ -15,5 +15,4 @@ nssa_core = { workspace = true, features = ["host"] } anyhow.workspace = true serde.workspace = true serde_json.workspace = true -bip39.workspace = true rand = { workspace = true } diff --git a/tools/wallet_crypto_bench/src/main.rs b/tools/wallet_crypto_bench/src/main.rs index ac969276..98c6fbbc 100644 --- a/tools/wallet_crypto_bench/src/main.rs +++ b/tools/wallet_crypto_bench/src/main.rs @@ -26,6 +26,7 @@ use nssa_core::{ Commitment, EncryptionScheme, SharedSecretKey, account::{Account, AccountId}, encryption::{EphemeralPublicKey, EphemeralSecretKey}, + program::PrivateAccountKind, }; use rand::{RngCore as _, rngs::OsRng}; use serde::Serialize; @@ -89,7 +90,7 @@ fn main() -> Result<()> { let recipient_kc = KeyChain::new_os_random(); let vpk = recipient_kc.viewing_public_key.clone(); results.push(time("SharedSecretKey::new (sender DH)", ITERS, || { - let mut bytes = [0u8; 32]; + let mut bytes = [0_u8; 32]; OsRng.fill_bytes(&mut bytes); let esk: EphemeralSecretKey = bytes; let _epk = EphemeralPublicKey::from(&esk); @@ -101,17 +102,17 @@ fn main() -> Result<()> { let account_id = AccountId::new([7; 32]); let commitment = Commitment::new(&account_id, &account); let shared = { - let mut bytes = [0u8; 32]; + let mut bytes = [0_u8; 32]; OsRng.fill_bytes(&mut bytes); let esk: EphemeralSecretKey = bytes; SharedSecretKey::new(&esk, &vpk) }; - let identifier: u128 = 0; + let kind = PrivateAccountKind::Regular(0_u128); let output_index: u32 = 0; let mut produced_ct = None; results.push(time("EncryptionScheme::encrypt", ITERS, || { - let ct = EncryptionScheme::encrypt(&account, identifier, &shared, &commitment, output_index); + let ct = EncryptionScheme::encrypt(&account, &kind, &shared, &commitment, output_index); produced_ct = Some(ct); })); let ct = produced_ct.expect("encrypt produced ciphertext"); @@ -163,7 +164,9 @@ fn write_json(results: &[OpResult]) -> Result<()> { .join("..") .join("..") .canonicalize()?; - let out_path = workspace_root.join("target").join("wallet_crypto_bench.json"); + let out_path = workspace_root + .join("target") + .join("wallet_crypto_bench.json"); if let Some(parent) = out_path.parent() { std::fs::create_dir_all(parent)?; } From 891b23c18a7766c8f75ececfd2d6bb48fae3396b Mon Sep 17 00:00:00 2001 From: Moudy Date: Fri, 15 May 2026 15:27:30 +0200 Subject: [PATCH 11/33] fix: ci --- tools/wallet_crypto_bench/src/main.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/wallet_crypto_bench/src/main.rs b/tools/wallet_crypto_bench/src/main.rs index 98c6fbbc..df52aacf 100644 --- a/tools/wallet_crypto_bench/src/main.rs +++ b/tools/wallet_crypto_bench/src/main.rs @@ -10,11 +10,14 @@ #![allow( clippy::arithmetic_side_effects, - clippy::print_stdout, + clippy::as_conversions, + clippy::cast_precision_loss, + clippy::doc_markdown, + clippy::float_arithmetic, clippy::print_stderr, + clippy::print_stdout, clippy::std_instead_of_alloc, clippy::std_instead_of_core, - clippy::float_arithmetic, reason = "Bench tool" )] @@ -88,7 +91,7 @@ fn main() -> Result<()> { // SharedSecretKey: caller has ephemeral secret, recipient has VSK→VPK. // We bench the SENDER side: derive ephemeral pubkey, then SharedSecretKey::new(scalar, point). let recipient_kc = KeyChain::new_os_random(); - let vpk = recipient_kc.viewing_public_key.clone(); + let vpk = recipient_kc.viewing_public_key; results.push(time("SharedSecretKey::new (sender DH)", ITERS, || { let mut bytes = [0_u8; 32]; OsRng.fill_bytes(&mut bytes); From 57173cc140b7e7e2e94f0175b10f8c63e750470d Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Fri, 15 May 2026 17:24:24 -0300 Subject: [PATCH 12/33] make authorization propagate transitively through chain calls in the circuit like in the public execution --- .../privacy_preserving_circuit.bin | Bin 579060 -> 583212 bytes artifacts/program_methods/vault.bin | Bin 413544 -> 413572 bytes .../auth_asserting_noop.bin | Bin 384716 -> 384716 bytes .../auth_transfer_proxy.bin | Bin 403556 -> 403556 bytes artifacts/test_program_methods/burner.bin | Bin 389324 -> 389356 bytes .../test_program_methods/chain_caller.bin | Bin 405500 -> 405520 bytes .../test_program_methods/changer_claimer.bin | Bin 389276 -> 389276 bytes artifacts/test_program_methods/claimer.bin | Bin 386124 -> 386156 bytes .../clock_chain_caller.bin | Bin 392612 -> 392592 bytes .../test_program_methods/data_changer.bin | Bin 385256 -> 386796 bytes .../test_program_methods/extra_output.bin | Bin 385648 -> 385676 bytes .../faucet_chain_caller.bin | Bin 0 -> 401332 bytes .../flash_swap_callback.bin | Bin 394984 -> 394984 bytes .../flash_swap_initiator.bin | Bin 411212 -> 411148 bytes .../malicious_authorization_changer.bin | Bin 392192 -> 392168 bytes .../malicious_caller_program_id.bin | Bin 384228 -> 384236 bytes .../malicious_self_program_id.bin | Bin 384208 -> 384208 bytes artifacts/test_program_methods/minter.bin | Bin 386472 -> 386440 bytes .../test_program_methods/missing_output.bin | Bin 386252 -> 386252 bytes .../modified_transfer.bin | Bin 385712 -> 385712 bytes .../test_program_methods/nonce_changer.bin | Bin 386792 -> 386792 bytes artifacts/test_program_methods/noop.bin | Bin 384256 -> 384256 bytes .../test_program_methods/pda_claimer.bin | Bin 391252 -> 391228 bytes .../pda_fund_spend_proxy.bin | Bin 404016 -> 403980 bytes .../test_program_methods/pinata_cooldown.bin | Bin 405136 -> 405112 bytes .../private_pda_delegator.bin | Bin 395428 -> 395428 bytes .../private_pda_spender.bin | Bin 406144 -> 406072 bytes .../program_owner_changer.bin | Bin 386192 -> 386192 bytes .../simple_balance_transfer.bin | Bin 386100 -> 390832 bytes .../time_locked_transfer.bin | Bin 407712 -> 407716 bytes .../test_program_methods/two_pda_claimer.bin | Bin 391972 -> 391968 bytes .../test_program_methods/validity_window.bin | Bin 387572 -> 387572 bytes .../validity_window_chain_caller.bin | Bin 410120 -> 410168 bytes nssa/src/state.rs | 1 + .../execution_state.rs | 22 ++++++++++++++---- sequencer/core/src/lib.rs | 14 +---------- 36 files changed, 19 insertions(+), 18 deletions(-) create mode 100644 artifacts/test_program_methods/faucet_chain_caller.bin diff --git a/artifacts/program_methods/privacy_preserving_circuit.bin b/artifacts/program_methods/privacy_preserving_circuit.bin index d9f6f94df5296dad95dabb6a03fa91144d3e16f7..2d8e902cf8275fd57b4838a7a846e518f65f9701 100644 GIT binary patch delta 170663 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�k0A&p$r9s<2#vo08&9eXPCpg5 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 nG`%)y7?+a$T3X10aR#oQ$vcLEDM?RUU=c%Wj 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

vos{ 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 MD&`DLe&)gd2hlNd=l}o! diff --git a/artifacts/program_methods/vault.bin b/artifacts/program_methods/vault.bin index 584176035b0dbd2b2e12c48cc01c77e1b4c5f04b..7f7ce6d6f61c01784558f736a593d1ea4b6417dd 100644 GIT binary patch delta 10878 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 delta 10906 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 Qx5nf7Tdh`^yX1HO5BmdHWB>pF diff --git a/artifacts/test_program_methods/auth_transfer_proxy.bin b/artifacts/test_program_methods/auth_transfer_proxy.bin index a31221344762fbd3438b58975ed834fbcdf1db8a..490223a58525e4a89e01066e0f73ec45030c26e0 100644 GIT binary patch delta 15840 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 delta 15812 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 z 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 F{a;<(&$|Es diff --git a/artifacts/test_program_methods/burner.bin b/artifacts/test_program_methods/burner.bin index 3873ab01503260aa210d814454bf7512dcc96d07..57bb3d7794610c0127e2bf2ca64176d5d4eac77d 100644 GIT binary patch delta 13721 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¨uChvkOM|mZ3K@4!!v`w2RB%HPaqkZP+INS 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 diff --git a/artifacts/test_program_methods/chain_caller.bin b/artifacts/test_program_methods/chain_caller.bin index a6fe86e07f7ded4eec0cbaadff73a25e5aa9129e..c36220de29d0d319f4af6ef4ee8f82c35193d51d 100644 GIT binary patch delta 15568 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 delta 13440 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 diff --git a/artifacts/test_program_methods/clock_chain_caller.bin b/artifacts/test_program_methods/clock_chain_caller.bin index 10cd69100cba559f49e9859bfddb9053ff519023..ee237e70fef8a03fbf3198ea98c0c4d4cc72b9bd 100644 GIT binary patch delta 14029 zcmbuEd3+RAw#QE`AyE?2fdqoGR5t;G#?V{!!lDTR28arX7&J8B*y7*0-A{$Z%^Hm!o zO(1$L;!Nw$7p#v=OB>vW)(E{H;@qiJ)hV@-0-bBJX60`v>R9Q%LOh)7e~mweT#NJEEL_=2U81?g^8*pQSJ31->iQ)trKx~%mX$qm}tg6kqB zmo4Gxnzc=r_2$^K$!l}_7N_;=GK=UBbWLtFY@x^_!_IbUXW}~5BvGWM9d%jDX=6{Z zv6G$J70g=dn!VJ;MVGqxi!!;H>PsW|+1yxF9?4(Jl}7(KlE3wdj?2;|gi-s)Q7T6? zCnNgZ9{v{2SNA!Qm@3gCfr#fhy8jCzZSsCh()iN7+GL5AvGI-IQMX#iq>18rIt$Lr zl4u7TU)Vs@lr2%E7++r)UH%2%ubnbrH_^=Q5^dq*&yRmeR9dRb`Q|I4VgpavPgE;O zBteg6NB09n8^D>2XMlI)NR-X&+yQp>l4t`P@Afs(Auz;f>lG@)gB=D1-M=9kc)Nu< zVS?t!1n@L)HscQ85#?gOh4BsGYVdHz^T9V@zLuWa`VYY4z-f##zb6WSFOISL!2$jr zxzr_rw0|7cVPMw;3uVNJr?%-oZ{1Y5cV^tpF}e;UyI|z`-s-%OEit~8(>XsH^vuZU&ew{7_R_pX0vgH z79&n|5Ln8`1+G0vRPT{!7vuHtdl~Fb81%#;qAdpA2`)1j*zpG_G&nE@JjB4YKN2ly zHbCL%EFP?Ge!$Vh!!Q6mk!3;y*a?GbnFr$ZzxIN=8M-U;y z_|4!0;M=tEOe|3G;4N4243+30 zllvL;qy#J^vh~GHD0u^qJWJF#Orl(jYbo+~aQ3wliShMtI4U3Jr*caA38I3LaDdhN zGjM2b5f(BWpf4HDHcLE>qo0vH(*6WsS4B0F57xorM+l)?Og;E7COPl2PnF?wojQ)e9E75gjjtMW#@ zms||bw_w@^X7_sV0)yJ0M77UR{zvmF1iJbriOQJxO!%{4tV9x9H(QmD@i%ab)tY1c zgpLJg5ccsBrLxge$>4)tYHEK1t;O#+(?ybdgZ6M8ulf?(k5!5;8HCa)Ge(I?SL#(V}x6&Np$ zvqHsqun7-VunDh%ize#Z_%pc7zymvSlf%%Diehh4#WQnyP ztw8?;UJ*E0W7%v4k7!3GYt!d)l_f7A~(b&lnS()9h zfuDh%c5K-h@KP|xc#wp^80tg;uR|In)Na%ih&5_u46Edocu$D0Lkl#30_nXa$DEC=#n@CLR%3eKCXXH0!>Y&doCuB@&b}%!5#W;eGhH~C$g+VA2@|5<}jJ_z{N9kotIn&9rr*dv++8xsa)^E^T8{@ z33>kpZ`4_#&RSd4AJBMkoq_AX`|m~FA^)@>nEOH@+PDORw5+bV0%i7~-mGrUtJ9?N(ScmU*=#kdns+pmO&r!BEO;&_qF(VLQme!TKy8t#CzBr0cZJpXb; z|4~GO@eAM$kH9b-7@A>9KDJju7iHtGfm5egs4r7|8r*cJ9*F_{P!||aM5YpaNFP_I zzZDH*D!cl?lS;4$oLKM%xEgog1d|Q*4TB1xP&4R{;CG-v>u6de-URP5DCF!MJqd;5 z+4x}aA241PV}Yk?wdP{sP37O%foT!QWsT@<%*&mx7iJE6jTKzL9G?R=?$CDdA)mfu z7dugB@Z$=mcOOjqg&ex>AW(yGwPvEuke?^%bwP`a~Bv2PIQE8!A@|Z zgWLn&Z9*Qnc7tSSdoukXM zgoP=#Dim$WQs`!NaRR((iC&w7y*SjT>zlV#ozX*hIinhn7a1NWN9CTv%bc>-4cC`T zG=%Me3*xpd(_P=+pQC!LOT@I#0F;?Q&O~tOUAnp#!3VKE(UdP6h+KPKqEk%%9I#;z zd3rY*G7AecYzKy7GiU0j*k!{Y_�mo@-$!IC04Ih{_IOA*UQIMAB^5kKciVk<8#s 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 N8aO<$CMbV);6EVv=BNMw delta 97045 zcma%k3tUxY*7x4eIr{)dMC2eKA|1{FLPR7oF|VM2cnwWWjT8m(k}2M)Oh7nDW~OfR zF(X68Yh)DYp;ChaBy$>U$ebB-n6fg*X|Sio9_vH1Dhg9FVqFIj~_f*=&9Zy!BBx$t2o&@F)?cng9^oMB8To?uh% z%B_Mxx6y?^FrOwdzB9=%wKHspWGoO2gTlACOGpUUzk%d6dES^Na~hE$~!D`m`ZT zWKK!QlO1b>4Br#phDcG2lSsxaWMm!_;vkzLn7!kEwh4y#UPoo{WHb1ZhrqWfWvt8a zk^=0u5YZmGPq2rJLYybc>(-XrBW{)r1-;m4@mw!B@mqe;Ku32&|2i?_>!%HdumqtXs!sT3 zcg0> z1j~$}*{t;J-zfO-X4(KK~Rcms9I-mg*cpg<3KTa;`9&RpbR5exmfLz~wHjBR~TfI)WWs~V^m&ljBY)q)z(PK2LJtZgh zu=!~&(hV-+=&pClM_%6}JXkn`zItW^Bt2=7@;#|vmLiB$DhAso*Y*fxdCBtS9%%Iw zvbVP%tL?Y)W9Nk=aLaW^DH=f0hl7sxCVGT>~NK_T?>KU?}?jJ0A$hrQbnDB^P>mQ<;Q&=Zo z^WPg>y9wRD+tt)~*QS0Xmj{ezf=zAunEzr#A+1cg-EYHsprY^(+VzeGK6VJ_X_VJ`gh6Bi}LFqw0+I=nFiQVOLp4@R&Z#% zWH`22G8{e!yw4LJkn3p=uk+0C?8Yp;h6!@7=Y=ZA!FY=aVZdQVlr{^N%_hOp%?)m& zMCv&fw{C)LBDz_KL)6bGeaqAGk|$)1f*~^BkRfz8S_;RTEWJhumcB0tRUU7}S9uIV z46MaWQs|Z;3^Eji)pvZeS!y?g z<;|OxQDlszvS?bNh+kl>>thJb?^6JOF!U4q6!fbLL<0j0A`=1){l!3-q_-g#&QTDR z(AzLT>|HRRE&xsyhA)4fK1_`*;q4&unT7M#9;C?KzmT7J5=coO}b}% z<`I)oFk2{{%o~HbE?PEAn1%C%TxBAJstdyE43;7YsZO-b9}7?< zf=JO|-#<+<^si&~@=U293iH^Z63H+if!U9gOBPQ!bYz`qKb9!jD+;B8{;1>lY6+Ud z+?ekU&AHpla;x16!s}2_i^*O-$jyGJ++;seZL%M$H~mhFV=|0VfW-q#5-GuKx4y{i zwpo~*7h`gM)nJb}YOqI+GuWeEG}xn`g_G4`vV6}-G0$$JGy%(t_l$OT5BwG-3~8yr zFFao|JXj|cJSZ9s5edeEhJSWJ4JhOtAG@v2#~ymY#~%K7#E6^T z_DHd(J*sCEx+z3ev8%MdP# z_Q*P4LwG*gOsUB1(RIFv27Y$ic0YS4(s0}nA^xzgpFK+Svq!(XtKW~E(0 zmTrQe%_f&D5=JQbpHfKPbh+8?-}f~7BRDb1$&QBaF%e>N69nF@cyzjK47K?s$IGTV zA?`sd&3my<%zyHxvsdNep>g83^6Jn?zsBjmBk&yr2D7}c*eW-;8Ai^GPAcjWr8{(XN@J5_YcVoJSlb}{@>&WjC_%SNxQ+8f?m6m4=$ zVzS)+;B>KBKA#wj)sF=cMp;&=W9+PaFELfl8)%eEw+G3$BHrkA2cr_BS`;lNtUeV@ z2)E_oNgv5eA_v)u?r5ZI28fVrs>;*pdEd#kku=F{LB=ViH$Y zJhgSOwSbr

  • LGF6gkBtfJQ4=T(~YYZvX~XH{BQJDgOLE6C9d1DnQZv@z>c+PD9; zJls{_T9xQPoXOJ!KVGfUBxJ4?)QSsM$@Tri+1MZC8~q20|B!>CVr~D^(q;wY0xfOw z%si@949K;ICU{`}_OM&$d0_r_Q??(GB9n~>JmK51kj|H6sgCj1jt;CJzchs9OBunE zjd;+x2|9Pf*hXB*cf(96U^*8tzLZc7z68Drd=vO4j3F%0A!CC~C}hGfpt&?{d! zGkhgq*B)uTK~zK;p>^yx`Pvk1wJ7-lB=3Sq(S&)#gjrA`IeWxBwT|3Q)yDs*2>VDr zu9XyEcV>7nK`3}IUob>KW!6N@7bQ?%DCUqsVnGD_*_I$0?D=AWy$e2fah80mhh*x1ZY;>ZGqCMId14Lx78H3HB z9b~W}LntzYw=jFeG-xUlOSaWmvaOcv)@g2bTc%rqwa&v3n(t8ne}eiw3i{Q#WBzw9 zh)i%d^cUUHb2p19nrY~`bTHRs58sCdV2uac#wn|ENm4_F$*7LQv)yH>67F7SR9#oN z;!?o>CcpQ6`Tt_*S0@#~N0tk*2*AcL^n5#d6N276NV)c*Ic%^`l{I#wkxe)zmk-Wjjv(1HZZz8*B&WvN7k%l-CIC6>s_Lj46T9K?0e#;jLq2Zt!}MUgXT zaVTko5?>UW9)}hT?#ipjA!(QrUKBY!4mpM^;YD8a=nH03j%J61s(X)qCYl|YYMs(_ zxn)>5YZxux8&<@mNV#zMY@ehgRWHejT0bULwGH1OG1KI#?9tCL^ttLrVzL-$dYq@y zq*sgel;{$YO^;ViOx~dA@BG+ybJ3exFr; zO3GY0Jx<-oPnXwEp5mrt+__e6nH^WzB3aP^Ip(n$go+=V@8j6$%tF4RlpwrQ1amz!r?967ecV#sH*p;Cxj zhGM+hcR7*DTPMqw9x;LwMazz)ooYAycEv3s{iW=1B9)7qcF9+tnCjE8TV>DKqq3X0 zoH8?+9o$p3Z6*`Rq$RV0SzzNn9XitPd@+TQBo#WxX;PfEE{v=$z^FL z?ju#@JvCjtkG5m({Zex4+>tbLtm*ruh67j_$hndJ@|E-+ojGr%D-{IH8%%Pk^L8-D zVeb8@7$9$J$JS!Lcc)~~e3Gn+pMOYXCy&Y3GUi7*nxQUHHl%B+aa_<;^SRph;yw50uoExJ3XXKVt*!_gM9n5u z$|^&#kL2w7-SEC#nRT3cmcB5UIZn%Y3pW7mSQN~p538(;J`!2bQTgiPEG9L|6PN5^ z()p@uOTHGFqe(u$^lRoZzpC;X2uV-KtCxRnD>{!=G>+HGFzHe&g>G8)pT%XuV8+Bh z$cwUr+0M`8;_NG^r)trP$;`*`7gZ}of7X2ME4gXaXjXJd_FUaaQZ1{0Uuw`gMJi`q zxH;)>THY&FN7f-?qDM73vDCgBInRk~+>cd@o*OK(N4}HGo}bE+|0&;keliIqu2+O| z)~iCdUa%or{8J9dMOVLIh&}F+AB~V18kDR*GkCH_@XR}6&T)%TDYxI40*ZUMz z<*tB}XWGTj=h6%xDw~DkK=+Hu3q}Kfq+4Hr)z#^-%kDwjCp!mUQ zwTL3C9RJ#Qs$k1&gK7S%e=XX}5ro~eq|HV_J4yqI5mcJx&QNvUGB ztEH2FkDK_q!Yz6Ice%G-KW_dxN^8hKxnl33@iT_Y%qqw|Duq?B3=Ip*CY)56BtaGX zB|+tHL$DFBXAl&*16F;sbrv^PE`1}AolKN#-Uw&O56i835+Ga4yjXFJ98;Dx(ve~@ zwc_kRU~x+PlAf}d1e~r2qB?jNjHCHfIr847sBJ#hoJOrFn8M3OGRJt?cc0B~!9-bV zl{9zynp~*hpyO?M;=V_FM4dcN9Z^f1{)AkzFN<9qBH!D$fhA3q*Y6Kx;iKf;`@{Wy zo`&ZMSimb=-E(oj;GiMA=xw=We}X0I&~ZAl`%O6!2W)H;syL8j09!6OFqEP6<^zLS z!$R4;JUBc#<6+Z9lwrbV%_JC-dqHWU;QTIxo>RQ4nQ)0bv3!!7V%A^Q$Ytey&C2h= zt8q*yKX%x^`^O)uMo(Ua^#)M_3r-utlU&Lwx~Z1swp6*w9)J~ zLWP^M<=cm}hOS*DPdsd6$%~Q6CYh#TfkO?Gj~{kthgN_WD1UxJ+;-%SrUm>yI+7J_tcp37%*I>e6AI z99lV>Njv1cN?V{bgZzx=DHBIV27^y2l_bmZsmhV8QI_u^k(%V;@0^Kt6sydlS1_}P zJVwc6SKX=MSyiizIdSXIO1DkTpn+mWhi@6KUnX^+4HG(Np-Jvnub* z9FZlxFSmXe%o+yls8wc`rrKj7o6sn){%C)o>AZ4GjU!0y1m%F%n{#r^$9{pPPi3jh zV8KbZ#x7IY$qiNM9}iWURa)PU(psuY8+S?6%t7bJ8(8w6LZnY}Tbvu|{p@rn^bdFbx@!G} zshA4hmYe_N$BJ&q*ZwrrhC~S?=t#3Nk9?Go;t`p_Jd8BID39?HTZ-7Bf6C`uMpEMW zMX=I%9`%i|0rW*z2$v3KIUK(m(rkirf zU)zHnzo?T$e2!|vq;@)Q)_&iWD=(i6cKoc(BTxUXNa0sme#uVS#~{ z$=z-?o!oH+GdGnHG{gx9ksZ=^7RlJI?iPe=ou#$CaZmlN*Hk-8<3-5vSA6BND`wZe zR$m#)JSye3D}K32)fv}z3WkFcye)~I&Pt?YipV&BJXvs1az31O0?!RhOo^~zrkaAV z-gW5|OpCs__fq;p7J4 z;jD{7Mxe=TkR5+3?PilI?N+JMB1x5URO^U7Wrr&5`%hM42#EIbPlRun^pn;*K`v~a z!=%cptF4={h;f&*zxHDd?p4KKU%{HiC@=apnn?zEHxh>^H+}mP5l?-0oZ$&*-Zd;X zyyb1*V-^zS=I>pJ<<}5D4D!`$F2t&uA23S0>R9v-W-v()7{Zbskh6ar${PH5tG5`G z=u`}oZv+Rb}9Dx%?sy)IA4R z$)UIAkTVzFno6F2>6WXf@A!Em4er99XNZBx5AiY@&G9(Cs{geh%-F8g@sND$m+`C! zoALjgVae4yZU@hAJXvta18b?=c`SmXz%yEJ*aubu8RK+XZ#9;Hd zD!Y4FmHn8~a_Vh+ItMaaG*v4)NqI`3#yXpoF zlX#Sec+xNFgbbzFk9|>{k!WHxoUpMx!Ebwrzp$jqyv;1mhY|R+Zm6c=F}}W=xR>Zb zp5j!(*`DJ2#Ej72oyMcQ#dlfK9P;2L=7#C2)f?wK zr}Y%G7)yGFLXO_0XLzecv;`(9(eyx%`g``x2Tvj*D9e9r#hr5PE!g9JKjUe>;$XAe zB0rK1^v5*}(*x8oI& z_RdoXWeQ2o;S>GD#?HnjKgWao#eP%(*7584M1Qfb243LV{^IKz*uZ@QM1+Gpo){n= zVhx-4jQ}w?P?{bGomfoCZL+BuQL7GMO5^20;tcbr)18~qw9V$t+}Ky#Px+4Y6-W9MIW1WE zW9kr`eq?S_y7P8lF_xK4$JD+gzsUz##XaoB&CX`4i1RtePN&r-Zf4=89m*;mJ;u^) zyT!qvQ$#LrT0F(S7^l*=@#au?mis(sP?)&az}&d=RD}4E_+0)U^l1pQmlv*I=7R~X^)6=3`{!BtA{{$4UNv!M@2IuLfSBK2MD}vnD`w# zSt39L28{HHn$gsxb@)?W8!!4XxA*y_ zcr?Q8gIx)tU!dD5^?6t~ysBar@PzxG=5S|tOoA9Z)vX3g6@y0m&?4bcI-cKJiaco{ zVAP7PhYZtXYT+jO@6#4IFqIEkQRTax=WGM?PW82G`RaHx=xppqye$F!8~d@- zb2J8HV1ua5KfkE`N@`cVrBUGL6UA_wl!fT^UuU@D&c9gP5<8q&K;qflbj^Mq+&4)a z>E-B#fN_tv(p;98!($#2{Up<6G=jgBirP|m(CDJ25$1UU?|BByab^vyM^vrlX~*{86wUY?r*Av z4}U^D!+QDgdryeifX(LHX2CHWzRrm=MUyD?^20h)Uf!=4Upk9MP#6EmEYa-BKR^4o zeD^2CpA0Mv1#7IS2zd*c5>9(g48Q#efzW{I+FBF;RBh4lQ z%hEPcZ8=IQT_opg*SFF~@~^Zrhx@=MPLI8px+Y`vh)S&p8r@#mM8i<8M15!oUZ#7mMjo*WPIbbM z$FHKfbpX#M{H-4^UWMi?K(khfqkY1DUEcP_g$x1Du9UK;`}3&P;xC#H_IN0aPh5j+ zXjbMLxD=``qqN~Xzq|%f0?oX=2E7Oi;6v7mgZ&(Sh(uP+6PQ}$PJdpwR$SKUDe?Uk zzJTqDQsoJM?zs*#MuR^evJP{sBbw)}6F2&imGc6BE1ML+19DK`^Z-6H2fn``fUnO{ zUA-m;-8$&c-JeBSN&WetXR(w)dyhN|`85Ij+OyC)u=P3dI6D@=o1a7bPXzEA&tX01 zn8xFu$JEjLSAO|nH0#&*Hit0ylFkkM?2hKz)+J0 z@bnjGY3Iu;UO;=2dOPm{i)8MUT*R&4aoydyXb>`_PcA zY8}G&cxuQu%ydgt8pd=*K9tp~55JXlpJ`|T$penAE zFdAH20KBCz$i8zn)~ zJ`G>1vqj_I)zEyll^4EDF4xal`7$PPmfWAO-$uEyr+2I&-(0wrOectMEtAL-!z>I8u1Y9^g$WJmxj*PfQbdL@CrNP2dwt zVXmSHypphE0&gLlJdqE1ozy;&r@c=6NxYV@V-mkg7?W$tUdo@!m+lqkM<>_OGamH~ zviJ|<4#C$=D$PRknpHVYI<3>4_x6fD-C1%L_pX2sCD-wY3WU1k1w5rfv<*)BNEgI$ z7S05f-K$3z4etgiD_3PD@QqIAWhg86#1ralTQp0SYPGz1T5NL6)_7^M)U5Ha>``Ol zQz|ccZdX2>c`Lkzr#0SkoJJe8_H?Mcq=hQ4afysKX?cI8v3b90%ycbd1}bD~#@hdO zHaPt)>U^d%=PeOOO^y_2b)`7N-A~h{pmeWKr?mAwtoAgWO3Au3NjnjB~_g8l169%ii&h9^}bYICAKS=AL*8Suhwfky?v2h0} z*qvz58;AE1MD1167)>Q>xcB>L@O`#c^AFHu)^)yWsC2g0O{1^=Ej`|(*JFVbDvtQu za@Jb#x|sUP7%5fI_AAM&WPb2{@rawcvwO}t?E~x+yc+NxSpB^?jxM-udYRuiEzbEZ zZ7b1+@*QWy(BCl5ZdV!YXT(9QaR(ptAp#?|QWYPHc;1R1)9Nr2vrkH$tN)0x%6e7s z_&*^SNEObA&qY5h61oU!e-d#P+(qD*TEy$@kqTb_1)^V41;70Tg_)x~<|3l&w{P;L z7ZJeLRPfS^7?ukvcnKD|f!h7yW>J^|x=*mgD<86Xvs8H|I_)upHnrC{%u$$mu`1KiOJ$mRD}zq0Fh=8< zwTyU&2q8zUaG=KX(s(_)c<}=?nuTJjaw4EMBu1nA^7Ok1Qzp@wa~B5z%ChRq?uHPxJX0vvBU-!iPHF85)_8b&>#gx>-`DEz zhesLAFR&<5e?ebU)F~|wc9$aij%^y?EN1L4V(_N^N=GETR&GL+tW=&(FVIGF6wfoV z!R*^%&Ke`bY1?z8yw=P{vVftxy0Ilp8p@Y;W0Oap(A3cw zt2EI{_K)|~y7sWzl*UJ7sZG@0qV~~vgSBQp>b%#D?GmG(93?Y+F@txuGm1?N>oS9k zS6gKX=SzwcWsSl*-4yp49ID%dQM|T0i)Ma9d0Tg8W4lIiUoW8k8*{I4?>6-?c}U-_^`Em0u2Ivsv;?KBN!(g*B$}m>_szW14bqM$>PZ;#l8n z@=x;gAU5CU;8rJ=K623^*?Ac0rn3imOAy|PYj{fSY;uMZ(+W-?vz#5fBUf}fmIx$lsegF=`>y$&H{h4Dv4jz$!iT~w19Ko4reQI{8Hy!8o@A= zVcl8S57u6A)>++;F@;bQ$>#etgu`<8RLhw{H7%XxG5r~4Avb4nfAX`lO}sjaeWXmT zh4xspzc+vlz^jA&+5k4%ob-^|5K}B46wP7-mC|qPrCZ#LchnljVwVuj zX4@LV;~MEixUoO{>vkOc%i`u13jeticZB?>IDp@aM#aT}vU|MXoKL>;(GchPf#`}p z)hn$zJJ5+QB8xo?&=r4s7z<&geR%ssHkF4CX8~dbA2FOg+%t5dO|U^?G42O&hw}X4 ztPiW{!}ktH_{rgQ!2w>`XbdYK%uq|KR1%ii9QdRSm55c&A3}4tU_8pt6;@F2)8HhY}|#oQ~L24qgb#x zX0lD_0ohTL`G!%LA`8uJHHaoHhY!2lv@(Pe;my=@m~{|oA>jn zHentzO~ySKH-BX$>pKcRZh%1=!SS{*8)<6hyvG+T$jn$eZ}Bq~L(ua_t-@`jo=C4E zO+lK5+lrfG&0*!~_+YPlB8eb7HE1dS=V&I2cAh_mIoXY=d}tyIWHA${i7)cMC9+2z z`RC&{AsV9JBQ+t7AKjI`b&OTW0ZyG@1xLL|A8CAC63b;TO;gmtzMaM+lUX}!oz5f2 zvgoiOGi<_xnz*i(iC01tijIr<3uD>9UYRIaZ|t>+Rv`~KmDi1B%ln>3DNiHMF5KPk zE3Ji3N?}j9W#ie+aB{5qES7(j!t8ykL74{OM{xV#&YPrubxhT+=Y7YqSJ>k-`SEdx z{O*&j!sB=aH65%Sxb3)g{04rL*F*M4$eNl^41Rl!XMrI{c36dSU<4vX$G$VI_@(}) zYTEd?@hncf#q-BAIrnpXnd|B*>5%U1@D{7!ikpD1;f}(~C>4;4$M5w>V~|#BwYY0F zxxZ}1FG0}p5y%j2k(PJ0n%5)@q0Ic%39OH3osJ}%(4oUbsAF2xfJQ5 z1;1^wE7qGF`lOndnoN1A$&|Mcc|*}mQcU)I1?P4W;z1x{Ix?pqtwA3Xk!cIkMZhJQ zRw2SAvn$r~mTGx#+?Tg34P~ROZMXyG!LgpgK$&9|nx6Cp0I?Kz>s+hQ42Ce5!q{xl zozI%Y9%R{ReB&gnwYH`4_b0JnF@pbj60`RV%7!E^>I>a%y!&Lfs_%fOY{D$S6xlC_ zPQa~W8l6@bT!`Nu{GmeT#~*$i^NKu=&v=~eVN2&be|ns45b4Lt>Fj+mH=-PtK7?^} z5Jtd#8@L%b?J%rFbfkHp=OJwYFAcwk;CCf{pTh4gNGl;nmpg7FZqK9eAlz*Stit?f zS1+*6Te))Hv-6iPU%Fu4GHZJJ-YlpLa)+~QGXyfu;$^EBEL^bCnvUN!T}*{1Ao$P# zhp>V(7R_5ZFJrYLeHApCQFPv_)hib-TWCcb5@)if!-Qj9!=>y^v>SN%yI^YHNXjwn$2V8ty#4o(>njz zp=MxT-g7prWa9&7v&Yzo#eBnTw%O<0Vw;c%t|t^j)5*ETJn%_2`@xtczqNNN+N4LK zmMRQaV6>Bh>2Ut#ldSuL<;anQ5@w*XP^5I}QLnS9?_2rXi`g(9jG0CB<@3_8O2~Pd zZ%D%yfcY%WBXNZ~ z0|)SD=Ce_(a0Nd;pGErBgG{=h^68>FT37HNacDaJHh5!zUDstsV7f22qmyl29Tk4U z5Cp#bFRL(h`s35)j!qaeVcOJ$G4PfnQ}~7q7R$D*+ch>MzvD{QfmH~ zHGFawOZG_vrh%u^7p>ukvM}9Lui;m~_qYK*tzSa;fQ4*~G<>a1c$7ahmsxo6LY8QL z9XJl`ytVw|LUw4toOP;3S0N>BAv&yHu*#Y>Z}HLvnZP=~1pMx5Ij0se_XX9!0pMps z9m+7n@6H~;;B@JDX?JMSGenr^A0n*A9RY3Xkzf(%+2# z)EquzF&o|Mb-V+lvvl7o!!6KpkLr69-G65<+CR~({X9=L>!_L?~`LwV z9fmtvq46cpus}oFLm~WMqghmLXKB<0vfAY}A;O?_Awml7Of4LB1tFL@3AIwh`7YP}3SMZQGcu5{UUf-GzA}LJ$hb)MV-lyJYLZBR-{+U;nMA z+q8;Zd9L*ox@(yuc-?GlJo1(^4}NPI^X~i63+fbm2r7XecV6W4(|E{o_B?xH1K+!x ztsLRppf1#CuAzBE$7CB<++V{;l#7ar;gho2n2~yx2_VtH*D>uKBU~`K1cln{HOrpO zSf07y`2jD)I5+UmvT?ej=XnU_`YCz1-wO7eEh-N|2Y5He2#wSQz%*JmA?>Nky}N>q z9Ifa75c$c?bR5hCA=m}mfhoVv4+SRoLOWttVwOOle4L2igr5mzGaQ~#yN%jx;{T1$7Smxgv{ZB~0!F>~V&C4O3i=cb> zUA8quD1JF4L`Yh>ayfao@3t<1w(Xc(b|?Y@uSjA+tYss=zKR7JXF`f5=^1>^YHYBx z3ixxYna#YdK-E^t6z8GU?7HYN5fA0a!fW~VjVy@I%4gj=Y3qpA$DF-%%_{3iYs^Fk z|8XrF8LMY`9@)sJbo>#1Q`pw=fAO2FjC^y}VHVNp&rz|Xa&`DDL|lvM2E(~x&--xq z`|wKOP?u`g0aK6k@(Y1|TyPdJnq}`4mgLLwnMDESK*0JEu?8k}r0Kc8j0!HX^ zZ=+hWgpSRy42^XilPi$N={TM+e`g&Fs%I04?NQZP$)S?wm>i|BZ1XE37 zG~ZCdVx@?I?Hv{TtG(<&ez}CXv$BEwyAn2<)yMM4oh*w9aeT*4$cM)9_jkg~m*V(O zJFzp&9>Sw{vB9R)N83B_STOiQ=FjtYVfQ<87~i`K1w@SCU+-e!(zOxo9Vz^sBRCeZ zbJknD$479SG8sqlk(}8~nb_TXj^bN6M14n5TQ0nYqMA7iWqG6coZT#vTX!>eF`YlP z8|OgyZ8QynZsQY(87o;ww|A8Do*!V0AKwjs+%lS<+l|6@gPzXcDPzIh@+#|Vs2S7F z{m-y457NRAIKd4*?^T>m4N2rXUd02%nTh<&tMF_0WZwQNI*c@Y59}S2%W-Z7ku2bsUA88Tav`J6XctcN@H?@ePn+cx<%v~5rd zU-BB1*gB5ye+_jG8qYs_4SlE|-`)|*w;zX&`joQXta<_;T*|_6iuzP3i(|tl@?E9S zx%VXgc_~zTWD@s#osE}TA8YSORJ&O4I(x{}oZ8+Yh?SMXZ}k*DelNPvG=;C+i;e1yDOy+dLdW;`pZBtdS=v?;3SfH~4sdSsx5}_fZ=Jz^EJLNOGxQuvrM{TtF3;d2_n}hnne82e`0G_HfN$T2 zkn25*AKM3gOq|7k+=r){X|uT3ewZw6HXpekkE3q$#rvU!^e6cakPYQew(}mftS@if z4@a+jl3yp`(lj1;0Jbr|_HmuvuMNjyf{a`Py=neJY*rC%!PRy<-bGxF7$f z9Cn^LkGGej;i>a@@Im-RIgShu!YHTalP+u?#h8Fj&DV{!F7W3f47!Re3`JBUWnDdLtDe$BT{6ehJfsY?XTVs~+ufdnDEotwF z;VVwD2PAiFVcYmaN7z6q=;vlGM8@QLn}~`@Csj6fe@G?^NSVml+`8N^cEU)q=ZLPnzED6c#B0#t9P|`)bJ3} zWa(RYhIo&kcnhOw8|T;GLK`Yx<$lLmGzN3haW)oC`SNi#fq9nlt;gAD9`rVBYJI)E zBa@&006{qQZ8n5i%lPKEVbj!o{Nme~Ype%&awVH8wUxJb+)#(kdzGw@RCchvqlIE$ z0KZwu{H6Fq?H#Quzu!BE#a9pU)N6fkX4rj<@Z9y-DLcc)0Q8*tFM&Iod)8nLnL z97UFB#lP^;lyLb|H87=}fJttAs@jn776Y+Bz3>Q=Q!a!gYbK`@;j2Xsx)5dWJWgeb5)=Q0yUrWubps$h(B?!8fdEQ zOFp{>4toAuevH!cpC|(Oaqsug%Tf)*5Gc_=DuFFO@!9VoyYXj!=sgM;Kl4UPOMm9y zQF`rXZh9XsyZ(-%C*OFqbx1fSqdPP^10;II^R^Ob!|^_Qz*PL-_Ku|n?sXIn_uiZE zo*&+a`M0!luMco=)W)ZOfCn@|B7gq_mL*jiI^cBMF<$tDQy9Y2B);qvjZ2B|I>n+* z#ZpJdZGmrn8>N493Q;Y^#M@7?(WVr)j*dc+pZS1=@uyECXP!IXdK#M?xbSH<2KDqh zgAftw*@0Ome-GM~7>T{RCtr4k#hOwM1htLRYI3Bu7NcLq}$*x1;3uD z-JMW}?q2od%j)oaBh{autiu!%+MD04!)HUgdv|o~=5?=P0!;b{6W}dA?;{pxi0RY8 zM{(A-7X_=`IC&b(SEMI6k-m za;F}v!acx2e z?)>-~6|t&`^)+2e?dVv|_y#xwuV`XX z%=kF}OB33f{y4we1g#&LMxLO|&BH%IU#h3^N$-1)|q?;J_=**Pw|cC(9F=M__1@) zaq3h23gL-QIZdCkGh#07P6T%={fkRf4y&32@j3<&173)bSWSKcsH;+u~FdDz-2D{ zUBD?WxE9#g1z!ig7ht8*af!k|fvH34B?@i8rG4;#0R$%Gio$S2BqHbn_*22kpFQ^l zff}$FxCVS`5NYIuhIRQG;M&dtMIjUpMp)-R2pj_qVELw$Hx>9Y_)S>#vs{o~&0s7wSg=uYr&Q z0-aJ)fejia3F0>alTWA@6FvndpV0AV!1^0bl>d%~b^bkIazY(<0F#rd^&po9Y>!0bZ&h zyvQkJ6TkDi*^%-E0ETTXLvAJtr5E9J7?u+?y!w(l%-XOEB7VtbbyT##`w6eo$|L>b zeBfpW2jOanl^`xr*aJMxW>pa3*MaFZE%g$GGT=7g01#+YT+^`5{|B(U-6~i${=?Xe z5>_u!7z`X?w<`66CJK*&km4dR9GKn>(=&_$&U3+|f$6<28YR>Ku3=q%4{*JU{OiCe zkJ*%yBQik~aH~Dns>-8)Pe~xG3x7reF8BiQ?(i;t3-I~}yYQF5B@tG^NGe8oaoBPb zRxeQ)3heD-;zZzl&L3eAxv*3+#ylGM!)U0so_y71fIghaoV^1s?;R=z`w@rk5FY`AXoWF1QMK zy$e1GT;hV?1Fmqvr*c6!#4!4#%*7=ix$>utq0^Ai@b4|iD z5W23L9di*%De~ojNTJe*P259m-0###TBG3#U~*D42wZuylsFL(sYT!+D@#@Kces~5w6=*KBkEEz}sDL zE^wFAn1qeMUDwSH{3!$>>VTf#AQZdssR74;ce^y;E#S<7R&D)(7FALK4}qXuqEH3A zI<^a+qyir9!tVhGxp?&{V7m+c5ZJZB9|3n=H#@%iK`k%0o~bt5^AEK^%n^#p|9V4h zVUuQ4-+!qMOwsTwZEA&*CcomQ+Tc))-{4XqY2bU{w82)b4We)zIR0^4uIi;2x4tko zy)La@qTmm_)CC6uN4WIR4oq)i>+%u6>5q5Ko{s~k0xMpR@;3m}o7%d30r1|(bGxR` z;~>y0-MT;(a1IL4r`IdM^t!js{|0z7`1Nx&arvU@zb@7u*y02JjTEfx|Sc=O5V};~!4YSzrPL z$Y#1gA~4xh$76xBT<~~cGLg=o1WYE;aVqd$7yLLdX;kOW=#KGED%1(HAV47x zGCrALlZJKvW?=oLed3?cu+FamCJpQO1K_0^qGkP=ToAghn;k9JRh9P#ks_JjKU9+_ zUJN`Fm{hJ~uOHQ6bxj*~M=?yx!8dC81OKg>M8~~vsiQ0cd`S5TcL6#Fu^3_f$6&mU49br$LJXQ|5Om7Tx|3> zaH0#I0X)qG&jNnQ1*ZWwyWqLN)ByFu?itwC<_my3uUx3;E7+7Y&}2|;^7KDdl|^Va zy#bq&MoN*3Z1y=qFKGmmo`U}alaWfdX!86&YKN4#0iXFZFm*s*fb_Yoc9481mz?Y= z5U2;bQ@sI9D%R(B(;ZdCI$i}#DqW;i_)lO`>29q-yY8wQ(x>M|EGV$>wTD_RC3)oequL5^nH#_ofsO9M^s7q)NRagTd(qO@V z)$+Wle$qfa2vp%X2oNrHDUe!x1~?_zs?{M1b-;^Ua6Rylv0ePLz`Ikr@HyagyvFX1 z5-3jm3>-sP?LQN&SlXnz^w17W0_w$taA5sY9x7mphIRflV5&gJPXN1WXf|-yb+cpr zk7|Q+(={7@{fpW|E2Kz8)8RDKAf?6RBQ6DyMslfwaU@NbC~Um1LWhey#f9YvY$P9~ z)mNbq zflI*k<6ZXue+6MLRH)C__#2x-F|Z#BAe9dUUIeU+65v_*k>i33fMX_DAx)Pk6ajaA ztR)IB0#`#mK;bf>8aOi-8I)m#3?iPd(l=P@g^dR=eS@V8Gw?Gttn(KF(|20RumitA z!#ckSm>R5JI5h*N2J84U;9TmVPPhO9X+Xy+Le+lerg1-QFT{k-pBM^}WtRRvJ z7GT(s255yu*zqf=+^Up8_^Y1E_*aV{n{?b)0i(57=XJ9~a=|1Y2JG6P2p2v%U4Iu$ z@{@q+D>U^&==XvD(f4DapwO933j_%30$&2t_h#`R5Pt}qgRpvu!Z6^OPpB^zl8-C^ zP638#A&rw!VEVRAm)`-r7<^@w4gRTI5U#lhd#O*XPH(_);9D+uA+T{)7e99g2)-_a)4-Q!Se4?bf?DA9Pjumr zffHTie*|6*+)Zf?6MFZ;D%XXd2s{m#mIb7d<-qg0Yw?M#A4trkngR@mjE9G*605Zf!Di~e;ru=oDu6EY&`r`0`lWxf%W3hoO`HrDx8VDbSS+kwf(It~Y>k0W*554b|dxu`G-1o~D|7Z?ca4x8yX z7C68KKLQ-#f` z7XgzG==f=1@&O$$1Ex`=UPfUBFpV;`ez?kN5SD6eT9>Z_?z(PveCZ=9fkTNCh+I!t zL}gsJLWm;SH^5|5eYOn4V=gkGG7K?$E&`@uUZc%^uK|+@`&0jE!EpryvXP!4q!)sb z3(f>4AJF-Sfyu@?z79-rflke-K_Pyk;gPGK`hE0{jbsqT-af!!-d*9~6il zOw;fTVEqeRYM=uXcN$bSNZ}iWuYgH~Y6B$UITwvls4cxuqi?wIDKzg_G4)@a|LZ}Z z4{-I_a4_ac!s>%czV7Z2M{z~9uuz3Us6lh9;>El(M{{}F9$V(=o{C`xi z%l!X22=ryIQ4=uqR3-XS6y$6j+$sg&zc_uWHpx6e59#`n7$#__u==c-hMK1EUG_3Rg156##@m*loVg74x)&Des zn;pyW3O+fF6%-mquLG0K$?FM!223{BaR)Hjyhh`{f>-v*#`?zNIxuxmAEx*t&G_os zDqPa!=j4JwHgDAk`1`Yp%~Lhp2uwED@jYO&xh_A*3lRl2)-nF*vtsihTA(=wOeWU% zlGlLAq{=8jhjJ(4oqw{aRZx3)0+?*73p{{7>`OL{(fAHv{X2S!3*CDDmcIhnwSq5z zUCSGVNa~{DTwxgqt_@J$l}2TBQ6RAeVpO03>Lm(cz^*oo0PebOcKijsBKbj@2Ku}3 zl{Fx6ONLd;Li>LZ-h_=9NHi>-18(aSz~gz~au+Ac13u=03xHd2b*mdhx zN_=!kiLB7hRbc8MnN&IdkAfFdi@dc0cDgixROY;|f$zKUDVCph!6g4TU~8rorO_n{ zUjw`2%Y3DLbhvvTENFo7q=(*r!2cuM!-*b4lh3;#V}`U3c(B;3?urB|9D7zOpt)~6)2Yd0!Iy`oC|0A2|PzvNb8tlcV(AYL`0hX^&uP--P9x z6l}a4=kj$7HvS}*uV1k7r*Rqa&?bCJfqV^vO<0esR0B<0@`pqf-xF_A-V3)I?&@da zwaWYBi6t(6Al_M$3hO&On1Za4E};e9UFzHt%eOvEqlWB~DaLUFiQo>rf;qD%1u~~z zz?-mr9q<)it>#n)O@B9l=l>a|LLLROPva#SeRg(>Jt}CB`4Wh2TvkSQfwhcXzIwyX z@>#|1z`0rSDnf0G|t#YCjCpKk1 zjU9yPY!X|cDFp+S_rzt&d*La{nRvSL{$t{;qLpISeL1Xoy=3*ps#15brmN{{}iJz#ps9YNc;8J4ok`@M+ zs|2~23|5v36B||tCabvQPgR!uDlh*T6_@MLw zpW~fOA|4k;Cz^ET(5x>6utToW(J;8gx|it_1r zj`Ep!fpT}eT3O!OCj+wW@rUwgz}E6CqtRt?ocW*R-3~!8#1x3-S%f}r?UGUx?{OrD z5xcC!c(RyL9Ybp}iC19RVs@7AaTIqz%I9L)!u8Mp(~st`W5oNK2F}H@Mz(=zShk4u zdsyZ~0r@h(^SHm3Ehxvi4B$>ITg>LakL`C8Nj&qIM6?SA%KA$|Zwh3S_A)MYn}~aY zn!3Ai&V&?ESrWkvoI4>UVBw`W9z8J?Njw|thgJ{ZTH247WbhFGnSMFfe_K#Nfqc=C z^?d$wj`HJJ9k;w1uSrWm|_{tdkGcEW9FS#RSO1K3%qM@7MY8BrXcMUmqRW$+!>)4hMoThSO~LC% zvPNsLTX<=uESq#UmM<5Jmqbv9<%`O!li5M^y=m4>uzaDJb$T}QPrfY87BnM4zQxRX zZ@fi$Uu?fIO}1HctasT#*ex}6j~vcpH|nP-lu4M;l1ZmLrX{cc-on?kTtTi z_G2s^+6D?zoM==73$d(`t-lV-7O?dXQ3H}K))lv*y?99kr-l?1vJ0ew%z-QL619(K z;#^f>HeR6o04^YZ4^w}+aoj;N_$QY3t>4D>d~aF;2t3AI=TVEsETHIg~;Cw5Cs z-5H#k^_j7MHcvJgUGcJ{F<5t)qZ*KF#qT_r zlm_e{5>HTZ>7cJyzevTU{w2!M^?!m_VWLWq3X_$kgQvXwMJg`&e^-|LPrdy0D$e}p z<+3V}3Qdk`xCPR&TX;)_vgEh-@^e*O29&2P`IoAE&i`q_K$RdBhA2yg+f@b0pQhrH zf48#aKkwx)QE|!thjSQR-M;cFY;p;#IBy*LY& zkNf=kg7~4+P_IIXipzjTDoY15y!@FeF8Q;SCI1zhA76jdf@+l@6_zPWh3{;IXf@M< zttu}0+mt20ITsOq6di=!Qd4(`an!$5ILWJUidW$@Wyv4xzZEzpE_yzj^t8sJP@uUtDKaQ1Xv#Tff3`{G|nL zC~yn!+fkMZJza$;|3Vd)4*Dre{x~oHW)+wG3H7Fbsqna0VPSoO42y?K%98(qm%m!Y zC4Y^wufwe|J2kaPjKrm6^_PwP8_S^(!ue{lHc3Q@2ldHU!*MgH<|pne|AB+ zN{|Y-Doce0rb0Z-wBSh$d^4AxsH zN5v)o1ZBzZX2GzmQIA@US@K~%nJRZBH zrtbU`coz-r@en<_VObVZARXE}n9O!OHlx8zYROZvd$DwQj&VEHpzMNPxcI)5=_3*J z!FmAwRldxTim$+s);F_!jaZptm% zRF%&F!n!9ZSgAUE8gEs878lZBGa8V6{uxe}zpX_}BKSh$bDY1zZ3edvIue)s4E|#P zjs}GDa8|uT{)9q7dVK-UZgIBM%hlUUZk#-GNr#@5ebS!3(PSU(GX5!+qJ{7(yB zrob(7dE}`Vo48vt-e--Oq_T@rB*{K}u08MRV8C)KCzEt1mNmBfymJR0)hdt0vP=1^ zdsKfHmR(lM^QWkwU&n^;R=XeDFSeHsUQq*-S-W1XfvmunDlW79Yh}s*!^@AJ*D)A# z{^PbgH&XNusch@*ItmWKg%799X5?cz zSZ~1;b_>q|W5??+4W8;%INhsorn2M@^74yST-I>7vgA+l@~1@cxPJy#Q+J0~;RQTq zXzS=3P2@!K6`rWpa1(x?!%UtlNPM5pY!PfvG$-OJm47m>RxZG+LRD}E1qJg`W-BFv zvv85}Ie2Wb>tHmVtK!$=<;pkWt;#py<`u5}avXM31-DW#g%0*MYxFdph4(Z56feMs z8#m4ig17Kx#wXzXM^Z?ZM9=}xd?Y1cNd%p6Hd{10Z?MG%=5hRwe>4?^C1D5&7my&2 z`(%^eg{xJ325vLo<n>9TQem7|;bs+=4kjo|{=;7WBPuTWmCBO;dV_pk|1VbwQsJMNYic5a-M7Mz@ zza`d3L2DJ4{3Gj4|5D*>3RcZe#dkQIdhRxkn@t4w;O)elQy_0XTV`zIZ{hL0%^`~d zIdN^rGx46rhn_?~m8m$LjKguRye&f3Uz%(~f&36pyzpiLynqCIF)70GLpwHpDZYHT zJ5^7?@`F4!ekVSI_&yZKfR3o0?VASJ_^fWX?;vc0f#|- zK@OJV+9sTUWglC2z_QD%J7ImM%g1iva;z*Tx=X$MaG*+%Q{xb2sW8c_Fh#{B{|;rz zf6~i;TE!**S!MFWx|Lpq_f>*a_)u9o*p6$N#p$f3oQjVuh#jvrZ$7~CvtKRvm&C^y zLzYA^wt%0+?R}P ze5vGDrJ~AVdW+jIXpxSR%3#HE4x#!&~AzUYyRsi^-QIlr<=%pxP9OFOUjP#R=lxIGs1`*)!iwI19@zki%#J z9?hh*9ejvW#FHle2hLUbZMyMH2`8j~Y2ZQ%=F))NoQiM4)3DtFPv9)IMLxjNVZ89h zC6jNx21|R^>+naIe?{##J~Ott{w9N_6i5fQ!k$>>fc0Kjc9C@^mR)4MKbB2weITBq zd@z<@khAd?xK_;eXW>*!f&S1)Yb={QUXsC)xOu$EqBZDgY~vSV*(KKfu&4ND2cLvx1)}o=yL3F3Ex@~Zqx>~kw%AzX z{Z8clU$TbB(xA+N3s2;Iz6{7tl9^c6$odmJk$mfePU3C5Z1N>$Ktr&sp^ZO=Ws^t8 zJ?(GC_9q#ozoWZy{+CT;AFp4*EY)jxl-dF^3A^FNFQ({DmPBwi&U`5qNqjDDq1*%O zE!q>ig+E4zCo}75aDdq)7pes5@M@0R_`Yunp|S<5h*DyK@(do0<-Ki|H_4_z)@Hs$7I+KsJ5}ZchDP z6vzN48Jl<*OrbzVXe-=-*Q<}y-G#>zPnrf^GPe0ku?*PyH7qM+{RWm5uznM}UBc`C z6%@FI7oW0A*hJImQD*sBoS0-6WSU)c1D0K2XZ?|<@^L#{+$he!56c#@lknC8{=|bh zA4QY=9o1j-`v0c}BT5TuRD#?A?NpXIu^+RwTXo8eIT0Lyi+RI1uQ{Vld@8QS(E!+P zSKtced+{P;=0A_uDd?jTzQx7MTnFFdZdbMr%1s9coXfQV+YSnFw(>~4olS1z_u(fo zw*k=rUo(bs{YwUKmijtf|IaYYU)n0mi3o?I)H*D@25;o zBDfrvt#TfWm#Yqj;>=O5!xF4J9EsghQ@5N+DDADJP$qT$X?(Dm{=y}uU?K(5pq;gE zV(E}wAI;iPszDj>R9sDdy2RNf&*QEiq>wCJjy=DEv&pyTnQt*a`5ML-2P&Li7!}0z z@!6iw#amPd7vSm-Q}y|Mu>78Eyd;8)jH@V+%lFS-yf!k|e_P>q3U;dof*zc?K63FU zxR3Ilc$)G)xbkyzwWGreym%ka{qfRJH86mJ-QP#I#Z+$+Jd9Vc$@XJ}vWfqN*J1m3 zekU&e#0~J@c&GB8o*SLtFrJ3Pc57S%%_#Uob=Vni!3UTD48p}Ke;BS*9*I*|xoyf1?LUY!iQDtSTjz89&ru2QkRWDHMEmUQ3t~eSUZ{A!0B=(D`*`k;cdGaRT(mwF zwI=Nix`5-aL=_App-g!sUZq^-d5q_=c$3P%31>4W;)QR?!uiURLkbF1!89zB$X1x) zd6wt<@nV(#Fy5^^A7^~w+FO8|D~C@}Fpzz0_sJT(R3)s(DdJrG_lr&9U^3VP z%W-X;fxF^XCcm?>jd#J)pK%y;rNI6!v~)1c*jBg#+uxIx_)KFPpN$vOU@zNyt0LxKerMwMqQr>|}O?UEieHV5M?-RoI%W9ebje?#% zxTESe?yAa zWJv_a;N6i~e<^57LAxL9)vQTyDh_bGGzm_}TNzNi@KG(CUgq50)VKNPVZ95^$8O>M z0yx?QQUC0M>F05P(P2BX68sv$Cs@|7AQ|t1Muog3gAVO3I1|f&4vq48`Hp1;XeFxu zInKq6jr*tp$QCTavIXM)sW!$GkS|q&vAE4wDFF-Lf`O+n0DHZE0?++A6-6apg)=ug zKkNAg&oANBMy~(yk_cX+kiP!>M!7g=5Z zH+c!)V)>Q$cwuvU-i9kwe5dDMvHbG9t-srI9o`zMgvPzO7u@VB?159td*cDh`{VJ- zS)LE`oWgTd{*gG`sS1vzVEVUi04I3P^_+*RRDM^SzQxr)4Oc3k<@vnc%s-uQJ_*&T z!iBiScdo%AyhQm@&x1V=#cNgm2%P!7YwxPw%)bGuU^EHZH+UY8i&g#vJYD%V&v$sf z3oljq_l6XV|G|xD4&JW(5YAF3nhM-bc|Pv0{5T$nTLd!4lff!u$dU{`!sChCt7Z6y zDXeg{O9c18i<$bU|6YeMZ^$XAc51_zajpSmKc6uT@ zGc`}fXTA%uoLII{NiIeeSk4RGIn{}O#ByBAnNys924CmG0HYTgTw89$av0nAn^?AB z9OwGqv>T18gx**-xou!3mgBg}ba2j@^voKjW4U-u!?MQq)cih{!;)`wiw2Z9i*H2W zD6#H{Wzt6u8SzjGWL8(24t8Rhgt^AIo=pRIplNVFR$X?q*+hb61?cHN|jbNd%|iuF7ZOKC$Ke&&TIoLFAsE zFT|y)fg-#_`BJ<}d9df9ff+y%?xqHCDK7mf6-8x$gK@?-=i#19Jzs@$ zRsLw>xPKbFo`Nh!7)>hH;8EkaN8Xew6^L6ez}@iC6v&C@BV!x?1j`n({uIj=vR;oT zUd{9Wwviv^UJy#;?G#3$06WslES^ z+vKY#a7#_yHCUgRj=qrZa$}clH;3Ulefa7XPSwR!k`qshe!TsfNj2WM7nVs`Xk3nE zm$fk-BmJ4}A3Xz_5siq#Xh{oZdIOs64d?+Cm&5V}T&vdbCEWEIx5i6xscoJWehu6H zDXyt|g95$AC-XW$8n9=!tNL^5rGw}>9%sHc$+wFP;480#O)4(!f9tjXeP7kTG?2zA zY?_*-%{=do*Q@yco)5$W7;tpzW)7T&Gq$Iq=l}8y=q}@U(7eaEAL}m(wqOq^ehpVDFZcW}&nxkAmHz?my3-Bt6FkK^3_fdE5NzFT@O4=EJh-HoA`b~nq7jc23{@%o+@Bg1ef$WoVQ{mZ*`IZZ|Knlwp z&Q2_Am}8uGNyGdbJs+snP!8)3Snr}dXF31y(`XcAt9^JXu2k-ZS1O<5`Fzj4@Ftbt z4_Eynt0N0<*}&T)N9RAj605!-P8jOB1ULRQB|#QG$%KoPufZ$WLh+Ie#^C1HI*-NK z%Hwc%aeV&e*J&uwlVk#R3*Ul;^&GihE)ZOV_c!U4zE@IQu5=<{4*{18oQ;Y?i;MP;Fc(E`j-(kz9f;;2h;M zaG7#nb?F#g}nEfvWHsK-?UdM83lr@@YY~z#h`^1wb{+zLmKaW2k9-V5*+F)$s8?kIL z>&+nrGU?)l_xEExi??F8@I4<`&*FVA<l!M|b4I&KRgR~r_$1F$J>Q8J)aUc}?|Uf7{WBGH zF9Vn@6_n><8F9QMgL(K@oJ)bsk++R){9P;qv|fevF8v7CFLM3=L@La;6&eMfss!1@ zyRaV6Z=V0a>(zjh0~)#sZd{i#ee$*)W#)e(*o%Tb?Bgs_f&x8N;mKtJNZiFK-yX z*z={hNYx*Vrz;P~>y=Am^Zsws!A37(i{~G3(8vvNJ1$h-g=Z@NW?aCTOjcmrz=rYi z$f0ZSRtlD@2BzT3#x8y*UafqOadr@QaNwYZ@k2cyj%%sE*yP_Y4poB>n*`!4iQp03 zqDiZm_;FmU{3NbYUS!-R5f7--;D+%NJ)exjwW@*BDOix!s=mXs@oMElic_Gd=H*3sgJ{cjZ(o1Cmqm8F*THtN6R$ zDY*|9t9UgoC2sqBb4VChumx|M2CU!r{2{JV4XnXE?bVVqXMQoWoDQR_B?B6QEB0_5 zmf&jTD?_i~8qZ_!Dplb|T&pbg3-)v!O!R!a=V`c1<%cu8f|+=tO1K|yVvXW!17FF2 zcVl}`w+)YP<_546S1AA6^PdgP-+za4m#QkH;gSs3U^CB|p7+ONRelz(RX)sf>jvif ze}KnA6Sm-cuDdRo%lGmZiJ^1KR?P&25pUPygin~ z&^i~(VHz(@_()DXspJ0H#3xc9v)WcT8Ot27F2J%&tk1x0@WB+wE*fQQ<5%O;h$l^a zuCa~J!)FlZ{m*d&Z<_*}@Gh2JV!a9vz;;gjZfxU!;u7K=DUbmjQxe<8bFj<->l5%| z93F2fTx<$#!lhW|fb~GU6?ZcEcNp9FUAPtdyqSr=WNhP0vCIkU*KpVCc>dqTRQNtF zs89G2%Ph4Owqv$~iadDBbdx-eD$UF=uz zluK@-+fYkhD!tAV5V?o5P8-NeE#f^*yjXQ0x9R1$S{)^mJWs(pRs2r8GThG{R`*a4 z?C(6=^IXsKaH-lNkK!`r$0T0A3HZ(ksb9bFQ7s(mO|lOU7G(_z67d$eV<`W@fb14{ zS~VbR{5EbwypTra7VE?jvEx4Yc3aP<<9xM(XOH0c@2Lt3Nf@o%%Q)L~aJv`3%kvC8 zN7bL@`F^}X#UCEQ@uv$OAz`~pcpPUoce~_CT&%pv^YfmU;8iOB70=Zn1zT0Zn__1D zzO1nv$J_BAxXAd>kwH*!fE!Q>4^TeR^Rb?f#}x;)ivQM358-VTj8+ZY;rT8+MaA#M z)yi{l-|O8Ym1Q`PAAX1yo+;w7Ov=Vs4$~SFFJx*lXTsoknWCyf2hW{w3l%>RPozV8 zaT$tds`v<8sp9wHmCDt)kS!1|T>suQ1<@>LjAvb`6L=uu`Fy-yHFyIaO@leKC`Z8` z#&HMi#8GkFx(SwD5G`{3-%}Uhz3^5#XhDX|fqa}k)_Dl-mSxv~x8`}i(sLOeuky!; zX)lfTqw9YK1;rHD8-#ao8*Df6FF0StTV2JeSj7wRL>0dt&&BNGXaydX{6pPJt%T@eV&$r&^A=lLiHe;4{x(;G!GcnQV{IbkN!jXm8K^;sO;v5YJIQ6fd%t z>wn4=WGCZUe3?!lKE(4dyu~&^d?fCf?FLkaQw-Q{(Fbs*@^Ty)N7w(KC|Io;_}O!< z=il+bqg;oh$yA%lWWIKw1#Hnt6R!KV>#X5vGPZG0FmRPh(({v6Aku-<@~H1*zyWscbRW-R;I`a3KaGwZEbE@sx-#xno)^?L^iZsAX_SYN+$ zO8G_u&RiM1oRvGAZ?WuSdq-2N>dW>0@Edq}&ZI4(QMo}WH;(&A1d~FqUh5 zb9e=|N5y))SRDmldESIqtN3^L8|rfh7wxkBZ)6vYbM1vEQ&6S~O7Mb??l8L&4^;6v z;!ZC9kmpA|KZfV3{J-H-CMKb( zpNkh+%j@6EDX6vucq-nc{5&pK-hg*1H@lhRUUk?RH&z~mSF8MKxXi?(>;H=s3{Vxm z#?6)Y;wZ^h&d0gR@>jIX)7=&;!7^#%B^ivwGO4Xc;U)2ji2q`ZujXGeOKrkvyan@z zifGn8Y;5C?;GV3JbtRTbYW)N*Q~n#4EokFUVcDhT`pd?_t^G)*s+*%B!)=Y8zjJ zW!77-!*Wzue~#s-;a{@wP9^?J4y$)D+xM_ORnIEnYdkm;R+$&CO^Mq@ zPR+;T%+teGK{rWYnmr#CxLN$N=T~q_&GI+!^lmQypSVT2I}hx@o4CJd6U3AFunFA4 zsd#r>5}wTfNRR=%M8O;qQl`QtyhK&l=N2AFoY{(~EWGK&I3G#<%e{E9=i#{erutKF zFaw9vXs|L7H?W!lalG(3V9)FE3KjnfuRP1;Z^o53yDgA;D|a}opl$B}V>{rITbX}4 z;YzPU8Jhyd6P2rQmGZN8C@;tP%G+?3@*$IWka(^e zKugcro{z?hRDPI4!3rAO!;G*${s1S8Z^7NpcO6W|AFB9sc!?U&=Q#TUm;bdfe@u%e z=`pu8i1YcMh6O=;oUa<_j6YHx4#ER^x()e zwdy?ZJ)YUiZGmmLQhBGb-Q*pnG>qpdGynO!9R*8N1E=EZ-mZggIJnUH9OETsjqdQ` z(>>pdo2&YBa9M2nX8;dTutX(1YP`a9u-=P*<#`ict?GY=i~G0%|Afnxe>U!(q<@(d z$KBpAp`GWBc)DsJACKQD4?yw!kt|FxIT`9#c(% ziSO-sU%WvYF!2L%(BJt`oUb}O3m2&PdB&mnJ6v$5mvE2g`*0uCzyo;h=vKk_Ch->h z6c3`q1mlpSr12fx@u>Vga7K|E;NG}hQLA|UrON&kx@Be02v_#SvR%{HgHEFv-S$SN+pcK!C+V6TAZUi77tM!%*Q1vz5tghKV@v6 zHHY7O3EMpHz;jdszv7+ByK(jqH^9W*Owy6uQ<^Q>4Hp-?_&IpGa~Pa&3bwMMvIS-| zObBLqz8^1k4FnJ4f}yU1`FOnY0^`-D{T~{{Lq0~;pnxw5!*f*wwYc3d*TEmSr*d+7 z>G=s_ACj7XM5 z@I4+$1-pg^+#3X=FxMuc$)EsVry3lI$0*OjW4S!XOCop>%jMd-!Z_}qCLi+>7U1Qo z!c(~M7}vmaI9>Tg+(LON?ymg0_O{x^KfZ+gG=a1fm{phKI)6vM8-Ur^x~I#9*7H6{h@fO>To)~1KT!Sd2HvzuUOVNUifMrthZR5 z7jHbLVSZD*Rn^bH<&*2%3xj%G`IM_E zunCi~Ja)65isiYU^_^Irf>}?;FXBNINPGV1QODqqatiQ(c zkjeTREYEhWw_tg;YyAV3XTjD#;T+tB0@*?bKM>no|Cs|6%u#=vZHb3cL7I>X=Nj7v zd*I2$_cigc#x_0<%d=$bo3T7gww{1j;QHVHsWJsN;Til62}ufM0PBox{B!&+aeLlK ze=xR5cflW(^Zeg7P#hP;aXK81KcNA8rn<-2HgF&QObxKw*v6OP&(#2a zGPdy=yrGKRMw~BHp-`C zd8lOLXW|O=j>hg-9@*IVd03taS)Y&P<+^pRhnWBJ>eUwXAz`R;e=N7rHhwXd+i2@c zvD|iB55#iUY&`_aU9KDht6ek; z%PpFXhxb!ZsS4)e$Cc+{d8uV9Jc{K8!ul~RH!Ri*u-s2rKZ)gj!un|}uN95M;8_af zdT$dJW4XRtzli1WyYbNM)5(us2isL#>hJY%!vSXE`X&1Q9}4sc4^#=# zKu4_a5Ar>qgy*tFvS?M#6GQP5?kBoodA0kTaoj0?Z%}6b^9KhCR;U}0*YH~9<#@O9 zzlc)6u?cnKHd3wEL*Jp`oDw%J&FE--BMHcD%QK`l&km#B(_L9l4Q=juJUD5g zG#tP#>oDqtuT`TUTaEA!oU5FCggYSRrpEcymo0R$7r)%|V7!<$wil~ucsq{2|A!`C zpkTV{;2)k}#fwyY8D6R;-H&+Mj8@U=$eh}NGjBCtN=f^NJxU1M+xG6b{8q02w%}R{ zwyOrl8rw_qq-* z$LTYji?M9-c;SWy%NDa9fmeqV97>5Cw=<hp=p7>k2#!+w;IX z#y0*QW|PsM3YmYTXXSkL-(DlW79SFG1~x92)sNr&k)Dl2#l`?64Np|+J= z|8+ro5=vA;XS`DRB%E=d+r$N)&-C0KXRG`kc&l=6dE-#KS+2qUBxn!td^s*u`Nepp z@)dZe@+i;OdcH2Cpv7!AfN^*_o6O$VKV}^77T&0gWs_PziMy*Wt9u$(sra*4@8ZSS zE&TrPixlX6JZlu+QpqODPQ+)n8Z296Ikn_WcNJ$o+2`Gi-@wvgbQmZ3yI&cPSJijN zy{tNvIkN_<6%K>-4GV%Vu^#c)ssXv&euMRZx2U*u(B!coC{SB;PtSYdp7n9A|NBv} zqP`#z9E8^@xA5G`b2i?h@{hp-=eS+k7MCe^)RyP}`MLm~gv(Wh0$i(nCQiTKb#Sid z3q1G6St`Fjo^H(i=gWpEs89)mJP-4H1zx1`N8y|Y+<>mdU6se;rD{@+!>`7c>mT2K zM}gkw6R=zO_B*Wi`B_XdXFL< z@7>ytH>mh7yj%Gs`4+zi=K4#2jk+~)b;;P3i?oBFUL#pI0n?h4Df3_2ithY z0v@^G!%Vz0UZLUx@mf`XD&DE$i}BLixc+xG4SXpHY5;pKr#t=#%a)=0SrE><3kbCu`g%9q`M7kGXOhdN;q1xruWK}~q^}HuuJH_pi zPPoOZuDugIpIpW9w?$PbAz_NDaHZ!mY2bF(!GjX#IF6TO@GzG1fb}C-&I8t!Sk431 zPlOc6iNF^84a<4J`YBw9PoO}~3u}yRd>xj<)cSKQhpF`jEQhJ}Ml6S^b-0-VIZkcC zcUX>7>#bN0GwW?w4m0Z=SPnDmUAT{OEiP969m`>D^26Xy3go!94J4k5P7L*KjCZPd zQ`}hQOtd6}J#lm8y>Pa2CYGbZ=I@WY)jLcE2U5_dzJO=5xLCOb92L&Y9xoU7tD;{nRI;-%HD{uI1Y`A)nk zvh+`f_fW7^CCtXVmFMD$H(Y~{;HAosV?DryUi@j#&*Gg@KkA;Pyu$Olo>$>AmH#oWSi$H2IQpV}(&8Cr`CG1oR(O%}QFzNgUHmvK4a5tt z5j=PDoR6zj{>eD~U+VpTr&Cb)FW2DNo(nx+fG4W_J~;gySN|ehpnMrFQ67TVzoV}I zB~gKE;7ZSBIBTVgkHMprZ^Vn0LtOlx%b$qXE8i{-Rl!|e!VH}CzH49>Udd5Vz&4lT zyc$ni<>GJR70PdWe&6$lINYf!tf4@A9q#ji>)=bzU*oYV{w;3vq08Tj3zcg;|MCp; zUnl&VgmP8kPdwlw*I=VXymC=a_q>r{73wFu`Zufthi)K>_;^t{RQ zx42N{Z}q$lm)6HaK6*_-ZG8bBy~bHzx(@&J-00bc@ig2{$fIij~~l7t1+O)#N~m-D_92HBwBw8{-i+mSsPO!?Z!m3NpnntRcb(TOZ6{r zz$;Z;o|3)q4fsP9m-^dq1p^KTNC)hKPS3>!kcH2Lcs?2Lrh?7C&DiGO;rT9Hw9(Cx zdp*y>B~y9*pB{CW3|^;TuBz~s=YQcU6@L$}RsINPY;qm0#f5C*gH8L5{vJCXa56~4 zB~#UVIQF1G&w&i=7VcuPo&)=-xNOoBupU6J=R91-fR3Y4xqJ`8xuF{IFey;J0?$+) z<@sv7O2x0kExvVIU>q(|F84eMhdN;j1!Gl(JMj|bdvL}U*THPhb3M<)T~&T19-zGN z?_B@0zjqBjO@j8{J->jvtNef9BIRnlK>1C)T={L!@5|?Wb;5@vY*iK3;M}clfa~!9 z<*z(%_WT_#Q~5vPiON5R6s%GOwVwa*EZ-h2lPF$zZiw|)Dx~4LD!vC^ug-)Sc(ICy z`%v(rD%cOdq&vk0Lfc*imMv)OZ^Sa^+EG9H{l8PyCXzGR0Gv79-ICoV@gH094_Oky z9iH#PT~+*E+-8QW|0>S>x2wMlr)ZyN%X0sd41SabREGyW&$$}ghs&qoQWYPG$Hxss z_3y)TRQxqu!2s;DzfSj!)sLs)p(1F z|A4bp{R3a*ol?rD;qJ<%c>Hf{5xM@$5U#cb#@Bhi0WXmXCVn#>c#r!7#X`yd!^NM* z<;s7@Q^?PxzO3*UxH7@>|4q!2Bt`j4xaEo-K}ipZ;AEVkDwN z$8r={hgfF0^(|N?o%JNlq^tLompT4qQrLt$NLZnK7nVt7<1?_nxXi?Esi~Wd-NmI* z@PLZTne|1i=h)I{#A?#LM#3EB<+!kk9RSw_JV5z9&mVdI1W!}>pLq_yprBeMY{Z34 zU58t6x$=*mcX-}~t5yDQp8vqBT%70M|KOI(6$DLjPP!XFhUa}fH^(I^|6tsFPgnnN zT&jG8xPG67X~9txxTU7<7_9ftGwvd_IoO`)HsY?hC2P&| zk7TgdQYMv3$ivf>2jShSgJGUWdLD&yGTeZ##cTI=9*Yb1i7eMYe%;0uM83uIBs@B< z5XGnB(tTZncjI8DTf>)eCO$ICP6prLd=<}pg)O?j)Q_&eiQs_x0?HWBA)XJz-DzNN z(_nX85;YL#_wd|POul__I}UGA=aHMS>>_jh=Wjj~$Uce}K9YfDA6ZYvvWu*z;!@>1 zvFtJ%pN?e?S>KBvQJ#e>akTz&2XH?Hi&es0yh(W;-l_a3-lhB){zZ8K{x*+QHqB7cKr z3)$QBHsw5f3{}EN3S^Vngr~7=GTT56mVFi-$8?Z8f!6^zx=F>?W7%ake$Xwvsews% zgc-ojXpI4joS61~mG!UQ-)^Era3BTR2jf*LemJgd?(&boo0QvlKHhUXT&wasy~_M+ zcYtf~L=w6wpNg9wFjje}=MkQ-#M4#& zHJ-=d*O-J&*yJ)vEAVQZGJYqdp!7cXp3Pry4sK%-TD`^t18mRTg}CdXZj1Et+|Tnx zxKQO^hHI6>Ar!1s9o&VND!+sWv~V51>Uo*xw{WS-e+Q3MUWKPP^ZkDm%yb38I$Wvz zC0?t%32#;Y4yO)t1N=#Rxbx4RYa5tj@^=c#*eCJAqgXssIZ@4k@S$dxkfE1w%3YFjct4&UfSE_%isTpP*C32H82c+NCVMvPke@P5G}k<7|SHGo{e|nW)#RI zd&Ahq-^6vqk23M?#u5+Z-2XELMQQ-Q;3Js>X(UL4tzM4}S@=LAmPr~f$>3<*2Omg* zI7mrHpmYTXJu)cOQb0&7@g^3TPxhO3OHVOhh?CjUJw zle(3O|Lt}D!z^;{|0nLrQ4+1c?6sAqAkIky@8fcH7_G)7t?d@!yWw!pAc{c1um&pIFa<#4;C^O@25YpjPk*ai|K8qM%gy zI7v9l4uH2<;8W(hr(&1j-6}rN^H9$vICZpZ?@Aozws8g5P*A3PJ>IFdz>T;$1Be&C zMjK}26*i9c);;m@a465tXhF0V;jE& zOMUChu-*mXAPU@4Q&)`jF1VXBmu!*IY$7>x4OjWH2`A!#$Jq`N!R?->;W8DUfyY<0 z4yMp4TRaT5P%w=VZleR)1-Wl>T;{k2yWrKzr(nsCmt=4n9yiaq8k)Sj`cRzwo@# z^JY9y<^SOMCtMoGqw8PrGX<5ZLM>jv02oa)pdI|)kxj<7{(N4(m+q#wS(QH{3f*LB3!8Am*TmdT>fA@y|eT1x9MN+ zlMy7ig;Ouq16slLTn5mmaeOfR;{E4@av6 zX<(k$z@sWI4Ls&Gut3G7{zqQ@PgGp$f7-AOd4L9MQ*e!gV9_vk*sp3-q zB(MG{DlP*!twDYM{@+a{NCQ`S4P2w*(!iJo4KxbIs<_mj@6~@?#ijm2U0=Tcq)H`7 z18ckn)~UEO@VRb)`WsYS>Nk70;TGH*yM^a|*lt1Qf1{weN{|Ll#riny=J{+~THj(? zaIUH^1MGoq2h#rXBN9=2-KZn?kUd>~7(Iy`=QVhf@}xG_cWYU~_$ftR_FD<~6WY#ijm1?={>ahhVqV)E$QP7D?H-oPVT&^C(!Y zPK`Z1Ux?SMcoE*Bd?`-PbEnq9I9GW%*1K#3mc^X^IMq_1NBGHi@qh-BB>Sw)RFFzC z;0L`1A69YMVvl(3RjRnue?P8o`sY#8hbloD_}FV;t%^$njoxp#MrqhBoNBRNp$rw5 z`gu`(+dl(1Q6TDYBgZ62UO3V28w+>h z=5@eTDqjZpfY;tbDlRKrQQuy4{%sV@r=YS`Dkz}W{TR>!y!wt*^lo?YBAow-b2aW( zkqUO2{CDughf~p??IeFSo;%NZJubp>2PE;$xQhJd(!UgJr(pb}E+Mfx2nwhmk7Oji zCtj`^+#hdMZjD#bV42BpkE?N}@#%QxBdK7EaS?9L3WV)U!C(ps_Ke>YDjm*{1{hF@ zi7&-%=BK#!#{>Ef=io}?13zwnF>am__1raf$5hDDvamh8Q=5zUtZtu%O6Oq zDUk1isWu4(YkBxQEB^6$8Bp?59w^XYAr-_kanm;f@vHEP@Cmn%U#FmPWhz+SC|-lNzT!4~ zdi?tU(%~Oi-uq>DS<{X2N3l}u6N&f08)z@Xbod9B51AI2EwXJh`~2fp!6Gw&PTz9< zpVK`Ruq&emzGZeyXARPg&*C0%`uFi87}-VB@Z#H2L9L13i{<+QvW$y%a8x{)3i_B1 z*5itMTzdn4<|w1Rp5#k=Gk)g!-~FLfu*fu!sCO$S=FY_yY$Orb6x?JQiEV8n6we z!FREIilv*0AMz&+eA+4~HtvPx^8<6t8sCBC^8t3&?_Jk$mtBqJyI|}Jd=OF~-{oQp z+S94LLD24!d$D{Ojg9ZXx`93kzK%!Le*w#EsWb(Jq>bzQSGmLJfWz73 zPo;vTjpGJK;A-M_((chJ5xp0z$kcxY%SW?I&7}PW7e1T{@=g4T)_h**%Z1#T_r_Fg$@xXevy{@<*jo zbCeVgY&f8&u|5-K4q_KJYg@WomTGg*{_Fx8d zfIF;4;4-;GG7ap+70vio3se7wA)E&?IQ1I;f@|?;nX*O; zu)K?9rCH;zvAp-ocF=NEB6`1IPt*S8Sl+PM&1~^0Wt{)@4aG56H@w`g!1Bdm%S{I( zc>{vHhoiy_;9D$T%Qb%QctF=)n~1(-s?A=pcVqbiqf#?~-lI8jz3TjUNP&FekWEM* z$DQpaIy56J!}1YLd#-PL6Z?EBe=BYhp9e-``DoU7)8Xq_K3LSIX*__!n>mU&72AFO z6_z)nPd8im$d@PZ#u84w`DTO{-NNOSQ?LANrflL~lX!2??C;h$x+Zf_ht9>F^18Gy z?$o|`(9q5uXOH;2QC?WwvHj4&9gB;LJLb0U(!RscGlRB;gGOC7s_oED9fq~4L#hIH;cxLsbCp`C~3b?A`Wp+mdQo!Yh!vd8|<$$9@FGyIEoJN}2vik$7pZ@p*}mQXoZ9IxG7tF6R%f^Sve6k`bMrg3&n+H0taxbdpuC}7^3VJ~ ztnBP(zHD^zAw$}C$<51cKcrLfpe{r5hIEcvxcuVt^YUjOvZV1@vom)z&Yb=J*NqN6 z;=k|h+}V3=Y;;K2DZhPw2c}P6`{KM#Lppc(zYMBv`~1Jy1b?{&+P44e85921OziN# z?}PT8Wg})6%m4n@iOwXe&p+~iIWlr*KXOFl=KcQbHqAE;{~yNEzJ1j8|FFM0MTtHB z>mb^9aid@$#e+r zt1lbp9X7OM=Z+oohYc>y9nyvAHY}PPvc2Vhv;X+A(b>K7IuC8fX{O_#_QTo@>(rr( zO))!TaDJyQgF583?^vAIKCfeOmku3<4(*)VX>jL3opSTKaps_F1QjJ8Aj|4`vS`DKxRcm>vA`0W?{U!@4uPFr<6%_>;xAU0um=dam zt3a$4Qi7K==g!s0M`cNiN`#Pz7Gl8{LAw?$A}US2R%Av+y0AqAiHiyf1pk6)(Yalh z-tjJ)%{Rl$`OSB}*YCWBpc)$&502o0sc-!I`Zjy#85_%jEUm|KJ$cy|=)lL4i|SjQ(? zy8!}?@LLX^B`xQENPQOuQWD8*{*Rq_cog>HuThvk$%N#gaIdY1n6a*A{2OGfXa||< z=;-ZCQK_`zjQE;x&A2NCieSw+yz4V2vaSqS9cfO4aU@w9ur3Z94O@jMGdsyQbNkG_CE*fR^& zyXA$*WYS$dJtlpo>)fS_Jyf-4O(3OnxCph8k#ku0E0{%i4Tle|P=Q5^&R1T;O>CTm zJAI*Jhlsf#m5Qs377fK)m1ry$gW$$A!gO?WTb}K_D6`!cF#QIGR_cjg91-_Tfv&TD z=vyU4Xh@a`p<+6Lx29mGjs<>(OYKJi3;l?&xCZ@i;e1_2Fh+&VNTImnQXALc$u_93 z6E^SOJik(x2P{@4^A%24FPAyTufh?W-0o63H3t>NK54CuvCsFMD>>=+P}!xJ(pehP z$PksW-NFM(t82RPfeLa@dpSczdriyOfq^p#S~c`QUJ2thG~21QEk zM_ja@ABL@CtskNHJ`N6+SKwru2RNVg)~&jZ3t4Y_>c%m5=KD~2*@I>`(OkOLEXhhI z-F(z7YZbQn_TNU?=IvaaU$)iL*qXo3??Vhu<3O9Yr`*ZMPI~<_?m#>~edtx=Vw;y- s|HwU)4Q{i{;cUdU?cNq|{%fM_RN<5Qb}zYF%q7a22F6abd-tyW1%=Ec+5i9m diff --git a/artifacts/test_program_methods/extra_output.bin b/artifacts/test_program_methods/extra_output.bin index 2152e32fbc45797eaf3a26f269a7f82a29989ccb..30d44aae95e24296b81ed84c39a56a64588c6bcd 100644 GIT binary patch delta 73508 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 diff --git a/artifacts/test_program_methods/faucet_chain_caller.bin b/artifacts/test_program_methods/faucet_chain_caller.bin new file mode 100644 index 0000000000000000000000000000000000000000..d9686f9cdf26777520df81491d7341de3fe3c6b5 GIT binary patch literal 401332 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⋘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 I(JS8n23hHDLjV8( literal 0 HcmV?d00001 diff --git a/artifacts/test_program_methods/flash_swap_callback.bin b/artifacts/test_program_methods/flash_swap_callback.bin index 4a725f3e48b6512a871cc35ca5936edc90f4410e..8705c5ab1fdebfa0afb88234bace0ca0e570555c 100644 GIT binary patch delta 14048 zcmbuFdwdl|vd3#4CkYrJK!6AV=NzKE@w^`rB|HTLg*7T_Fged41c-CIB(A715`TXrm;C|xQDvo0MV_+mC{o08H^TOdFyO{l2OoK-QX z{pB5p7A2bUZaY_WXwlkv?XQrZT?$|a(xOVL>WnmUqk&;1LDeI?CEAn%viqxZG zb8Z*0d}KvUZkP6XliFIWP*Oz|4>hBNA}U#%edTeXJw)P4D5b4M=6!kBRCMn@K`cL2 zv9SMDDdn|Ojud`eQSfATMWy>PvFfFYUG95RkDNVwpgeEt+5%5=K_snWymz}upH$@f zhKl7MR?PO@DCT9X-Q{a0q{i*8x~1Zv|H{PgdDm6g12&N=EAj)wlTB-v1#T0>yeBK< zel{`hiHh$1Y;9=1&qC#0m1XibU7Ep)OODRk+5eH9{RMqze^Jg7%Cy}#iH`^i_2^h} z`n*mxMK;RBZVDvQivrQY3loOon9|D%KsTpi2 ziF&W^L~E*=UJa>`jj~v)DAIcHW-wFB_zZX*I6exTx0h&e*x>i~5v{yPp>-l=6$N_X z8={d>gbpA74Y(Yf)c?VLqN+@Vpq9z2l=Cf7k!gY$IMPy~MOZ6SIN&>?Qd9rb14L!; zL3Tm`{Q_n_N#iVhPqY}!e8$F41#fC?$nONFwMnun(BL14a?nu3C)@y@-BzImT!HNf z3<%n&6_|M>3|7Gxab5;qZ0i3OOfYyH@9%b$=qz|J=i9-B@CZv$ArlH$pdp5a7F^(v zw)-dX-7zc2+v1C28~hq@*P|OW@EP@o>>2=Lu@X6>QV6uVT^K&s9>l_JNn>C*xJ1;gUdACVmUN3p}1r zXvdNU--!I-27RR+sufkoyI9x4n-t38Vx3TgcR_3&7keLk$~0}N_FSEK*t!vZUVO8W z95@_kZEv`@P>B!q*&N`%qgPmaS9n+ZRtt{$Wtpv&rD>RMkIRh?2snqQN%u^68}i9;o(Rq@<@t^9ehr*CL81Ne-Ej$Y77emVAny`^W<$Y^n1JQY zEbu{-0q<+0WNB+~jDp~pqL7{2@eKGCs7c|&{sUeO#x!v?ovi{bHKj=*ID3*|*9+if z(3j2ieXq~7NJ~WZ!4?ALO*NwF(Tkz+K4ab^;BEIBMLEBtKs&(-*RugUtW+U4=bymY z;ADU2PRJV5_(#Ad{VE+ogL#56+2>C1Pw))W1V4h!6Ljo+?gX>J_G$IU61@dpUS_2I zF>uCR3XP5%j8mg$7lGEGp_;EC1Ri^*LOVGx1ee~UkROJ#klhY0s#hRT8a8mj-NyLT zOQ8=2ujAu2u>TGtVpd*;4ad$6N57yy(@c^q>fClnqp8MjeFV<9(-`v;#@MkdIb7%D zZUU_XS93lIUNjwZavS@g$k{PIS%gc$TTJ@af_E9L(s48>Mgs+U2(;eBGr*%~BJU7? z%n3qIffk~wD=>gXakMua@sLrge0>Be!-80zvi^I)>%sY)*Mo0`{-QXy73r0}0u_i| z<8dU2GCZ@Ym2|nNe$o>8I#;0*Ud3DXLcTo-PjH?Krui^TP8e2rIlK!)#`FGXz{~Ek zQ4c=x*WiWVWd3%tBm7KU0G@5IN*x`jD0kbaHCIpo-Ud!8cpf~b*x+h#)jWmrAkREC z&M8nK&4dF^%5~?uiL+=KVHSGr&c0mPCqZyW2<`)wS4xbD|nhQUR%*#+S~eZ zgoWAb&9vt_NQFXBKixq(YY~p?r#nka(i}wrRK-^?H_waD!8OZ`+_YUGQ1^T57fCN^ zA73V|ZXH3h-_(3SpWjVdEvOZKEPaJSgZUn`hq?@~!k4zGpFk0eOQu~)E_`m%GYovp z#E*jQ7@sW4saK+utWv0!>mLs`?IA9h`i36TlGcv*hQdeX#wnJ1H57xBLAibyt{&jz zA#+Bb-%na1sM`l3Xg)BG-|Rs+?ZBCQ0i(bR9x#ISad7oV#_8}qc+H0jm2rRO48}Z= z?}_p8G5}70(6HlWaJIoAszF0J1|$vbF$5cc36jO~E^wJKfOK#G@`L#Vwcz(n9DpNw zLq1+ikzLcZ7FS7Agum-Euace+#vFxTYPaJBz#TdkekuI~>*w}A1}@)ftlu{r4hKhg z68#-qV>0Kj`nWtv6&+uUK)wD}p)K5RBd)=nYrnCKr@`qD8_WDsZ!t*PV^KplVZQHh zr{v>)yamfYs?b5sy>1m~{3FJ=N#OlpmOIS9tHH}md=#AdGk+-}*Bk{nyG-Nn1iQgq z6XV;^n`kIQLvq7TXfuaPhsV5l0~{iCjo&r|(Lyzhk16%VrrnJw?{f^hZUP^KnoiuV zXTWxh$0*oop~L!y5z=Z|%^Hc@#c}wT`#%cKuQl%2Z-8^_j7P;;@a&Vu?PJ6!+%7P0 z7N2JxxYE@BCD?B2zxZ1C%jj1rf`%-Uz{}vw-;Dd>t=GZixrT$E2d9CP@wpdV1^G;f zv0~PCH132>X2v&;3EfuIQ zELsGf!8r`hg#1X(Pia@?qcmQJh|PV}aL@z#>3peBQXjqo*l&uc;xJADjBm;P^eT8uGb@!R%yZJa5eS&hx0EPe z5*W~%4;T(M4WM~?iXRxoboxxe!#}lPJt*zKE zxto>p__CkVH#>q_WI11r9!dw*!u)} z8||C9eRcYw<m={SnID(8d%wHrGtE99)A#V zWQvQe;BGG(-(fOl;Uaw;`^)9C^ymH|6;U&GI1&RAK>JI-T-eljsF##DcX2N(NAua+N4^?!aJp%ZS@D64&K($M#s3f7V3RI zkhV(d|G=2pIW{`NccmJfXT?2)^W}5#fpmp2`BZQT*v5^m1pf+7diMnQI5@eOD;~v# z&D1{=TxawTq$)I=G6_hJ;p7J=(_kpL65NMRI2XL%)Zatj@R2mdqIRBx8_h~%T*`c; zi`_;FUvNJ7hc&i%9cJnCH28|wu@Lk#-U%*v1Mer!9Un(JuCmcsK5qfo{hE!oaef{w zueQ;533-vK^;Mrr8^r;gXTXEGHk!sK*1?&ThGBzd3X}ux$Q5k?-wIA%F|7Kk9a4Wm zctJn(xum8DU+a^0NvkEHrQW$3cXQ!l{o}pTVT<6@HXOiJx0gPyM*2)p=gm@RDO9$> zR_sNsEqgKXF^X|)57Co&bHXA#?<}+#yZ|X(#pSQ9CUWD8VJYVa_u`Xio-KYvvhi<% z{VNltl=1iAEo1S$mCKLaM=G7VC2>7t0vq??8|q?w-9k-bJnK7rLVwv9@BujYu$2_v z-{Js1Xm3b-4P)|egVVpW#?Lgy{cDJnjfwXI<7>W$K|8JS=w|HxQN=gVAFQ+nOJoiA z{YZ2W9>6s#&W8`7x(5|n!!4fl6aHoZ#w8-&|1-GuSv*L1e;s(*V}EVs>ou-VQ}x+O8iu0ya${P z53s7k*n#6{9VTSQ3F8Ie1*R?h0!+}ClvkfUMKouPv7$>(6Yc-IpC z3%m>VV-J&j3OxEWEan~vq~Zy1)>HT2QI@FAgJU0H+XT}Emc5- zBMvD9j(@e`JQ;ip9)i8`G<_XB2iHpWlYz8-3tVgJALv8%8)PGOBwz9UXsG3_Ru0%id7r-DU@4X88 zI@{FxsC@+nItn;K;9rOV@*qyvFSUTqaxN2QibsArDVs zR7!;};Gf{?TGd*AdUYCr$bCEU^koCy1D^u3pksW;Kzy@+f-KI%uSQTF#8Z~XNX>A8 zrt3Cb3)mKjh*wUI_s$04t=XURQ$30z|0FTtfI9#)7- zmu{tUKEXRh=N1}k&{Sw()w|$rZLDzv*@B)638dzm6xzc`qf~4BZ!=8b5O^8Rb9Nh#0V0 zDVy^=a83`TC12r5uzZQJVlM_R?P=uw3~(j-kxX%eQzk*5f;S8w{}_0s)f)eUH(OBJ zWEF)56DDi_z8VoMD%rKw?Jlkz0h0AXN7r~<}ZP{sgFI@lLcGxlaNnALJN zz8IW~Eh*ysA$Sw|7jf=z7Z%{PQZ;9F1R54&Kr%1i0q6P>-x-*~pTQ;IIefr-cjK(M z0xRM!4%`ES@r+CwJQsYhKR%;K34{I#Ug)yX7QW(R;0T!436&gWm;i-jG@sxOaQB{g zNpP3{4evwq1)|^dbC1`r!R4!QL*f(6#Jzbb3eQq*Kpl8+CBECVOc?agOuXy<4Ue^8 zjQwwUKT79z1R*yd0xtT@;C0|FChqtU{s32JT*)2;FFs|hKi%>kL7KgYi@POJ2Ob6w z7I7<%Pbko5;Hp+O>YfS%2E)a-%|ROB{7$;?7x0=(Y_x#8c*|pWS>yapR>Fz!{SJ6+ zC0}7!+x@FFQ}x+>k*G5ebw(Y*fHN5E6E421ubpzr_`kj*gOjIB?&}Q20+FE8>v6}t zUcb*5a0h(Rkk{^V#$3TrDA?Cwr>2Sqxaz`Nu61c&9hY30fv_*=_5>X6sMi||#e72` zp&cD%X|H)tNY>1t-{p3??XEz~5pde=v3PgYEf(L^PJ1*Ei9{T3w?6H_NX`Dc6p*sr!yMVhSo~&Wdt0afZHDqxgDXX9qn4DI_a7rLAx*LiiKcJ zFl-NdqsfVz>I0{PO?zmvWkhBu67YvyQIE^x@Vos{SA2Cvzsa^tmp2j(JKe5GFc9?n z0)co>?n%izAsPx`+DH^8cwKh4KR$g^=k~ami<&5{?Kz1kX>|LYo~A17>vTiZt~6af zKJ3hb7S4*Y;3@}@=ouC$-7uCnLX6y&y!C(aZ2i@`t3+zzccK0`us7w z$9Z8f5x|s9%XBYW{U1fu^Hl{GTlpVl&nw#W2y(Fv`@L56{B_CWIFD=tqAYHHueJfv zKU$zRR2f|?-kYZO{GL6Zw>*DPsy0}fJ)R55_r4BDN1ALg%2*`vPg}WCZlSHYQ%3l-liF;y(Y-r+Mo9*cW8Y?xo<1CC+3Pd{0=|Pl91PS_eW8r{1m^ej@qrv40M(i#}DC~$tV&RYvC!WV`j|PLjP{i&CIr}vXG5dHMm8i9=+B0zaVNU#GpH$J;zNAr2HT&_ z5tqk>izg}jC0ZOV^W7eeI5J}QOrBgCDW2ddcHKLvc-q~1u`GAm(jgjkg`#fUsoW87 z)a7>!A>7muGfTaecG_#(IP|YOj7OUzg$cMWbPR#O@8-gC4Klqcz(u zm-K5iRecRkrS89QOFajzG-mb$CJ%?a6QC8Hp}; z2wCNJM7=JDC+zT`pzM&BxAH`A{Q5#M+$CMnkVjkox!j{)qg&)kSmkng0xp-s?smC7 zPM^o&b9uG?CncAb_l4YHP@`*ecpF?C+e5#-Q2Vr2%F^EWLcXE#JDtPdu(qactD|9O zQ(n_lIPDD?p}+s7jQ=?0WSj2@AYQ#uH!j3Oniz8KKZ&`fndT0_wD#wZdu_}P8UJf$ zzuZ2<7qdHkKDXcJjfLz!r%SWS7Psn;d0n26HyUyKf_}R<^#4vFhqEC^`Ptq({LaFh zk@-1yMyE!ig<-ABSF(P6z!~ue?O{03>+*Wt?xy5@Oi>`^+eqbx=MRuj~wY43L*Qvp$G=p-GQj1L26ZXmj zw5>PGN>)QYWg^kGe;n%9TJMoN=nMAB*9jTHNWdL+gy8{u(C+j&SnYT!BNA~2f{};^ zPd;}j6bmL=gB}l-7;-wIuCOcM4{ERPmkaf$_RIef8qd^*x1*`a(9k+r0cYoAqowCh zDo@k0$>C_o2DPcDh=V2M`SY=xtdYk(uWxevc@NfNx(QNWg%ysDOx|VDeTFgNdL_RIoFGhzbhx z&}I|`8Ad^aFhj=9e6mD`QJjGR1r-$`2%}M16(K~B`FFqj(hU+5&&SE}VZr!?7 zb#Hg9UC^O+L5FomTBX>DzAmS)<0o4MQ!@15=dPcSmM7%4Ur#iNW`C>3Y!sh6w{=#F zd@k!T3&kI6LG5>O+Su*uH)MyDN+`4u$NyfT*Yy-uNuhtpq*u%YEAr(puHSk^RtqkF{a$HvR=jXg$GAOk zHD7)tJ}&TJ3h7?{-}*g)%Q(JzU;I$t5Bci0@v449`25U22OExD9ZO|X1L zd~*N(iQh?ySM;~>)j!2|_8*#jv|hUIE{>;9q?Gac_O~VeJi&qe%O68U!EDy^K@xfo}OjlC~o1ztQI6HMcQQft>dMhjw$-@)sgr@ z&$O}C8%ij@Th`@7S(Xe6m%rWzYN_$ZT9R`7{CTL<2!pxQFmGuQw+u{;w{#%T)s&@; z>t=|{vRE-iH3FY}R(*c`IPWR0U49LwPsQ{tvMgd!et$gTpTg%ajPLYc*CKy@$??MN zv-b>me9r(*-7|m}J8evx z?FR6`0U}X#wv>!E}fFssSSbk%=} zicAws0!La)v;=F_3=aB=sMIt*{cEB!#3VIgfPP<#3BWmw`EQ7pg0&cF`qRN%GL7+1 z!KrPMEORvYTcTV%C}IlJh*`I6mTITq7@344TBYU5W|BsCU8{w;wb-*Q8klo`XaTxd$SdM0B2|-;2LnT zPXcNGI64TPY?4odt-OAcKB|ppfGgA!$N1r#_iF5bHZ~Lapam%HFap$5qEfbl6=2Qw zP9ZUV^AQBxtxh|^_vJ=ePZCWSBGDEmyzfV3Bqr7ugSA|FnyC9AiMFy}jypqi{CbIQ zWW1}M=osWJn%j{7n|khh{#rrq06Samw$U~0`5oX&u)bi(Ed`I6V({oXB59~Zwao4j z%u|YStVy?f*EuZ0#1ntUt`C=}JI1v|Zv)%GVnUy%)#{p4d$Gt}-Uq77hVp>DVzqP^`ViRLr;&pD3j?lJPeGbWdcjruACXMov4 zN7KuAu+(@!2f-`HB=eP{VFE|hCRV|F!IRm94lJo)Eb50j^qF#`j+Y%hOeFU%Z$ zmMCYUM94-x7?-J2e?m~L-<`+gc%IZ+4IeAP$r^oMJ$IH*=eRCv+RuEtMOM=}$_Yz! zKeKZlTpX43AZfcdEQ6z&CVmz?ADo=`OYjmCUz>>-g7cWY2f@2z5>+rh2(H2Shy=^j zyA4OZAh3!FDBv+A#x8yaE;e!JERM=2p@x`zG59z*mz7D6Y(yLK$#gCT=asVhMtZLW zXHSvnkiI)E{I@MfqDf%jl^o51fw7oCtD8CC!zKsbQ*IK49l_BOlA}Z-JM-gt@M@T8 z!PNGG*Mc#DZl;TsqvfVDDFWwAHT+ruUI}|S%-*-^EQ_#=muIJOlt0bLrl&f>;zP!~ zC%`)&G@A5nS8%ikEHOKqz&Dmk)IpW&a~M;{l0A>f<;yuIa+jIy^`!gu&ycOSFd> zcotmxJBj>oTua$q;GzZt9JRy-E}UWLr(OknaJY);F9G}SGcsn))!1K|JQ zf<=B3Nm4n@*sX2gjOm8XG3eN_E4j>ONjHwFz%`720xx+Ob21xpKQYSfw!6L zRf6{#EYoQ`kc3<3Ci3!KE@vi6@ z=fOof3p_=YFWLy38)gNJ(HKJD`SNfb$m=-r84$fx_zZ-1cq1V7;Ogr`+Sp1!l zBE38uoizD16}%YZY@Ix{RXb-3>Ac*vJx3!}7#03B`0&dHp9WWf-B^GYfbKY`W`a{0 z-wy6&(tiis%EZ^8bcIs zvQ$SffUdY2bF;em7+kx`sLif@;opM|i=rRd)KW^yV3qAza zYDbIjI`B#pe-F<7UZUMh-#Gzimr4JAup8Vpq2Gqy#Dg+CNN!l2GHa-CY}B7_LqLSC z`fY>bE%c4XC#8mF({3!<`#i(1ap1!+(~0@@JlGC>Xu(el9alFF6V{4y#}T+)oI-qA z{A1uTb;ccgJvi@-@lruIA+PI=+sAP5jhMFsn`Z&I(lovYY&VTxaWmp&jLQ_ogAOKv zSHamo8TZ8rx4`8mi~uhKr-GCD`6aj-^4Sp6npyTp+&9k}JOo^O&fqfe*`Fm^35R(e zw~Lff=s@R>tM6P18=>M_gus!V@%^BJZ`BT z87ZU-1N%w=|2XoaU?P}?@1#- zkE-X!2!(?D_;~Cbo+mT)U*LHU8~4*R=vA5Yx`l9zidJ?F<7g^avRE7LyZ;6IO&K*g zj8g#mty!F22XAX>rSgP(PTCTIfa!coiQ-KH3cZ-ZFtAC17N}|C(J6uzS{zzgX>!64 z%_~GtzuZc>EKUc(BQCSj7B;>UcCw!`0+1O)ikf&dcq`^jcBHua#T~*jA(%S}{+Q&V z;9jk*w3pdk0ZvV~(i~PQ*GxuYOflYrr-JW?ep|MlH^BL(0G(35xJ%gF%2A6Jb7Qu( z;SFgf;v#{&vw3#Izsj}-cT~3DBka$#VZX#~R?26~eo5U}ENo7Z@A-kKgUd>OroIN| zt9n`+I@m|!;FigaKVYBd^~N~spqC@O%rz1o4orl0meJSfYu^ssl6W%zJ3hfmTUornSNku+g_9elPJLO}Ar4%PGj8N-MjnU{Vxg}adGIKB z#A>U4GHIRRBXGqFhM(=#S+59%eCGIvINF5gTbY0L>XB7KNeXwHI&qz_KQ;Km!`Pn# zRR)tUGOOxIQfbONXp5 zGB~Q56h?sGHv}j+hogU)_{d{OR50SAJ9zC}j@~lyec-=?lM7l8-fGf61Z4_I^*;A;>G?%$!^s9cR080Gw~dJ%q9S365TV z-I#njxEO3>&i)PjBRCn|I`AoQaxwj$#D&c?{s{PtF+Pai#)Gpa0r4rE{NQ96+yJfw z_hu752|i>R@2PJ5w@_k{yUfFlrozxmS%7k}+el&yz772CI-A~ywenHGegA@mU|i!* z!4v+9_b0}ko<=#YvC%j-??kZs4IAxbybLU^wb54zd7ciaYd#P*^8>rgLPuvXyG)y_4zn{!vF z+YboGESyW(_%*J&z0`@d!Y)oOTaozq)COB|8ohS@Y>Ad*3XNm?i5B6V6CUC9&O+~l z7ow!A+4wCrL~eXBEM+|V06vN4+w>z+(|;4}uSm2~jlTtN8;9?$On&^AB-7bD64x_L zp!!RELtTomTj)s|&-n@;`d={=wu1AHSxI8!t-rbTyEXQFC*vFFw^mw*C29{I{*LG{B7$p|&c~0Sy9Xs&$2`9GDE?*u z#w9`@{{dY00$xbics+Rjz{EFG&E5^iuz&%$2Q&G(;37mMm&tFE@u0(?#3`&P90TX1 zS@jFJ#`f>=^>!z^DymrH2)NfANk0`et^v0~1hlTBu@lEp6(&q&ya>F|w1uC53HFlm z^3tNTfFmegM3!qfLLu&?fi+w>d!c!jeTF-Yfcn=IqIj@yJw72afj!_n@EFEJx*{i#gj(5T;x8Zb zz(tGUAd66+T)buMFtU0&_z<>eDbwEtu6x_)6JxGQMhNwmq3Igj-!cS{i_Y*67Wex2>$A2`d9EgTr0JI87Ny7 zTxS};-iKr9dK<|j*otL5s61-4%6;GoC$0J%T7i`_omc+eXGw=jB z@}m*bjbNj$ahm{_iB|m}*5t?Lqnn~rN^AjdfotkyYs2Z4GZ1C5De>y7DZC3l3)YfO z<7tEN%>o8GFdlXTlJYQKWm%4VGZg2CYQwca+X9{f!yu16@5SVu<4_gX8;xx;c)pxz zl+pBwsB7$5at~ht7n^twxYWc$3(@IXS*e^&@J`W%jm8!nF@On-eH*jd~k);s{g@TTTsh;Wi%R0nC$(}+>4hBu$w8gEPmJ`2vym@P)_g=iu_SxFN9#9>KkN zIU3J$=0H8Tpc3D0S|=QuI}7*BcM!2Ojj{jfkDzsah$LhVM8QS74E{TKn~6I;hCjfa zF|K5@!As9t8&0=@kE6_1;Nosc^nu601w3xW`h+-Vz}4wC>Yf4z3J~JLc_<^C-^mc3 z1h2c&MhjVpw?Bn9Ynk;9=qS?jz&YlKp+(Kh59(`)LhX3GhKMc z%`WBBQ-UkQ8x1&OVRtCz_Xi{HutUi?E%eKF1%hr*IA#wxJ%NBb<{At=<%7E|z8k_$ zdm!p?MZ6Jr)EG4E7IFyf8*gDy|N?Q;fQetrJtPVRBB z7&TKt*#YCo@Vd7(+yF()O`5>$-hm(_ZuhhHzhA$nC32LQwkT#JH5Y6-ldh1 zIYM22z3!CLXN7LE-4*n@d|{W*=Xb^I?!a$LivXr?K8; zpFu8d!!EWeU%DlE9G8%7L{!V0i_JD7`b!Vw#+sr_%lGD)y>w(R6)n#%jLMC6WsgTI z`R4lIfOMq!(weaTqf}IgY0A3kVv4QFZsAuPDPoo`+_gzzhgySac}^;CaALQ1mpsKCN^f55 zlkSUz!)}+|5%G8e-he~t&WkQN>~gu>frv94^E&-ufB2$<%oBBnf)2OW7xsjlPP@bF z#c>n!I$}77{ob&vkJFS_O$sNk6D&fI$F<|vtQ(h!CT)9viz5xyAmd8Yq-npY8k!V# zG*m;ffPPIy)`RH&O**=Y@4{sJwK;To+_hMdYQIFB9?z7!9pPZcL(Y=Pj!Ab1!fy9N zzDTi0og|8#wzYTL9Uf=M>+|@X!H_Ey9Za~Sc|A(zr(#>>jh*5w895Y-IGoXFEE)+% zBL2aBii>AV#r4na4EQ|`hd1DY35VC?r{*<2PvZtKwhd|A zPG!|cVvoEgx5$>!Jr40C3Y~S?a9Nwgzi+4g<^s)Fr z)Au-szcB;N-AYH}0jB)sWrNe+m=o$hKN0c&NugcE{9)XQanA|kDn7WGY3BZwJZqk7 z?f_hCcj;VL79B)ZXfF@}cgTl#7{4BM^vqq7f7np2q&)72|L=79+n_ zt`5JmFn7e5-09J2k!WF9>HMjv-Wqe_b;0HG2OWN|$Lq%%Q}Y(>Xvofsv&x@H&icLL z=?-4JI0l?JMuHAcI2exUZNq{5Mc){ue7;XCQG!L5EajGcV%H2DLUxDK2mvVinv_fh%*ogd48oADGSbs zcVzyeM?H5y9H?Z>w4^Kh#*3L98Vf7LqFI;daLUU+i|y5C4v4pK=o3Ll%<1z-{gH^< z8?q}44~l=t@c05DZ_FF@g?z3+Bp66Mb-VC-=XM8Uo@gu-2nCdNhr~j4(IN43uIVyu zd_$VKrS8U-sg=2QFgDpo8|^gBZWNBje2|-MLaWA07h`kdaH(a;zv=99|4PGaUVXVQ eYPy#h2dFx&R-E{fx^u2&CdY->92a0jK}AJhWKdCHL=i+qhIxQG^8VF*J5^{xnx`Kszq_1!?m6e4 zb8q#&#cdZaZo4d-3omcqiQDu--=i&UJ9k&*w7Sh!d1A}5R?mr5>AvnZT3c1>U0v17 zE7_glxYeDZGvck{NwxmA^YoHm-hWqqGLnN|FVJ8e6=S5=O< z#a21DYX6AwHoCSdZ{*cBDyg}?8{XMgc)V)e=-X_CKUM7<-h08e zQTJ^d#l^ObvNhkWbv{B=vdBpp5X;$Y^cc7_O{8+L&BjrmqeP1>{qO&aNLl8jG&Vlt z3!(yWa{dYLYj^G|C{KP zTcm?bz}&MCAc@qE?cnhL5^Y^-D){C(qGRBsz=r3EieLeeEudc@8j2k^WBgC>WN;(K zZGI%GNcM+e@k75F0fD#q2|b5JPBt$v0pp-@}a zKU#mf9p8o9tAEgrZ{!%Sr2Txt&PA|ec7Ks7>sbFlm}S)mky5*8dtfZ+VSb z^#L9D{x%vJThf95JExsR*sU5R(n{u(u?Q=5f=F46m;OLBaF|HjnRd6G!InnC>#W}m zCvLhK+A>}XC%RVDtVSZ7STO{aVEtp@gVHh3*079?)95WU&9UNY`ll#sBu+N!5kaSMZ-SWCxijU z!Q2imgn(NaU*KZ5Ir!e(FelH^*`Rsi4%<0WASoF>VgrtLP7-M^+v>P9jusV*G>~z1 zI!8S*USNW^#V$Dc>v*j#;2dyr-J@Wah4VYWh~NSyuN+*mK%`BK{{=2be^G)p%InC{ZZvFU z10Dt!tv22GF*t1DY!PlD=pq_^#)LFBVQ?Nt72wf~{|r86QDA?bK3L)33r^^c@K`L8iz)IH_z5i3fX(|7 z{1-6Ri7V12AC`Q;JUG(~*3EUF1s6bGG8O$hKQ`aPueE7^yqcqfOU!s$*_oqN51R}B z2%ZWyHek4HQWuU&!6M^5;3E*MFg_373QqQS!HHXDnZF!tk+0D?G*}my(Dl*iaAWDa)j1U-CWb|!5XWuCezUe&c*y>9-a^0ZISmXxY}fm z$cw-?8|Vh`Rtw(?{(3b|9s*VP{R_Zb z!6O;J2_6CY#c^(7qb)sg(zAN;GdyKGDJMr z!_XGJ=71MJQL|5!yja_Qd^4MtmxK6y%{<{cc%g;q8Yl`*W&{b`5}eE+#o*nR@$Z1w zTUbHH$+paofE%0h^}pQ6AI)5Xu&`Rag}!z@;s5xd<;FI7ia7(s>c0+LtpEaX( zBDnl(vpmGW1HZykj~Vm~cqPVni$|-C+`~}eH<^l*fm@m!q-|&@$AqM&=fFFUn;yAg zI1-0Bf&K)RFuosK;7#yr7H){0=U{w1o7!wNNKc=EtIF)yyczsbZrF~Is1DzYw2WD_ zGYpgV4ffCU9|z7lW$s@XjT;U)%udm4@DYnTq1d=mUb9K-$H22TN8(ik&u5K=9XLl# z(hq~}o6T)*h^5cs4-1+rjIq3f7BhRlGzHsl;-FKEFMx|*Fz5B0ih=_+4v&#X?*gx} z@DA{%rVgrR^DlyjTITnihW&s$CFZxF1!yQmL(*YyOw;GjVH-mZNGLmX`Gpq9)5?s16J zmX4Z>b|tvFm80fm@h&*Kjict`lQo{BLadv`))@~jvh;5N=UV!YgDcE_jpPZ)i*Mlq zzo7{TkYVW(`@Cg)A3wv@1QU<#m^;(0rXcemTre6a1rBT-M!7I# zK{N_>*x1EEC~WZ%*$h60g?6+4#~`Qii>3iS2Nznn<1FZbb(1-%IQH=a{NsG^2edD= zjFZby3A;Jy5R*F-yzW{DEo5iqJlJlz)c2ST17LnDwx2t}r4|FdK0Efw68^Qu@{7na zM_i7YchVpjVmmmOE%XEwDUwb8YL5Q)qx|QY-$#&LZor{u8=oF~X$`-lp*9Oqw0Vew zR5pJ;;YS!H|ckys-V9;1Q?+)IM#Ioucb9_ya4TE9n{#K@Z_Ea zvA;jZFA=you|Zq-!|j?sh>45lIcP64`Hs6|J>KW@ZCr=gv=8|A?bpxw6E41Qnz8T! zxba>y7KYr5*m%PcuTMrgc@n(-4O7!&_r~TQ;AilCJKu-I_LhV83kg+bgFnE)y-ej8 zSb5(;WlYsci#U28{ZK5vr9QE)pYSsq+J0Ibd*mqpd0Oxy2J}mF5-}scuoyP#;H=3r zz5k5!h>Hygg&n&hzi{+F&TN@g^soW^TC;93F@Z4C4b2b9D40bN6j^Bv~*V8CP}! z*mJS0lE`-a6S&)_&UpSd4qdNDIhqf4qTgT*yyg&|UW|8v zvky9HEL)gggDe2v&$vIh-^Wh+Dly(h_r*@w>^p4N@4g=<3^}QcEj;M~e60K2)c7Pg z48EEPn)M(@kAjnTlf7$VCk1b%-NgPp&t=8NW!j(TxV%_;3;T6E zcYVy?+Wx(bQ}nKF?T_0&d@S~MTl-%*EqVk$c>E(#vYR9BKLPKC?_F5XVC^V=Us#9l z*o=pLLA2;4e8<9BHu|R@Bie<>E%e7bQlNLi89Nf+#f<*3UlQda$?RnFKLhWZn)nQb zevO(Q$CuwgPe ze78s=p^?#l%L$^gR?hfMz~DcD^SU_WpT?V$#?cNm?9PP?n1CO_6`4-j%mfsk#JBP$ ziBcO^2yC^`LGZz9NBnc9(XW1kZ|5JGybAov$B8e0Mt|@WK8@ezq#{GUhK6(B5-o(u z;tk-^vqa0bAdvEJY(!RKMI95((F@ES4k%r^R){4ai! znr3dGH~7?hi4vt51CC>*-Rs17v5qfr0YC9{b;Ms12J1f)t;Y_s*a9cOBhR5wAk7*5 zb1p)m*G(7w9bDWRr-{V~&J1n;H1QTR#{UEVPP~X(jDr*x&;!+FD0Y;_7FZ45X$h*s z;2bQNRN%2jD8lcWK6W(5^=!8}{|Rt4<`0EDBPb7mbKW;&WI$6?z8joWi1p(NeAo;E z&xj-<6&V^%Yl%$vKc)`{w?YBAI#Ga({uSVfh>2pR@H^nL9Ml13k+jzM!qC}Sb82n` z7ybtdH%`bu4BpuhnG@^B7c6UoFLQ;?ny5YiF0=%dCkt;43+rHOkX-<86`b+MprK%H zTRe_hIB6hLXa;yIHn5Ma_ab;IVnQ3p8vccb&1fiL{MpqAPkcN*$k@@2qy0k?8O~T> z0=P^>NoDyd635A+EHR{KXnX?l#5^z&xE*K9k zd(ZUQr{Gh&MB2(0^jwD&%t2u`eg-&qKfYzM{-fY(_<*uf$2vd_(Pe5-t^g}wlvZ|0dcPbA5xuR=pEqByB>x*tVpy0hk7{|J5sL3f_*D7`1{+!&A37>}X9 z^t$vE#IA?M-~z;4ynpfyDD$t1Af#w)C<@l%-;Y>BIT~_smxaRdWAie2JJ|Rq1IK75 zIM>o&1m7J*YRyBxVWDTimF;l1WfnLK&K-&kFwXCfyZea5ZOItldLZ(DIV|8}0*VG= zN0W_nnGpE$U|hG5NG3A2-voiUs3e1Q3fStRJ>VQ9mShZwNU3?w#ACr&a5Q*PwrRl! zije=!V!+Ys7?9y`#Ot^*q0`OyiuJJ=zZV$12y92xmokM;fWQ7E@hgqdUv&#ij7(<) znZbRAz=fEf#kdWs(*86Dt!FW@O&iV8%SW9?hJ?v&)L;zWsg`1MF^p4CjPlF`c<>y_ z$;X|XnY0kkk1~r(W`WmOcmsHygeEEZ@)CLd=IuJmgO^WEU$CK6*P7< zeI{IF5%>$ZGRG1BS;**rxfB*dIWJ=hHvR)1f@7Vun{kUdI7I;mVVGedjY`q57g1iq zj$z*1OBGrIwkmWQ{IiM&6%&|Kj;QbBAmp34$;X3V>5rEt+u>gDnx5v4?ekEg2PA6= z{682CMFn`9GXd4$ie7j(F#+S|EkDy^0Olq7{qgoBX3vknoi6^LG(kv)Bw8BA~S;_HT?&`z*@q=Oc*{;CD2Eu*m^X5oelq43za!ioAn1`P`*;_D5| z<%_`E$D>-Y9sdKo2%O9l7s1PrNQSZn`rzeSGz{gGnfxLioYwNaZqcRH^d8*0*B`(I z#?I=0&I5>2B%XClfpy@ipE{@lA7qRji*nmAp@8r( zf(Vz$q|YA#SKo;G&rCdPHG&Z3T4nN^KZ4=}i)~^Xyy`KyaE6og;x6{NTF9*gWw#P_ zyMivaUsAe^+KPzo!)fa+1zs3J#Qs@ENGdsRgZ_`G4i5|#6P zl2K(n>e7;`AI-J<`uN)OLWSG(I6X!Qn*>`8fjS;0`3nEH4> zX;(JEh}+9p*~iVZKWprd_s{r0xaprD889)oYciUA~&RQ#Y;m3Wl0q z7+haH^`xAl^}cR<%TD#?TuIiyFR-@}>l>&)@3s%Ae^dv>-lqOV-9G)O+unXmeT(LM zaODWIKPew8xBi0L-ci3;U~gD|&GEXgdLUOiFbVzW>L@eesRw>eE$w ztBhY?;PgDNUCD4MN+2M6++I2Cl0$B4J2-iTWOj&;*DfdBb0yNPmy&u_k>VzXBARiN zt$+A$d|vMqCABF%t=9ChIaUK*#yWPXD?IjorbDD#TW91m5A(*%3;4J5Q(^P znU-*6^x7b~wY{j`x`d}Hz-I_(QHweCs~ZW!GvufoR6SBu_N#uk zHzMm5jf9OEs^1lG`@^#8@k?sRAJCP?LT=A`w zrf8~XHW4P&Z&ZoN`b`w*8=DBT>reBN=XV-Ts?)8oe6LiV!cyGywOBrOxT%mQbp6%A ziqskR#!IiIKDecDPxIfHL)L#Nv={4rS_utm>kQmspVX!fOT_lK5*%EHCm8igUOWO6 zHv+&f>s%XQh2}=Skffj|;tL1WKu}3FV3pr%cg1h0+p-q3$@;!5;ZFUoHbU!+NI2k9 z{gU6U`utMBtr|*K=mXjctq{?8$@nE#)Q5Ms>XY=6w!%9ZC|?0&l5oH$horDKm}m{S zB>V}YIwI7g0abUl6aJYI!E4;3`l7Nd<6}g~tEXoRo@Rd8CnKwdLsG~a4Egk%vxSE< zWKYQDm4a?56jr0*u&Nif7dpq3SyP-BOq^O%3*R9sXlP3yGGw{(xiYTh;j)sHy z;1to{5rtU&=h{{0j#Eph(q-rOsQ&|3oq4IRQ*aDNc*%iaQ1M6nc-aMfshV4=Gtb9A zGU1u#as`m4JyA7?gz8OIu2QGm6y2!AlbH590zs)eNKdM!C-;F@Myw~e@dRw)w zv=&>MBeda$%Su2AdHq2-6b{Qi4?Y6M_f~JkWbUc0VxGT7=$YyEyCbU0A9j1aQY7l~ z^w*8%W=b&N@ynrT)Q@z5kA#`caG9FkMG&H(i8mPLtx_PeUp`qDo3M z`1`jcu_RK9MhUlFVic{mn=}ik)Fjj} delta 15913 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 CEBK-S diff --git a/artifacts/test_program_methods/malicious_authorization_changer.bin b/artifacts/test_program_methods/malicious_authorization_changer.bin index 2b41c19755a5c089217ea5646dd83855e71a4729..464af668b075541d84131d9b12ee6514573d8589 100644 GIT binary patch delta 74065 zcmZ794}4bR`@r$@JgqEEEe&DuRHM$C4wRR|4QYUV&%K= z!Y(QPzif$M9{+z_*OY)Q5!CVjw{=SeIs9)jNQA++rhxxpO9V~)|5Row=*j<*5acIf zOH|?q;R50*B=IYZB`Wc&a4GS4O9WTrD&-ltrp;j@xPgMRAvR=71P9{P#N#ay9E_zs*+NMupdjrWcTCU4 z)jOqvH1=FNeA76pftTZaW-Q*4!D_sO{CGqLR

    >b`S*rd1xFyb~e^T-( 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 xJjMc+-}+@ri|7e#UuZY)Q>QgTgd% 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 diff --git a/artifacts/test_program_methods/malicious_caller_program_id.bin b/artifacts/test_program_methods/malicious_caller_program_id.bin index 20c03dfa96119b69223a2c75e605b83ebdbb5b9c..4c4029146babb43201b51718a249c78aced47d50 100644 GIT binary patch delta 72738 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 QCwn|E)(jn+yX2Ao154!nEC2ui diff --git a/artifacts/test_program_methods/malicious_self_program_id.bin b/artifacts/test_program_methods/malicious_self_program_id.bin index 0aef2bd7eff4614ae5f59b7132658aee9a92c5b4..2ca1fe2d898191f178cc477916987505235dab5c 100644 GIT binary patch delta 11436 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 Cufbpd delta 11426 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 bvdQ+!lKFFZo34XY86f)m@IP*Fj_ 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 diff --git a/artifacts/test_program_methods/missing_output.bin b/artifacts/test_program_methods/missing_output.bin index 1c9f69143f7974842d881f07c5fabdbc1687b348..2bad082d9f0b3d3b9dde8bbd2b411efee7123cff 100644 GIT binary patch delta 4568 zcmbtW3yc)y9sg$b+q*;3yM?*8k1WXPRdDmYX6743U4)|#5i!=&7+Ny(&CCh8mvUG! zm|a8byY?}(AFb6slr$Ejo4Jaw`;5`*829yNLz0RSHr!M+_6Mzf~pKaSpOy<9IJjTW>m z*8zzJ+dLh-9!<0nJ-;M^?K!>J8L{>Ubg(~qvHbO4;eXGGuY z{Dq$XH2QmIPS5`<>g>9pyL^k?KOYzkFC8}084#ss0a?_P;k*_7xA_|Fp=edhcN#}y zmZBZ~zNPEp$^WL2))ZQUMgxGd@+{B9k7iq&x6K0QX0>K@-efdr%~3-}F~<7kd!tWV zZtgF?KLYaS8?yn34T|FSTnvqVtPCGNc~Y6_P4#I_LQgkD=_O6kEZl4~lz|bSSImI( zjr2TawhSsdm1pIi9eXqX*4pz*CpHTjj5PclpN?LcyG}1Y7BS<}hT^u7<7*D=Sl#u> zY`uJ9$BLc>siuz201SYo3!~BAZhh(2&0Bi!+S03)w)E=XZiUzPW`VqVrM^TCU8%Q7 zbcueewyN~lCHnI}4F<2A4>GDu8qmRU^}A_`+^qrdxRRSbJ71>com0+-mArb2yj98N z)~rIu9}PUHA(T~pZeSn(*WqY2HrX{iQ5F_!3q60XU6_bel&1UVSc-EK4`5l z=%vkvbQ89N1zE6LpVZ#-1^~Oy%Yv<%Ja|~|*DjPjZ|Y)BOmdb|iVbXg4}evrU%#n8 zcw+9y?*K6N%Xy%z&gLqo)*g||CsHr8!R?dy_!;_}a`ezVu&8wQq14aL$e6Ye93j(3 zb`XXhmCqeXu|gOM4-;D;>QdWBZXZ~1Yy8cvaEC{Ra{+b)7c3MMaohEM!8xL4;D(G^ z+zUvK%mj>10T*gen~9yU5+nIEWTARw&NOIsBs(Rn8c|^k*4(g?t{?Ns&0|;&A5AUF zaL;o^Xmer`M^Kl`KOaq9JjdZCSF*!hJ1|M;^vRzeOSPU`za&IH&;!5QimZ@?m?I}7 zE;o@AmsTFK;NnbR)6fkm@sMZP*u(OF-Ef(Fw;SFqA9**`SrD#E2(^T=j6%mEm8MAC z5i?7NY9N1Frmv`;Y8<0aQK*imvV0C~?XR0N`!n7dP-9f#zP2tmprV;3J7^=}&*T8D3<>x3db{WPFcFhorz>~*z z!Q17Er=gLtyub~JY1=Nwrp1EN$kXuq+TyxR;N%7eZyCyA#2k(pLzH5qc8s#?$flie ztbWH~T%7_`7E@g(Fse$i%t^{Yt8zH-U z3#sKfjD?uUn|8rgc~J?j?l2ukEmOzEw!RChzpd0Tay>f3Aqv5@#Gf1C(x`i%Bf*Gg#Eo(Y4R zsM9RJ8sUHGx;*hbY?DjN@D;iLs`NMH6J4-T_Lkw9@~{Q@!s*wc8iC0h_rYZg)qO*C zOW<=#sJdUdwG=LU3*KOy?oBx7AE|tN=gM|h&w^B-AJja58_pl5K|JhUpsok5=W|xW zorHzKwbHupuW;bB5$(Gw-65}g5t{WIzs8&BnKTmm#SSQ(y7&{i!M?s54ClJ4-aqcjz6?v*m(!1*{eKk> B+$aD5 delta 4557 zcmbtWdyG`o89(>VnO#(}JImb%3zZCHF)PyXp4YwSMASh6(IVQ^q7oJF6KNLKE`xyv zGh=l4C%_uakkckF$?wd*6=cH>nA08SQ4PbV&)Jw7qxq4E7Qc8@ob z8jO-!lhFX69Nv%AJD}ddbMFdIMT2cqbZ{#AtgTN6v!ey=osFQvwm#}<@0?t*%&s$% zQypaB2GB8} zfu-QhXFK|V`tQHIe`EI}8@sjQ#%_InE4;Nk4dhQ3>a*qYoAqXCUahazdWtV!t?zmw z7`k~H7^lLg0Ui8P{clz4)YI|iK_|b~}hja$p2QN#5 zXBAu7dizIeuPY4(b-DjzeUWxRPX9#rTFOrTNbQs%fBc6cDL(g!{=&BtHXH#U_w-ay zQhO8B5tn=+=N(M!X&X8;70f*Q?xhm|z*m%g@zO(yCofJRfgIOjKDLo71f_E4kp#^P zi}>6Rm>EzcET7B;U8~E#%mQac?~07gC^d12EJ|I+rIu-7#*t^+f$4dKnHfA5uz4Oh zUxON<*eb+%#5H)?2-QnF>Nd1oeHJS*FK{ zC;xIZan*bidjUZhaqbY`VcvJC8DoO5e0(~*sntZjU;>#Ary}6Il4yCzg0oTr`G|)^ zAS>j7NwECyBsfQYISD>0U-~jJG4DG9*@XM9i;(5nPDMxT`k-S;4N~RgkBa0^suv$B zqt7#_jwiA-1-34#Th#Vh-Z4-kv%>xJy4;wYBUk*(m#tj6Y{k+gy{mHfugYacU(z3Y zOIKx(Jk|_5?nJ6Od}iCs6HegbK$y&Sgh?qkLpx+vrgFW8tK-}au4{#;-147OzrFP%|AHk15EH%>a+_08$U1|NnquyPm-)e7R$d#p7}-8i}7$JHztV z#}jKh-M*!(b0H0KtCy{GESBr#p8c!79Aol#zkw5F&&fo(xadUU^arUxwQbezu_*#a zbrUYv{0)APLaNtW!uC|Z5rJ@-Jh%m}m9K1pZOtzB95-MbBNE!SkjJ*c2jzm-ppkNg zX>rRDfhmaV2wv=c4c@KIs#^pi)6?_7@(iNPHaX@L*=0$p%TOlAZH2k|6^BrD3Q!qR zbwwbvD#aWYmxEO0VDj2+Flx4GfNYK}f&)vKNFLatf_KmBusvl_#Da4CR3-#-&~U^n zTLE{yfZ-r?s1x`C%U^DTt@7|Ln3jXD!&x1nr;T=vlCDo(Gu8$dcimS_zEr+2|DbYNq7&G7E!f_EdDVtl}D(1oVSQyL;j=>u4e=nWM zw{J-r@~@q+QGQi|lVwv0z9)}Z5MMF+bEt+-^1j`0&J~_x`zXYWxHb#9aBCS{`zc&( zT&Neee4WUazq!(rss}(S&^ zmSl&#{VmAqmwb&I8dG77Y6batGlEu+drT45g&FeYSr?N6)p8`BA87Oq%8wYiF=deI m^D?d{35TxFZ~}(y1z&O diff --git a/artifacts/test_program_methods/modified_transfer.bin b/artifacts/test_program_methods/modified_transfer.bin index a8a87da807b79a78fc34d62f1a7f5ea8fdc60fc1..286c902881ed120d9e55c5f8e819f65c96e365f9 100644 GIT binary patch delta 3831 zcmb7GUu+ab9NxQ~1C22rw51$DDYYdEdYQkwGp06GbAU()G59BtP-kanAf~hiL5UA8 zgaEG)BJ+$IqYs)UAcq1%HGMEa!js{Fv^7SJ35h$x zsLxl5ch-Vyl|Ikj++N&nhlYxW3K#2N4;4pGZFo?bW&(wdr>A&c!^X&@7?a3Mcxo#FKMG*@SV}=o|YpyJIWVqC8|DEys$|O>e+h8Fg$dES74$k^7 zE^`}?FyoRTNK~Li%|1Qr4-ZRC6xX4kIQ`=^#cHI}icJ;Te`ftHPFd86APSL&PD&xR z+vfa@<%rRMDkzwMF(w?^Pv`v2WggH#@>D@iK7o$y{G9(`(q2~icN3-MgnhXefuWal zGy(C>5};HxnS_!DdkCjJkvZYPc$5mbgLsS@;-AQFYTNUxKbSBonA8T#D26gdVMj_K zi!|O+RAf;*E`%n{+y>`|#ndf2pNHXQ3|e>+No$!8mNc`v=8i-cn@7^hacKt(@^=vy z4Mvb;+dlOM;`GW}3}@vX#ZxP1OFgf(JAU{**bbN=WKl1u+R2SzX?r8WL5IZgeM)&M zvo}3L3G6Th>9m;SZZ+4msivLy!yjDH_}%cV+HJ%z%=_XKMM%_unoP}woQWH7zaH+o*N8G3YD@aWU8H*O& z<$+I$_G$2$BBC<7tMr(Kc(kq?14N7%H`==mT}1`B(38mvCCdm7YtPnTYO{C~1U2Xp`c delta 3818 zcmb7GON4B%MLt}0#0`dD5PLJUy@32WD*A!b=r!2`21Jw2ViRQFfk|J7gr z|5Z&*_fPrvR^?=)viza&?f#QNusgUKd^lG*HdpDX&s7R{R)F)B!NA?vR@ml7Mhb^} zZr0C^6vj_%7zl!(5cC8l41yGL_vs0C`|;|ieRn(yu_nuBM2H_3Q*4i#lHbdJY5zGx`&B$f#Sl#iN@Y%AWk}Dk{ z$+Su!L}NZJZggF--~BTa4wfPe2|?DXSjEzs#0}4eFRqi?z?kcpV5+F%FrCyKw_VsO zbZckB=gL+lHsZ`08Cyxz-N1j(hMP+SMn;fWYseY4B63?B;rbF*L|aWYmR4gDQ}<~j z+*l%9SOl>)TFFFP>*gBa2erW)3(T* za6cZUHQWUrqbB_0*?sN$ehG(b3GvEr8(Gki^Uzu=!@>D! zG4+eiXJfdPf;P59(p=`FC9T}9wJFhs{!wdZy0i-g`MU_qrtPg|J3kGEO#0?chIjL> z@YKbtLHV_gMj`I;b|D2Jhx$R)O|1uuIy(`Lx>Sz;my{%@I|0lej+8PMzQTm&l%h`A%>;!^j_MR3V&@}KMU64>7Je8(Iknh|>X z8*r(gacxk7nec^0eR0fhe#G3-a$WWP<0)^v4Tec7F zf6tvR7b|Y`=kQUt;R--&d^s>-ea8yK3{rF~L&+ysfL=opRaQ`>m`ZqJb=Cy*9oV^K zVQsq8!{ALf_#;@<+oE#QzoTyQ_2MILY8_a-JVVg&t6*=fV`^Y~hMX;cG8k(43YcV2 h1_Q@-O@sQb>Ef%8{Rha19kKub diff --git a/artifacts/test_program_methods/nonce_changer.bin b/artifacts/test_program_methods/nonce_changer.bin index e5659b804d0f6d284042bb8008bdfe3c6462f136..f11876de4afe613e6f11d7ed4e30802e9ba80cd1 100644 GIT binary patch delta 3967 zcmbtWU5Hdw96vMntVJ)*w(gGDwvF3Di|KH_?>VHhf%BA_Q3*vQ=iCpIbQ85OE5btG#q8&tcb% zca*>zIRNtc9JqWMfF*q;Fr2q%&gA#DZ+GZ!hpoSxdCr}#?f5D`dbRWYQ!~MA_xxtZ zJADj*LpvR=_WCJr+f4;7P#6m>gMi0TNMp;s^H^15sv{mVYD5qyO)H>pef=sg)PqkB zmZik8@Nr;t5CoV=L_|mfOnu)FDLE^XR>0^waJ30F#+j{9*AX}2<>P3p&Ak)jpv{po zGm?R24=<)`*M(%wI&8M?y+s8qeCaaFFsCumoY_A|y@3Lau;55a6c}SfjO?!Oy#@B<1~}91?1szjjB{SG zim(YngbKA0w9{~y{Gm@#Tl z-1W4mY%+|%y6=B|VvYlDOv zsHkFp`3d^&qpnHETo4|{3hT%|wij+JxU30{eH{e`QALpbc`w{jU8rKj5a5$)DcuO3B4uRO``nmS>(uR delta 3964 zcmbtXZHN_B7@m9QY)Vkh=DHi(wp^Em7IQD>bIv)WvZ41^YDOUx)pE|68Syhe!>qW1 zkw1crEKdE1G>8O$q*&e6G)**;O)(MsfZQ}!G$bhc<&SD+w_siG+?h+4`{&Mi&NJ`( zywCfdbFZE5xOTc@-?6@_9ormdnKK{nJl5A)od5o|D}CFq^c8AX`ietsg+2DYxy9ka zuG;c>#VK#yx2LbiqXm1%u9~5tG4^Q;>gVzC-#m%zbEGTaMW@3otx>*uDyNE-EpU< zgb6sM8j+AkK_D&t$)#1qprJ}|q9In41{J4wbMh@ORBN7FQ#K|DO+;Cs1Fe~kXn;b( ze65WjoXW6_n*qbyz|{uS2<47K-bUPjmrbCpHqOqU0BwvExslWvd}=Y-ura{vHzGTF z(VaaF5`$_(N54sj*=;LjRmAQdaTj?y5&@+m?LuA zfi_bK6uT#wB-|tEUPB4`whifcV%IUywlqtzGXIyi32Fq#xU;MA?q#>TeRAvdn`N8I z$f`fx>2~0{J7uZQk{;yJ1T0iR=qnQZC(p$v)NtrrX2U-BN9M)b0JoOU8wdNhGy2L`iP{-VcVo zz!(JuV+<@Ah!<=fj2#jLK#n0&X8j9=^BhZZB<-FLIj#qrXYj3 zVt3sD#1;;MIUZE8))Z^R14!fY*+mDz!B&hUj8sIGGz=S|D)#qZ0ryZOl$6{=iXiAC zWuH9+wt5gnan*t_f`<7%lJ>Vl;8icA5C^d{Fhn8cg4$O;2RmB>pAe!#q+|$1q-4du zaR#*8d51wYyE3>zsq@K-MXIb$&dQK~ zv*I3OC=^jhI1aI34e*^mfG4NdnR9kG1_R0MsbpV20q&>^Df|e6x(nSWK~FUfAs!4g z3b~HQNfe|9k+T3OUB6^1`+hQ&d)F`DVBp}EmGb&31ZvU*?QC z-K8->HJ8zwvRxh5`KbieoJpXDS>#Cq)oq^m|50+H=4(IF-~i0YFnQEhCmiefDCqwV cf=;m1v`Kdh`*EeEYkS8jQ0q9=^6mZq02{wr!2kdN diff --git a/artifacts/test_program_methods/noop.bin b/artifacts/test_program_methods/noop.bin index 023f2e21f85e7d7b2683d207f31741c4e84644ae..e40249585acf9a4e9e2f89209ea5c85a296d5c0e 100644 GIT binary patch delta 11378 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 YU#;a4w@cqW#XXzj;(BtL`{CRE1t~<9uK)l5 delta 11375 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 bvAyw%vh&rH6t!t$N)^XN)cB;7mmm9oBrK8p diff --git a/artifacts/test_program_methods/pda_claimer.bin b/artifacts/test_program_methods/pda_claimer.bin index e1bea8f816ea609c2d34d44905a186cbdfa2f104..7bf306ea6aa07b78595ad524b6bc98867a512c1c 100644 GIT binary patch delta 13237 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 P5yyQN{b0W3mB;=cax7M; delta 13336 zcmb7~349bq_QzjO&xD8(CM4l9NY4;3K!|hnT!Ih|S-AOsQ-5HM~B1qJoL z;y+;H3W_T#Y7`K3aAh_Agc1) zN%<1%!0u%Utz*T`z0<@lbJCvZ@>yDjMKG6Jgk~8jWLA^%F&HC^nf0-P(dF6c?S=Qt zd!#=sG%a79-lj>-rAvp(DhHNtOK)>yVjT_2u-LGslFH{@M@e0kcda$II4fl3LtQG= zrDRylTtwZ#qPb}j zEfZD$zF1-+-B}Qgc#1E1tE-lp%CqG}ca;*j*qK{eZc7^;QW~1FnTUi_6<$ z?EqaK5AQWOQ|>AJ7txYjSb|y1l8kSN$~sH5kz2L}+%Hd}C9s~!-`GL4vztWgxqQaA zMEl3tsWschgxXOL95%IA-rY$wKWHZ_AFhLgsZcwUZ_{Bn5es29=VCB3UgM9!%-B>e zU%!W_#vzf!IeRbBMmVSGKL_5gvqH!B5p957+Jx!*i7E`d9=tGYrwk}$cAp1t1Z#fu zJb;YI67A+2_B=#17zVLuvpB2<&j)J;w>nHzRnLk*b1`rj1LJt$E`kTRC0fW8j6XuO z5*9ZHGXvfN$HCWgJ_@cj$h#dSDue@LxV!}17ZL8qc`f)gIKU3NkO_rnFz_}8Zr~FF z@x@0>w+KU~{s6`O^$g!~f+!=x7h+vW4bk#G5^d&&zx5;0gnkkY;G9!S)E4tCTyM(h zc*|p^d{KGuIC2C*S1x!5yc=xg`~$cws`G0nQF;RI~!te(x;S z-ziZpJUM&Il10M=i-}An2H5uDm>aY2p-@Bu!)3?vhTt|zR?_PwB%limU2bo z;gLKPhH!rNC)E7i5Q#?g8eG4xt}0uvs4<`2q|WrWeag zV84M=ePNpWT&Gik#mYR#ujzKCV_<1F%NtuGPfPN=to zMyMbBXgXm_M*=fP>XrD&Ik+=IKTAi{O{YwQOy=Wi%UaU|>93t8S~NzYG_G}2d|oZ0 zYU_chq&=W7I|n24z?pnr+j!O)(<-x4)DpdJoJ2W%{1|vYcsJ*ntpr*z(VjTktnmK~ zrb)WhKZ7?0;T8AN0e2-wFNW5}aY8wvs?Yf3}mH7%pKN5Ev}EeLLJkQni7cy^9iHC6$XADd;z?h%fA5cd`M@Z1wubnB0o<}FL3R{`oVe( zoIPFd+Izq`U@4&wP4SKlf%+LHtOFN<9el&KnF9U2$W8;nEEUVaMtMrsA(%t6=9F1X_y7p#l>7OalK248IcmF1X6jdQN}`;AEw8xw9E= zfEoIMo&~M~YkqtdUo42tElPC?0*dizSjRG)-30#3k`kSQ@p$lP1HTV00&8dQ5_qP8 z3sZ5ifLSTB^)GI|_8{Nr{TMd@q{&+$YdNIcIkk zXnBd9I&-~azze}v&M$+j47>|mrn5rJy0F@}Q#xO;3tR=(6xh1LhzE5JgNMVw0?cOy z?go#-e3nY)s67vk8rDa^9kJmEE`J?-9y~6=qKOWvmg~h&mCkJi8mvMu&p_vH0;Mj} z&)8F7E4Y9=eiUr%W_kH=%+TE?gK4VXPTvF9809> zG3v+EP0huz!oqk*t9Z#G%!+qxDZY~G+~*R=|0ecMlpzv>N-TRr@1(DTbEefhNxACj zo5WS=hcGM~h9|~9XfLi3l$KDpf2BnIcn)3!uLMinwcmMgYOqebq85M$8}w`e*BJN) zFB(18XY=(>gLB`JsE+GD3O3}>MEUUpHu05o=YRtE@u+@Uo(9)|wW93R2d4zAovu0Y z58UD_f-y0AbhQ~G!=(ph1D)`UsZ-zLv-m3fmXK)@k!VgiGzDT&i zoYwJqeo-+wNAyGg-X~ENkK0!8qP@BsZEnXtb96UH#y#D|T^8lQVC=UaFG{{{%22p} zT%u!~-vf_(TwhlM-U-&)s%seTD+5mhSDcWjny+669&A{D2Al`(06Fs0g8cUhRDuC5 zVYAiOdy6OT={QKBx}WWddrL4`XcBnINxj)D0n-z@UH<{^hngFcdMO)z^Oz^^7tPHA3LqTus!|J-OuR1DIN!B*Xj4?R&W9K)oz96zeC&&@{!%k7b;rP)o$WT*9z(rW!406_Mx{VPi(!@q($@y;T{{XIf!wt6pJQoY{_<}01VF5KC z8~5HLP7y-+!x4(>Y&0RMiJHRom8mwu9h11RqTv15X(N{p8H*e3Nj(JR-~t0zgDbJI z)|9fw#Z>UlxOJAnS7t6AytmUT>qFTyahi9;Df5EA2b zejp-#+C=#P?P;~cMt;8h7N{SbYpd^K_hVg=!Hi6FEvYNyyo>%1N^K_O$;z4ji^7=`hMEpa=sr_KG~6))&^z8HV~WpS)2{acKGi1E$bzS4Ns zt735z;hXrpmEx|{V7uwa&v!N=Env7`2b{LmKcU*rf_#sSj`75#mx2v-F$COxnf@uJ z99(+}`Q`Ipif>vYj)pV`3YriYaY-1s2E5k5r@(8#nnRv4 zoIJz&nc#{`T2G1F*NZKh*uF({Qg5`^zoc))rW0D*sg_5pReac|;#Z>5>G!yd?DoV5 zRF>T^c*jk6i|{PH|F}RezM*e^8XN)Jxv{<{1o{E2MRzv%I9PM$FW_SaIn5R5q%QA6 zeKAmLnD8WcDOfuOUw|vX-S~!S^YB_Q$SdLpJ{OBE%JMmQ)xD{&Tks@aA^CQaxWnIo z_r7CKbYgaV+B_wYs{)Qd&Uh4f=)3q0#d#UHdZnF)^L=-L^WL)4HqN&B__Yf@n4E8- zaD4k0;-{wG%Teb$0(P3lH@@2 z{~=oNb22gM_;n;BXGpuRwwO2+_Kxw#36bu>r1>DlA}E0^@JN^9?Dn;p6ne7x7Do%X7g?kPRBLOJEt&CNu=Olb#MftGY#Sn|@!jCV=U}jjl!S-RV1RzM z(Q>}v3vj`|-~n>L6ov%6tIj0v62>TJI(*cYc%Lyo2wsl$OSs3933oqQ+cd84HO7V- zNfB|!zr!3*k{iS@us<=7Ff7Hbr+(r1})>ZVrQr zlAke|e01jJT-OEZIwidmh+xB!XgyOP`+SYHu_*6d$LNg zLECl+IZ~h<(;eWVgLsbdkhi}HFVg+C`l8HlkLMipUEun5fE_40R`u!l>x*rYKxJEP zN`2L4*>JQfY>B^cU>;2eFZ@(LhHrxlD<#@sPDbn!cq!zX125;`GiRq{<7MlIbi}Wl z9e6nLqJ0LOy9VE7xj`4f)vFOw&Euj@_!00te*f|uwYV7z4xs3`hhgx9gUPRFY=f7; z$NnVII<8R8MaT`ua5}hd3-och)CCSABHFQb+=BHACZNa@HLwE%i(ZyMI6l~57dY{C zhVx0b03k#G5JC&d4ulX-NA`~u901oC(p|x9TW1z2Md;YVHlF^Yu-Tg&Tn*Olg7gWpcRl?yVPD;S}_L z$d~Z>e+1WpcXQqfmXSj3SoSN%dKnRfTwxYX$AH;mqxpQn03>_04<7LlZvgiQaEmcN z?IHB`+iZ!)KU;qrIL~RPD(>+k;0q4@NwyAbMjsi>_1A(cZ^n-W?f!2!4IwsMub+U8 z*X-C?PA&<-OIJYGGz;$zAz$F;KH@pu# z{02MaHc1+=2fPriIFWN0FynC)VLLl5%;g~-G!J1#>(x5pac~hrR>5ztgX*Rq#OYSQ zE9#7dypE_WN5bJ~Ougf{C|jdpIqZ*monD9R^#t7>^$*8ImlE^K!Du8bJAyuMSoTJ4 zr<|GWPkv!=O7WEZn8WRN_+zmk{?{Awdtx4c)EAb6-dMyNbh`cd?%y)m@vF(oHB@^W zZG`Vvdat22V4SQpiDT9N5> z*3ho`#?onUvX`Y8f5wiyTMidbjjF?b6nk5vAvx*^L}kAhNe_5j>Ki|bclHX0eGzBW z8Sn??Kv<53G~0N>8`?{CoDv5&cgj$JnD{~guiGuF&z%x)?h}sreGyO8=X81k4zDYq zX>PpNYTYUEF{L3B@?Gx6CNJOR!c>RU`1w9ke%k`iZ`^>L@@pETTwbVdM?(uPpYM`? z<9z=w=HGPflcQSCi0u`ZKkN;K98Rw+vqEwta^1)h%J(pr679CZRJ)lszn-dG=}5a9 zUl#8AUfZAr@|8M8-zzs2H@ac{Rnm}VwdAZQNe#|geO7cfJWHq(^Ex!7E8p!@=bRTa z8!^$N+A7TL3LDfYU*4F}o88{2-UlC!%CkbDaPiFXf!UADe#qsS>??`a)QN+(1RA_y z<@}?#U;C8imv$;rZyV2ZC zb!;-Pw|YI1V9*y1M4irvFnXVSmge$725EXw2`AMFJj=+v5v) z1EGLgw#8hkcG+ysu=)Z%hwO^FWS<;#J0juuU7O8gguV?1#L3Nf%07q7?U8*>{Oj;} z-2tDM^=F@3efJ;cHmc?C=3xzYI;S@oj4NvU^|83psc?F(s-mBl8mYs7RUKZn?H2P{ zYryI9y5Xl^j=96ZfUMf8%-yUmzZ&g{|iQwI=Qe2V(Aa#$tF@B?e=% zCmM~o9KoO?#&XLt@u=GFOLKcG7W({dPc-0l#KNc^weU-G534II`>>M}8FqS|vMV_% zN28vwCm_3m{&2)0hmxbdpeyW&gxwy$#}N(%qN?L7^HIf#iy610E9eP1qMk_T_N)8Y z$S}FDp#iD)1dED_!|vGRY2H}zRCUQV^TO^8*3;Fqr_MQM&QvG<(=4ek{KGu2M}w-I zuB+Ntuglknnsi=OO=IgxzIvqkHd=@8s%F%CBXy0S+8m*1z#Yc>%^QteBgyI~Uz=B{ z-moP@?X%r%S0`7Sx2T_ZEE!!xoPecJp0b<)AZ&&V`>1 zp+L; o1&uaCyH2iDM)BwWV=iB&UO&rnT|955Wtt!yh`&0^^3w1B9}gCXy#N3J diff --git a/artifacts/test_program_methods/pda_fund_spend_proxy.bin b/artifacts/test_program_methods/pda_fund_spend_proxy.bin index 7cd0839ac62e7260e11acd684eba11f48d4ece82..e167ecc6b1a063060ff8075c8e9ebe5c712bcc96 100644 GIT binary patch delta 15346 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 QbvnmArLK6^`tYp(2UNo*xc~qF delta 15373 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 delta 13514 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 bX6v<0S+w1fpoZVE&E+`1dUU64{lfnP^!qNJ diff --git a/artifacts/test_program_methods/private_pda_delegator.bin b/artifacts/test_program_methods/private_pda_delegator.bin index 44d566ecabbd07615b7d3da5bf2936f59cb360ab..1c4dd67289890b4f4228a236988b515aeca092d8 100644 GIT binary patch delta 14111 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 delta 14176 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 diff --git a/artifacts/test_program_methods/private_pda_spender.bin b/artifacts/test_program_methods/private_pda_spender.bin index 70e4c5a0c753b6ae2b6839eed3cb947ce6871220..2db3668051bbba2d7cda6865ae8a1805f9cc3047 100644 GIT binary patch delta 76194 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 OCq5f@>?QTl+y5W)yH~IP delta 76219 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 z zSk6v76w603xzKc<%>7>F_r@8+!vP%<@evUph4aqf{$E9da?EB?5LXS%iFiKlui}-s zSa~sifC09&1AGHltN2D-%c4y6<7wu%Af7P%EQmjVqpoRQ;kbwg;X2jeiFhL&X4(#~ zz`3V~GjJ7dQ1Sb4){|lWdc5m&b^m|UF9`2WXIv`@VT0#Hd@k;-8oU|DnbN*?M!o9- zLpIN(N8A$UC8!W={6vZrD7VM`>A<}e%fb1|m*X8Ozc}J+A}+z%XNLVv!HM-WnC_2{ zUmQ+BHFnQ<@8ZeWP4Qp2T*dp8aF(ceKHjL}H{osAv+X~M&Dr4q9xvhkUq(S{ELa2o zkRT2=zBB6j=FW(?HLg z7vMT|bGitBt$YdY#v%;1m?^})mB%G0Sf{Slm+&5z)697@-ir6J`Aya?9=jnp?VQu_ zZt~rl>St}^33Chua$dR$$6-0GoCje!3!HPXoCVG&;bI)4K=yE=wToYgWf411#%iDovW~%CC-mwIg6ZEVmS+(pTKe!IIqH4Gp*(4|5j7* zH3{xC`P|x7_!7&icHV~T)G_`R>-+onINbQ1(OBQ!7w--h{XmlZfB$!7q32)wD=3ir z{rh8h7fc8KfOz*ihc7hBg{Fcjl6c1Dd*`TR(z-e><4M=<{meXp0^$xX%@&MA|#^AJc zpZCwVCS7Wniz2=RZ}LxLd;cFxLEVV(LUB26P%e)6nutrVJ_I-7aN{?tV0{Q~c5&%n z_FyRmZO#n`usq_&@o*Ji74d33TE*Am$;vO`YUNk0gXa&X=#5CiTX_4b@Mk!BlyV*` zPsOR{g#%7Rd>iho;&(p8r(PHj<`X^yW%0|hwXRA1qoHqTMBUR zSa3HSYaJ{k&s-kyM7%)NzZ&lz6?Ra9Coo_)qYvWI%5^v~TowF6LHPw?1Aj!kJK`qX z=E5*Pb!v0Bz{6F%O~mb{a{fU7=lM$68iLr&yIKmu2A`-a2@Tt z2cBD}vi|$As@)V-ld!cg?BHpftKwVnkTGHW%ZR^;_&YpW<^P1|D*u|Gph^|&iumt{ z%}vaZ%1^_oW5WTpinv|G`{FE>pXfxvKvmEU7b^FN_@Ian!KEty2%OK1b!OGd-Sk2{ zL0vbd;ko1X3^-wCQcyv{09#=VE>lzf1zxY*s*G!Q*nnwgJ&^kHL8c@UpAvBy-b{P@ z`u%bLe~bdT@B~}Tti*;zB6l;{gU!}1{vRx7jq@j1PAlinu$*?z^;rLM+plmb@iY?n z`4@h4>gJ%pRmj9Qlh8&Ih!3`Q@e}Y&;_em8<<>4f5id~jd#qi2A)Y%c7$EDPU%yL% zT-jX0gIG>O=ZCSJHqKS}9Xyr-8Q{CtF8)52vHEN7AP7Hl7K<^IDDn^7Q(#wC1? zWzjf)iDgYVZ^N=?oWI4gMx4LLa*UmS#Bwup-ht(2CeI&iG4m@0`u_bp4mZB^iuL_F zhp!vSm8}gQXXOd!4=l&nzmD+0vRl=c+k4Mj_;_9vekFC9biRUX{gy$(w z$8(ie;W^5m;=7g8Z#8E2GkpKQXMzD7ML~s1D8LQZ_8=-7ziJI{Q8Q2>CjT%$8Z$Mx z4!cA2U!1x+^gg$-2vz-ocvnIdjH4h!HE=iXtNc8!Q~BF)j*7Rto%3FKFwRrH40ltW zixX>A!HX1BDSv|tl-p0^EK$zEWy+W1btOIg`H~qc#99ENbT`vCN?J)6-aVa!g&p8WQ9f zIoIG_$}eC!L@xdkW)<&oEtV;E@z<~%Lg&|Uj`Euc3gj5MgpF9H-1%KBQ||memMM4s z5LYN~!LyY=#j@&M{^wZE3g^U^6v%1g3btW6t(?Eba@sk6kL9#<{t?TfbKZev4LSdc z<+OJG9m|@tPMAL_kkiH`?8b6hIX7WBjhtiCn_sHaaJcd9dsttpAH9ihXyZy)of2HC zTdREk-~Ty^0$H^~B!Ol2ymip1XI_r@6}(Zc^4D?Bjp3^QKV0-&c;5ex`{HaGlttX* z4z8>&F4w<23bLk#-<|#vt|uXGD{RN6CTy_7owzjYu(P#$0vZ>IPl$LD&R7$?G2y-y zGxtz1kOr%~Um#6`JjZ3G51Nt5}(1E)WX3gNKTE)9qGho?&E)}5haJllYxKR1P zS;oX~4hPUH;_QeI!v*B~`!7T2M?ofwuB9E&#kdRhtna`(%EJ!s!d+GTIc%^y=3nAX zw}$!OSQpTs9P-2O^5eFD3XTp6Xhk-@D;9544GhNns}3*28MlWWOvK&P0PewkRs4SI z0$P^=yyshe{{JXa;bWYm8u%P%t?lW5tF;`m-W6Pmm9NC5D*swML-|JQIy->p#0iz~ zVx+>$c%h2FhI7?*;3x64a0Y(G`O3Sj-IO0UyLtS0oX{0cq@YMOa4IgI9(FJsS1X@o zz1Hs0oJf2@#Fe;K)n7cD_1Eo=u!Dz5C{ljZ+D%z~B>r{8+i|(7|0B-4Gi?7C+*kRJ z*{nY)7#<52#gTV6Pv{@<0Gy*5$ieX$VFxGU$?6al<9y{xT&VnNf`XEnVFPbim)a@a zXHN6@z7coC6{>z$T&>(4m#YrXzzr&%IL8*aFT>4?B-|VEeb~$j2mBx&{un>)#D3{^KRR@pZ ztb4-x)wr|r)7A<1viYY-!mknkj)$lQ{)d++n+4p@mDBL52Y9BmGddh+R)zyQ3+Gg- z_y6Yx1;H8!?`8e# zf}xRw;kZFnI1AUR^SBf@V)q!n6#rYr-@)&y_@B6HRS&bt3uZ8{lJhTPNjRbrm3%f+ z9u@J$5nqZ+RsJ~qG#$G0{BHb|8qo82mGZU(1DL;qTD8Gp7lxy)$lrGD#K%Njgd0@-EAacSL;72QKftnv{LlaYmI@TODgGY+gxzV?aS;RL zv~dIKiiaq7$HmIM@mA_*Qb88!Iap3RSAS&a;QoJMSm0MF!0S|nF?ib3VFTl_JfgV< zCq+Ct;_L7Nm0yY%KP&a^{r_ePiqs;!6Zcykc2I#QE6>BF&+}uoUT`7#2-m6jr#NR# zSic_UD}Rm4#qR$9y;OLyhuM`HG_#jz=;CD&-x~2WT>7HA|IehL_qwow zyK#|n5^q&rh`YTM=0AW(DnEitct>;?Ba*XVBQ8>J#eSFkger(X$c3UdY_JcO_jJJ) zGugNmKHWBWuCdX}rIf4x36_^!&YwNV`6q9=TtPhv@>a|FD=aUaoWH^HlF9iyEbn%m8?e0Fb^aO4 zyI|*Ea0wnnfy~eWiHCv$mk`Gl>MJ6>@Do&!CZxjI)-HbpewTQA8!xkVacN)PB|G1S z4X3qpVmbwx>bzfN?Gjew4(dAaxwVUbi94$LZI%Rf@pibgiVwE7@q{^ng8fy(1Z$gM zCgB5#y9?F5)-HY@?nOLCfy~f)YZre5_fhTtVjaY}|Nllown~UU95_heU%$bJsrcE} zE)Zw( zui6`6?c#%RuFX%#?dAju3HXio_p%&;khb)4wiR9uKjbd zd|YRve+Fe=oA1tjFQj*z^Y0Ul)9FD*sCIRPO(EG4?;k3jqq`v)@iW8HnFf z4aoO!{D5@_KdHF<6ip-69qd$bso#ES^ZHrX%|CzR_y16!8|W$tc9RAMVEufM6Y)uS z8#B_GI&z)30vGW-F$BvSkLRp|Ci$0Ba6%GX!OIksD8GiMDc9lU%5Pg&*$xilFFM{Y z;$v`~sz0zw_WzY|04I=;r+kWa370&VRy4i%%x!9^WkIk3phu0@b8FU#RV$< z22Q2ETXcC-ConM0_DG+S7n%F2!?ScMbASHsCeN6R=Eq zu*J+IEHmbBa{s@If^HP-Pl-&?LTguH5tc*b{2-Pobbc7i6gyYpC$T#u?^?U~`&edN zHr7A?#sdX<)o;P!*4XqZ)~o(=6_-{1KdkrItZ42O+(3sJG%7oIINlY^kX--y+HY9k z`&gXyMmVK|ajEi2c&+k~h)<6=4{uWWBk;mHXK6pQIO4*H$KhQne*!Lj zGaT@hc!~105#Q+S_s;;PQc$NVB=8od%stnyu$JM;A*;qRrNI_6PvJFpgnkC^RPkrA zKE!LWY(f7V!xt&g$N14(`2|5tS#OW-xUzY-dHxKor;<2<<(T_dHvB%84*iegdSoP7Baj+bqR(8!wk6tly&e`cUQD3CZCzm^;85r3l^kh|q~SP!^C#ifImE14lR zqirK@k9WVRKL77WLCIU;G29mJ{_-7K0D&`A|8d;tNe>`B4=Yb!a@r2lrM{TV#HVC0+oL)-lBXX-mYARQ(p)d zX<{YoFI^SfMuI-(({Z@*+wZVG=A&3-Qol}C42$d!EFHwG?^5+;O)STHKu@e>{po^L zB&5C_&d9TP6AfldgEYGnSE%@(c)9XFco+HZN|*aM6<-X$mHRf_24~s!)+Z>4Q{Xyi zQO&g-=h=ia#P5XzItN!PkBs=jhzsy`l|Kd-d>*!!7%vsph4=q?c(L+2{2Bx5W(V{Q zuE*}RTjmqIa={1K_+Xr=>KEZScJ=SZIbl3u)>4rAQcrW7ZQv_Oz^;R~PjWw}!T=i| zgm;Dwm?E5q54Z8VahZy*#TCl`#o6_42Dtx!+pK_JA|CP2xM)uWu5x(753T`ziv`Y8 z1MdA4Q>=UrE>@n3w>r!He;EZET>;*N7c2h{uTwr~6?>#S0#_@S;WFjNaQ=_sfUA{R z|NL@TRUlr2C#VX~N4yS~tN1Gsug42j{LP3r;>|%^uK#@fpMnNP%wPE*-#(AyJHior zPcx;;=@GY%xGj$VJ6uD9aGk1u;vW0=AASQ81^rZoV%)zm9KbaZm*66m{}7hzM6mIV z%2=)g&dab|2b`Bwtz;$pD1^-|vkz+jF+QnyJS=G*WVOg}! zcjH{V9|cnXd21J6her|L$Hu?K2`O+1-%}u~+WALZY$dN$cHnU1mr!DTJ3e^n)aK0L^Q}Gg9q6T;~u2=EfaKjx{A_}PC8~iJB7O;P zQt?;usz1U3yn*YLH%9zk#G7%qU19yi#}wrK&;F|x9FzDO7TKR+LLXe9d?;Se@>rbpkBf8v zznp>@dkR>D5nmH=30|-Ar{H*#YtS>d;6mlwai-_aDt@;Rp5ZLt|2JC~;Q0~XgV(zX z#P7#hwLMKPb1vukdOR>C?BGpYqWn(8A1Jf_J@XL-OH_qVBmNwl)UboEBK`*VR`DP3 zX5}4tm-26+<^JQDzrq6Ff8)MsVTZA2Ij_@0x4=2dZ6a3 z;!zP_h`Y53^Dm8f3?5EA=$`?Mw*|8QG6PrO(W-%~@MPudaFudt#5YG=j_Xzabex;H z=l;(xAfjLzt2)!~K4#Y766MeF`pj^TzKVEz#6RF&Dt|}Bzv9mA6Jdk9D5z>5`ft2m zIrdz0w}`kE-m3E3;qA&y-yb zd=gIRgi|QktSX#_O;*@o9?nu8fwwA;!VSt7M_d^3xaU}ZojZmdOdvsf5|%4nu<@o8 zkHmZ4lv=y^B7C*Ve-N)xUrm1)%bIfeRnM{hWzo5U$4JmmJS%ay@!RaBfsb8&idi^~ z>$%(uQ6C$qw|VlK37h*ZKx8aK&AGx?(`7#N~y>+X)I}#Qytu3ffliyTCXE z*|x%dv-v>El=ig^u2KV%N2<3Y1KysW3 zpZ|S9^7;QV3hLE}Cq{fF&h6v|$oGOrd_68x@u|43OPHU)sa-=)Q)d11!{@3%T!DM5 z3iEK0^1XPi@}h{BM7$JlSNY3v#{T|*l=nGg09$dTrW2rpC>KE?G1h8@)7jP9Yoj`;hCf5hEX{x7(n*zcbX z|Dd2uCG3vad%k%*70V(DHdZy(zc;KE-lpRF;7#gEn2C225Bg^jcA%h1RoD-EuY?_R z!70k!aQgo%?M&dKD6&7^lS~It76Swb5M>eqi4elvhlV2>PC*fZ3v853W)e9fphi4E zJ1Am6R6MY8MMXu$6<1W;-~pmUWfcVlITR6GS5a|I5EWfNoB!{1SEXNiCj|c6D)_B; z)T^pj)ipicJ&b#S+cM4qw`1G~d^+P?aQio!&i_eDe-w0J3i;qO7<<5}jQ!w_j6>i~ zjL!k{X*>vQ9Sw~`!BzV-*}`O{9&0s4oCGaen|+J1o`bOx8$1_GEs*>&7%gbh{~b(S zo-XtUFTurWCSL%i21)xma0iVQw86Q6hCl`|3QR4O2AAPnKrNK~?Vb4Xa_HmSV+5FY z7v7i$x#U@38baxB9hiDh+W!dFDCyjAKxeD-Sr^etRtlc0~8jr3VXhSwHhohE)N5*XY$$LI%fX>_#l&S z0Ut&HLFys&!@t0;tyVzYUq$|}f9^+c@4%P$O z7bqC#&r-fbmL#E*3O3@SlFxEb2rgy@mEbryTlAO?u3_>w!ESJ-kbe(e!Q| z%K0d$w+fV5U<$}Q@YAd|zRt$;z|~B@8tnSJHO9|?^MaPYbzr4Qj`RPgC`fH8!0mOf zvWE)_Ln%2Y6At>iK= zWv%3L@G8dBz%*;5d?uKto#a_yns$<}1XGUS(C}XpE}5B0CKav)Q<6!(0Zd6I`9?4$ zmE>wL%>v1{fGNu*F9K82NnQ-5oD=8YBxNZIC@G}EU0})y$@hRMsU$B4^OMU8vTr)@ z6OCZLM|_ycX=QyCY~+|`7~xmXWr5%=;3AfUTfxT}zYlI3mI2}GcN_1q@h9Lg)Bjws zW(Mt0zCb}GQ}`NuJYrRF1e|w{#SJ$8*~Y(uE1CX(Z0y*K4b3@C=YO0kQLus;oDSa0 zIMv2oY@7~GJJ$;EOz`Fci?hJ#gDlPgR~q@J(2=6_LxFWPG!6jsF}wsH%_yLuN#@z| zB`|gAF`Q57?0L`K&DjlmdC-`T1@i#L6KgD@i73crJOz9hNoSm|F-sPL_cQro@Dav$ zg7XGjExZ>z0rqk!-UzM&%PTBjgSCYy=%tt|S;sf9iDU}rg7-2m2d`lj%&_rn8(&5C zO#fQ&!a^&+`EQ{AkFbITP~g1C#*4wO^DGB~mzL<7G8S2KCq zn;N=wnB}1Ro6Y$w8)t%-!9fS%a11zYcov8bhjOuvi^1!lFF)LBU^jZyJd%`~ser~v z7TgM^F_K&ZrXiAiJD7$@@}1!IjPC~1kV*M{V9FuMI`|vL+MiKygcUpl{+;nEa2{G9 z9Xt*$VEiO_5aXx8gBh;{7czbhTx7APynq54Gg-k)U>Y;Y8^APXl3xYW5J=txei+;d z1#~+8MzEA00n-pj{sC+)-CBxr6b07N(D)OW&-+K|5)6{GUR>ij0H#@Bye|mze!x8r zqf3+Egg!US0n?CV34Q@gJ>(Gl6PS9)*rwzCyGr<8Y`d7kJTP^c+{bSMQfdCOv-bXhzcn;=*@7-%S=__MXM*Q5c@}uw z2x=c44kZV?jB%cgJvR1(SDX5ne{c{%!G7joFu0!a`QXi?tO`ehcQGDoTqosEZ6RF;KO6BfG65`ij6M?A7}by;MEs4eg4O{U?@o2W>s(x z*vWV!xa~z&g>TyU9UH$3PG|bt!P$&=f&CY;^Zz~+3}p%jz~dPI1H6#&VeksZ--EX? zK1w{!3iuZr|8B5mDKw&B1E!66Bq>R6A!!(^;3MFkM#dy5ZoyLD2c|KW90a!q%X39k zu$0Ha>$D}7!R08}Rb%lCa1S^z<~?#^xnSvF1(=dZ@`K<4@aZU^mGEuBQvP@F2*~>i z`7y9Y1ybP`6s%pN?{=%;5h&cu z_%ZP69hUqFuyyiCQPzO1qoMH`Fh6(n#Ga6HNG`?B`yIx#bzw|t&p2K~0R=D)Ug+d; zAD9Bjf&%ewFa>b7;B+0YPDhI-3H>QxYT*vSE5X#luY~>qFeP=SkpGnhOiRD^9twVE z(`1K@cY^aSmOX$SFgR_Z#h-zXd}ys3ZQg-D#$Isyk1YA6;0%j3r3M9gR)O*&cq^-5 zgN--Zcr*BYRM?AJh@AOWFc3$Q@;#UWG>;^u9!vq6hlY2*qJScl3O|D>Ldm~^DL~1; zgLw`#f~}*WF==b_98kgXpf1k>x4lI8qwoK7cmcQ{I9)1$2aTPjZsSVuHldIF$B)mU;NTRig1O*~KUq8vT)=wZCU6Pk1>j1?3&9kid0;~V zew^_V(l>>4{!3BrK!J5MG%f=-n?|={%Y}%mkkvG8UIJ49a#|HG!fhMi9&kdl=3OvV zXe`y>UMsM}0-q)1_cqms`e{top88Nk=s{FSs5Ul)NC$>%nVTfH&EA0r(h`FCx}h!D1AY?y<)BMdDJ~0$RtL z^Q+)FO#dtJN~ZsvjsFEM*=OC19(fP#pT-JqL%~`&l$+2Oz&pS$bOH^@XW+w8E1)lI z{I!k01-CD=^nbAN(f5#l=}h4lD2!wLJGdSJpmrmGoNd@N#w~|=;OiKBY#g+41YCp$ z%Lc}`A^&$Rk`9xU%b_p^70M5jcMCSN0HFIehN1V09OJ0Y(YEaloQD4;Qy z1&hFS%;0&!QobHcIU%_gYz&c6kfgjq@&_#WMw0KfHl2qB3wurZ4h3B?CjC)DUDovj zlVt_n!G(|`1q^wSU@0E~rZJT~8cbO(c`TTcT=F<@r6A;giZTHO*3r;-37D?~lbM{> zfrZT+q$syBIjtj0Z1#6BIoWUE_IUn9d6g-UgH1LEZ!kGIIKmyk{s$%}`=d7dpO~EN zUE8f5K>nvFy-{Et4UK)lya&!^a&k}%KFp@wWE+=&k284`JaU>G0^Dl`E|_jGoqrt4 zOcYpSlA_E4TL+e2Fb`-i&gT?BvC}*mRWW@E@DZE8$C#XY=!qtO#`!NU9o?5`2_X8j1@I;KDl9=ADolF7-z)53w-sAOd=lau`(oBbzDPWGRf z_M(0SaF8jGgVR53-h~~&)`7?A!8|9@n4Ii~*zC_^atdIWVXw)oOvYnYmV0t=wavj? zCMO5i8xAb{`AkmsPucAM!sKNCEZJ*KD^s$vjwz6XPi+nkFgZCmL=Kq!mrPFfXMEJW z2RnhS1DE~48h4P+6v)B(U@=c&hhMy~@daR>1eDOze z|A_*sP_sF_+2-(8o5LC=C;Jy|_J3n?3g~5<{c9h|{1X9uZFBIg&B6CJ2lY%&0rcG2 zyhqLgTSr4 zv#WWFP6Jy9mRc}xP%4uf@Bcs7=3p>Wpa2SO4vLtZ0+?;HzlzDp{u-P8bxiKmpzyfO z!IMmZ96W7vu$IXwfIT+*PnewSKeO2%WOC#B|LGq$@4^mX>%dYA=3SV^op--w5CzHV0qX9DHMQaD>SzfNp!6uk{%=?gi#+e->EQk5C#K`=Ee#aa}vSmH{V^ zY)EPC&xKqbRN(}$bB5dj;dM$j{u4Nz$xFdYXIlE@dr`l8mQ^qV3OvFqz}C^wI0wuF zJo^DW?~e-d#OHvknLY*hu+872Oim46y%+804xfU;$P$+_6t#B3>31!-dXvkzJDzww z_{*IZ*MaLlaw*4z{&ukYLznTj9qI1{kAyr|$Pa>@VA=tZ{96qLlVFf03XXwuKeiOq zeRTEOWn8f!gAU+1%wae13dViG^PxXS_zQq5!Ks3WgNN>NDTf7XB`DYo2X0YN0X|Y- zzR`#(Tuu%U&@>_64BiDsj~gxc9=sR4T5yj~n(L1NudQ(@tAzXw@WIzzN|ni)vipFd z>~onvHrr8Am0!Tcn_b55f>QvCKSv9{$E#M8%nCPx*H^iWZ#+mo`yhs7u1nb^D%cI4 z^oq;)X*QBSdC0tyI$y~5f$7yO=8)j|zdc{#n$KdFvR^37`x-g%iPhyF9LA?vyy;}K zkazk9pMK|AUEJ(!Duku>m`Ti-#;Qp>Z~3ZatzZ70k;NdA?s^|gMWaJm%5adg5AI38<43kWt#|SHke*k zlP%;=f$7Sq(IWWU3treS6Hh&w4T}9vSI1q(T`*MNo8Z0XkZX9u4aVH*P)c8RDX7=z zqL16+2Z!HxDaFFUWGqBu-m)C%V7k;gQs{33*B^B$F42Sar_&u0naT+#620R2l zw%w(y6Z(D5a2O99;5vn&za3pckMG5WJf$P8RgOC`19>UN=7 z3|I~ncf#fP_pBDK2h+P?WQ)@}<9nh|R@1DQ3#OOZNcov*roAQ$G!$?Lhrsk0?lRFM zsa?>bcIa}!mw@T+ZBwF|&IGmEHOcVZgf?s>nrK}hJDnn=>R#MrZXTci1=R+3MqhRZI z*2&_*Nb_m;%wRZ#9FxH4u?a))y#FQ_2zSe32&RA)OkK&9;DXHF#<_xK$#dWxU{kIt z>xVcrWhhe^Iuwf$zQGtHS~MR_PqF5~g2wn$Fg=n%IgF8CENJ$NM7fgiyKGtJ)tr3OsUMmdxfSi4=K1slNh^xGWap!;ZK^`|ant>7)- zIM#MbQgSf+0(>NAC#wZk24@;CtuoI4i&2m^1WT=Om~t)VJ-ABnQgAu~@Jso1NW#KQ zr9`yoJaFClRsb`=^yBp|q5m#;4SJNOEltB~ug5(jBQlkxVB`Eha-PHZ@wjy&X%2wt zw_Vr4!sycZ;PF%hl-7gkr`P3%WebLpez<(8=;BZ{0-kIId>fd4 zH=J(ar2001>86)$xc*`k97O@$EG8Fq_sekpM{89(sN|1{&YC?dzg5iu zG~KR~R`vz%YF)lcj1?56K1 za60wvg-%u9oZ~#(;nvsXIddEy^DnRdXpXb1KB(B)M$hf<{EOzTC<}Qj-0on&@9{_c zp->=FQ5LNTxx>M-Kv~S6AE3~UF>PHnpk&AC-;*{7>KErZy;_rgyeu4ug@O@pAQTJ7 zywOmo!sjlJS46|%@_;)(q-0-5|K^VwT|CO;o=Qn!<%GAQ6?3CkMN_z{mY^yl;ZDVO z^Mr0a7M4I7CQR!F{!?sh^BHg=|Cbw`>+zmq1vJ@DrH4X#!&%6^&&!-`vQ89^5lv9{ z^mXRy)j3X=W(~VBcv!If;b<@r^TY$uSRh*A_C})KfWIsd3;08Uc)o|m;^b6)%`-Nk z>kiF)`zd7yIK#+8UCVR!(;{X@8uf+ak+?S=cgM@{m)nmlj`=;_xIZ5CmY0V-2#r$q zJ;6Tp|t3Le&hkEO|t$Oja?8UWQjnqDqq_%Z*PE^UEzG{|!I9ctM zP-=uQ%&B&3Jp_NtAq+}YD-ya-Rn-Lrtv4>zvg`L%b^1wo2)69u!;We-1D`Tdl~*#mam+iCvp*OujY47khXe9r|Pf$xV?J2BXPqfC98i*EIHIcot#)w znBgq#ae}#Yaol;?iR8vgk|@|KQ`GMI2dQfRR5!M>6>(oI6!k@YfrwXc*HN938Y?Rg zhRcF(e>7a~@y8h^@<6^3YFswWT*20X!Fpv)VKm6v(+ zGdii;5;uy5spkpizp;k&6zgMx-~*yP$Ek|hx8t9q+e z-?gY9o7a+pen+<2Hj#f+evLjmLp@X1($y}yGfTaaaG-uLLw!vD=cUfDUO&LuQKnoX z|7J2LlJI0sBzc*6J-9z2oYNw&&E8qaAE&*dX(#Z|O6p;`>q>j-|L%3&Rjyv3e`3tXWHm#-voBh3Y>L`Z|Dh6p zICIplX`YZ5`}d$H;`d^>{UJ}-=g~h{spjd`H)9^p%2CH8)_Ffi%}*$)?U1WJ;Lz&| z)vo%@z0_y*nf>s8Bl@Y?dRa0$bGnPR!2g{hI-PQg69{Baw$cxBf1kkfx=eMH9vh48 zXWM@25Pd;E)ungLRHxFIcGhdpR)_2RGE#=s2K%eJLsus`efq9`YNmef0JW#t4>Jd- zskPk)sOLFqYw}e`mfklfrIWs~i<)1%Xq@`zXl<_-)B%n@bGkZ|({K&&-c)>fg}?Ea fG6MhMDqGVL*ROn0%~3a|JMpV+551^9c+>v@CKU~O diff --git a/artifacts/test_program_methods/program_owner_changer.bin b/artifacts/test_program_methods/program_owner_changer.bin index 4a47211b1cdc61ddd427f353b58444dccbbb749f..75425bc58345c6a4553e1d6039bb73adf6d04c4f 100644 GIT binary patch delta 4842 zcmbtWdvH|M89(>z*-cQAY_fSuBAbwx5Y}_<`zkt%5`_WMP-$8nGMW3NrO~t`SfG|& z3!?s0GMwogrc+1C(3wu1w$x1BptfvKQR;-o8L-n*Y*J$74`x88V{4}^J$Dn^7_yIy zcXoF7yXW`)&i6iN_-xJa*_snKO6j*FT}1$Z50YSPWFk^3z~nTYth^6`KhWl?2Vi_P z?XR+6{2ZOA5@B);Mb$Bwj!?P!*`lPc7C%E@uRaYy1%0OG7>qwbJ8D~DJV>|J9)`(l z^h#|ECa==kx|O$qomx*5h=k5eM1o;JgG&HQ3Y;NH=)X!I5}u>oWgCjV;d7=%dbF(W z?wS8M5)?REK#>qYEb}gTr+wg7b^ni-fE7`pl&=>@LP9AGg*ju!m4ozeWjlModjlZe z7P%Dwe?vR@Ld=KKr})O#Z`|M;w+A|fVjBiSG`O~yE+M6nP#Q%1^~^T$rbw`nZ<_`g zoyeo@l)bf=}qx*4~*2fFIEAwpIxKM0dCCfZ#eEK6D2y zX|ICmc6xrrKA5~jw>EddcpE+5{0Ic^A8xq~rkB(Dmb>j0*X##iJGg&UisywMJTn~$#f8XILGEq{)QkxJ+L8V1 z+n-+FE~M7C!*!KtX?qkfp$o2M4Vz&Zn_L5T3n=yQJ@C{aw|;XI;EnJ}(ja+u-tncFT(mC?;TuxU;Iof{&aE!}Gef`vT#^E(sF&zW|LIGU8ID>lv zv3(P8FWl6^{y70}U*_96^9bNF$8PFs0+ksin3CRs2C6v18GVLx=lN<&6pTW)?*i-* z?qe4&K)c*0sOJhk0l@+g;U zXXTb@0OG5nfV26usn_0xjh|Hf=Z^rif4>o=`P&Na>As8XtGfn3#RP zpKFi)bjBzj*ZDpG$KPoL9jWn&0J|kD>x$+|u4>w{W*VZ-hAsx=gerN&Q#_FvimEu4 z)Crn*`=8h*^Ra=)VxBEpiYbXUF;$FBV#$Uqsk)|Wvh6vF91|A<#y5czIjEI_jZh0l z>hq9^?4B9(pxKe~O>X7ziV)EENS8D?C)TO}Yu;*ae)v<0kl8sGF*l-<+hg}CtSW&SmiiWAV z4*T%Ez&dtMb+C+GUydGUU;cBTDIv;^;kuHksjg(Zs*)**g6m;%!QkcN%!~7e?13ge z`X+^}c(!&jP~DR+UNLQ!wQ%AX;VEiHRm<~q2b-D{DTs^QK+1bBE5le=wV^6a+>;G%rto%h331iWbC8FU>(`%-il3zr< z!kWDGV8r_SAAdAPL`^4#q+(gpC2SBKOClQ|K|}eAkC5yXAae-iHG<%*6zjx7Ii#!{ zB16AIv|Mr($+1=b?J1IFI&)+A#!IL=tec7{tFqzRhJiKFW>dEWE7^^g(6+E+Dx#!_ zvg9}}Co$O9Q)rN#KZn}<{B*O7zUQij%Oj~_qNuuM`1*WA{1)k9MKSoqb{*4IRLjsE zHgyH*rLNA;V#W1DY-z5=_Ku?OhWSY12Zt=0x+=M{rLm#Nu}z z%kp?;Jk2oJ$yd;tFh5s`Lo6)wx$BCC#kRbPM)OyDt{Un5H9D3*Y)V#_3oX>_K@$Nx zT@tMDD=x}@a|%@?3Tq$jbK4{>Y}ES994N3FWHGxLY^;QLg725eZ%CTSE8JBamG_#} znO)1jXc0wYjVI6+wk?f@*v4m23H$3Q)Wj})3mGft-G*{dvDIU!b0v|nD`V619D`r2 za&66?+=d=v*Tzs$WTDCU&EKQ#3oiUcAdFR&#ZQRFx_!{b2(7Lt%;1i_bbtLC+g&dt*pv^fd z1{7HPa*pyTtb5dj84~^xSfC#ymm`H)LFPAcV$Mlipczv3W3*6Dr2m}?iJLD31)3p$ beluhetIK{b!S@I2pBCOkDdElFp@#ng!`~me delta 4779 zcmbtWeQ;D)6~FJkyGe^7+07u#(gFhm6M#fKUl!RhsQ#w{!Q`1pu$BIpcsCCAf(vDNnvEtoLDluet zU&c2(vvc14o!>pbbIv{Y4P06_aB10@8|CzB)plVcRjaq$l?LF?Y4C)&uDwibIa=1= zGFBE135bS-@@NS_Y-as9e+T$Gbn{*2aXMPP3MQxNtJV8qvW;$y)s})RTjm(;iPf&i zd8X6R&>HTQ0rYFP1NLBcJ((IFioGMmGTofu6!0IU!Y~tQ!uU4GtnlPeulmpJpnV{rae^&n0b<(tZG@FY|(es zgJ{XmC!(P+7tBLW3t35j8QxucNu1FKK1W;Yx=O=2Ed#>?bssLF`x?Ip!Qbg$8#`ep zN!ywpSd|>=-yl>w>F>Xf=k9i{v?8mNeLCl5(jPb78A}tfaSU7?{O;S)&=_Dd$?K+Q z?J1a$cD?cH@=FK+2nF!(-_7t&huDz`_z3K2V*i|gt5$67tOr%Oogi3J0zjO{ zJ@W`7%FED1m7{Qm;icaI(9;wLg91Bp8SWCM+2za7iDZSYPkeyrqux&9?t#}Tdm%Gy$Mg&H4j_FbTrq;rppc0 zv{c{Z4xVN^33)MK=@xLR05!&eqcCqFF2GCX(54Ej)8;@6BaOgF6?8w)sq`Ii<^2aR zYrG=1hFwd;icf5dxQ1(ZI4L7F8fNbw%73)+EPJRibE~ zWIIG5Y@ik;`L-^`s_OfyXZnhwvA6ypZen-GLKW=VYIKl&;&rh;r4ZlHO-03o2dG(o zE{ee2p)RH{m^YIY**2S)@NCR6DP35+NVO*tBaf!HZ>_W z#pWNw4bGk~Bruz-KsEQ-L~|Vl8;Y~<_&Sf$ckz4trwTd zicCyCr-^2Jgx&K)^kT%aY}b?wPbP|?5XbId6EC6lEdC?pMHESLJWrA(#dkFeD>v7+ zv&d5@8rEGtFErP~x??HClt$F2P?ykFv>(hwPtU>6Coq;ZooI?mFfoX(64@}>_%J$9 zy!kNBPXTflQqdr=l$TRW#`bb zFtHqo$e!iNGST^@VW-X^8rHC^o0^Obf?cdB4vUPV8rJnRN))e}T%hm)GcFr>Gak5V zN`dBKo#)Z%3YRFhX_>NYtA>PScJ4fC3!7M0HQ!bE+_f#$FxZZtqS4~bUZ_PnoOX_c8xaz`kyij{FV*_tY1|AT4+m7Eqpx znhpL8Rk9NqWUyafK)+z0T#e-Q^FMeBC}A7MP)CbtdL}kCeu6NOU8fNK=x+2e_U0HW zjV?6)9{MfXv*5xvSED4`et&2wn|K!0EC?A}8mdou*fWS@8WQm^=Ci&)C;^Lr3#2gn ziK=Pc4O@3M?Eh?^BXzTr7tyW-qies;=S1CeNG;y*14@)hoRy`ZT^oBX=7;R Oqr&rOM0h@QyzW19fjx=< diff --git a/artifacts/test_program_methods/simple_balance_transfer.bin b/artifacts/test_program_methods/simple_balance_transfer.bin index 647f86fa3f2a4a19e8e78139772f6b19d6ca674f..6c98cdf242c861713b4990bb2343478a1c0617b3 100644 GIT binary patch delta 107059 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 b<~6^PXJ0laD9g5)YZ<0MG5^}UZo&Tp=ezjz delta 14288 zcmbuF349gR^~cY=nMZ=zUKTKrAoCuP1`Ofti>8`bP?oSnBc&}!-U>({0U}002PGod zV1Psi6eKFPD4_ITbf{ttmR9~k3#e^f0TH(f5*1|;q`!IZPG+#AiJvNdK7Q{#_uO;N zJ@?#u=du3F+}1C1m*;b*R`eUdmHw{mft2Q{Y4c5`W1EkpjZ9ij^vOb6)$C56a9OEu z(GV^tyl`_$wwX(AHgoCOJ*bBq7inAGydm9@7ytj#W&Gu3^x>L~UuB!iNVcdd+7>pS zNPpTyf#%kXfu@Dt=3N;#nA$#X-d9}E+@5l!sjZ;7C^cki`*ZX1)Pbh9q~>j@x0u@U z@h!V3=^Ww#0vwM_s+4q{M`Q9FM=^LCX z68`-W%i&~Go7lXoPsl{qEh_4JUr}F9De7yQc&)I(B9gpfx~WV)G|`kHS4B;^a{DAx zKGz_pO*UPh(un@Kb#rbF*NJjPmXNK?nQWT1(iBOT4<9!@bCuei_=lsva72w!8)c$_ zBNMfQRrOl`*WgbhHp)r#E4$lGvy-JieNN0k<2N@4?Z6pNaG- z)B7mqNv*LF+=~Y`BZZ@61E;5Q6d5j3A^O#oyc66AhPf)6=%lii=W96WbxgE%BphIY zs4_$1dJJR}eSnD;j1g%KQ}ikv${h&ahZmR1es=;$v+Dq!Ptui&We zR~;Lk)`RQk+T#0H-98_K-vnz}GN_27%1LmFIXMY@0{vQ6tphKw)8!9?TXmM`@*x}@ zF({k{UZ@MuMsVuQB9-(=q|srOZ?VN4Qw{hY~DN1sZnE5NSLUxDT9Lt@BIZX<#;h zz5$Pzsq>J5*cY=z^0TFx0j{di_tjJ2CAE5KPWuU#3M|IwL#dsIhAjqxL*Q*-J2U7y z?9kruXe3w-^&YUX-#O^Q2_6C)^$~K<7~!Gd4g=)XIsDJKN96Z&_`SiKtcVR}LJq`d zlEGhq;aQyD1`jjTo;({z`>?gtQ%ALIGB|&ZzN4Q6`@xzg$CR|*e1=(~JcJbObr`3v z$q4YaIx(K@DmR078TbJBEwHxxuE<9+8@L|a4px&<9sdegoF~#I#zp-&D!Nsq@&rpX z4-NHb*uVr1f%EJ2S~lP^B%Og{;5|@S%jBN}m)wT!%npk={ZULHZ$ZBri08nT8#OtcuD z3klD&1GsG5BT_Z%f4>BgxeGOv@ufe-E`(u&*gO-#?}0VLSA%o!(D@zk9=%_pRaYb1 z=d=41Jbee83)U3mUxTHYq4Uk)o%f1ViV4-Fc^CX!OrS2M8mWGzaMUp26!2_J_zTwG z3ceowRdMD`bXdN#KmW2+P>e#m5_;JR6qKQ$HtDx9VW znFcP0A6h|u3S46F>tEpabT-jS;D7*6W!UTn|=P zUJXbTJl-I`58RG^)iAX`fV#5XF#Z~J?$^rN0{*<2 z`=_#YFuyL@VZI(|`Z(r}ry)mofR8?=*V0$PwRh@^H%gxA;-AgzIRaA}nj4iNZvI(L z@?Qtj*NZfat-*`n9I$5k^pPBG!ZBG^tv+# z+yKsD20Q_N3wpF*MYU8V!yn36s{@flzyZ6Ca&W8 z2^^i>jk_-k=riEDSK&Xi{{wKtF5UlSh}$Y~gl(d8VEcW#Kc6e-%6ZA;DEbBJ_W_ai zu(-8?39Pws6kK_~K5mGzc^p43Nh+U?czu8?B^&qmYTR9qigc85ubHT3jrzEsgWm*e zRdY4C#lY`^>yL@_CL5nO3ulXA{A6$ecmVpbK3TL54b#w|E!YS0vY+$ED;lTbgiIe0 zKesrOnO+A+j_bwdJouDBZ`m{y2XJ0OFD(MMVLYOMdCc^-^4E#{vw~#08T;=`#Fxc? z9C+K;`W1T(xb=koruYo}={NfM>7Ih~beW##^T4^^>is*wqM@I!g8zEIL}SsAY!Fxu zu7|)T7O>$#6d&|!0bT+=1=gzjZg9a#IKUF-9N2$K=b<4~(bGBy!BuBOS|8UhK{*

    `UMk5Un%Eq<}>)R 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 RHuD0G8?5wv!TiWw{{|%sREGcn diff --git a/artifacts/test_program_methods/two_pda_claimer.bin b/artifacts/test_program_methods/two_pda_claimer.bin index 9d5001f991e05819981a218219cb27cdd8046109..8833afb072a9bbeb6f704be2df838b177a3dd257 100644 GIT binary patch delta 13143 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 Wrm264Bu+OMbKH-S7mCe)p80>dq8l&( delta 13139 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 z #2e5L-Tuzsp8xO*3%>F;ZVe{f4C@zuIKAOWI^la0Jm^Mq^$d`KwBOG~3*gC)i zEt;`r!WUrBYhN75*D;DQiIw(o6PnG&x8WVdIqI4jd=YM(bD{Qi*l+HC2VODPYQx?< zb_z3IUh|s<>?mlZL(lh6C`sfYCC#zp zu*;NRfe&Vo@chxrD3K=d2DNNOpjlPQW&xu)?@?PwufbNR^XW7r7i`u|YM-O!vH2@v y)`G}p>hfHvW{w_#SEqNK^JILs>+~Om_oN$`@xhjlS#4|2xudXg?r8p_W&a0A0rH*z diff --git a/artifacts/test_program_methods/validity_window_chain_caller.bin b/artifacts/test_program_methods/validity_window_chain_caller.bin index 326ed7a177ca6f9fd01149665bed668a620e1029..42ef3906126962340a359c5e7d03b3ba071a2c2d 100644 GIT binary patch delta 17158 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 delta 17117 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 diff --git a/nssa/src/state.rs b/nssa/src/state.rs index e9f2058f..eea5fa85 100644 --- a/nssa/src/state.rs +++ b/nssa/src/state.rs @@ -3646,6 +3646,7 @@ pub mod tests { ); // Assert - should fail because the malicious program tries to manipulate is_authorized + println!("result: {:?}", result); assert!(matches!(result, Err(NssaError::CircuitProvingError(_)))); } diff --git a/program_methods/guest/src/bin/privacy_preserving_circuit/execution_state.rs b/program_methods/guest/src/bin/privacy_preserving_circuit/execution_state.rs index aad1bc1c..c65b1d29 100644 --- a/program_methods/guest/src/bin/privacy_preserving_circuit/execution_state.rs +++ b/program_methods/guest/src/bin/privacy_preserving_circuit/execution_state.rs @@ -1,5 +1,5 @@ use std::{ - collections::{HashMap, VecDeque, hash_map::Entry}, + collections::{HashMap, HashSet, VecDeque, hash_map::Entry}, convert::Infallible, }; @@ -49,6 +49,7 @@ pub struct ExecutionState { /// caller-seeds authorization paths to verify /// `AccountId::for_private_pda(program_id, seed, npk, identifier) == pre_state.account_id`. private_pda_npk_by_position: HashMap, + authorized_accounts: HashSet, } impl ExecutionState { @@ -107,6 +108,7 @@ impl ExecutionState { private_pda_bound_positions: HashMap::new(), pda_family_binding: HashMap::new(), private_pda_npk_by_position, + authorized_accounts: HashSet::new(), }; let Some(first_output) = program_outputs.first() else { @@ -246,10 +248,10 @@ impl ExecutionState { program_id: ProgramId, caller_program_id: Option, caller_pda_seeds: &[PdaSeed], - pre_states: Vec, - post_states: Vec, + output_pre_states: Vec, + output_post_states: Vec, ) { - for (pre, mut post) in pre_states.into_iter().zip(post_states) { + for (pre, mut post) in output_pre_states.into_iter().zip(output_post_states) { let pre_account_id = pre.account_id; let pre_is_authorized = pre.is_authorized; let post_states_entry = self.post_states.entry(pre.account_id); @@ -288,6 +290,7 @@ impl ExecutionState { &mut self.pda_family_binding, &mut self.private_pda_bound_positions, &self.private_pda_npk_by_position, + &mut self.authorized_accounts, pre_account_id, pre_state_position, caller_program_id, @@ -491,6 +494,7 @@ fn resolve_authorization_and_record_bindings( pda_family_binding: &mut HashMap<(ProgramId, PdaSeed), AccountId>, private_pda_bound_positions: &mut HashMap, private_pda_npk_by_position: &HashMap, + authorized_accounts: &mut HashSet, pre_account_id: AccountId, pre_state_position: usize, caller_program_id: Option, @@ -525,5 +529,13 @@ fn resolve_authorization_and_record_bindings( } } - previous_is_authorized || matched_caller_seed.is_some() + if authorized_accounts.contains(&pre_account_id) { + return true; + } + + let authorized = previous_is_authorized || matched_caller_seed.is_some(); + if authorized { + authorized_accounts.insert(pre_account_id); + } + authorized } diff --git a/sequencer/core/src/lib.rs b/sequencer/core/src/lib.rs index 054c8731..cb0802b4 100644 --- a/sequencer/core/src/lib.rs +++ b/sequencer/core/src/lib.rs @@ -1084,7 +1084,7 @@ mod tests { let vault_program_id = nssa::program::Program::vault().id(); let attacker_vault_id = vault_core::compute_vault_account_id(vault_program_id, attacker_id); - let amount: u128 = 1_000; + let amount: u128 = 1; let faucet_chain_caller_id = nssa::program::Program::new(test_program_methods::FAUCET_CHAIN_CALLER_ELF.to_vec()) @@ -1109,21 +1109,9 @@ mod tests { mempool_handle.push(attack_tx).await.unwrap(); sequencer.produce_new_block().await.unwrap(); - let block = sequencer - .store - .get_block_at_id(sequencer.chain_height) - .unwrap() - .unwrap(); let faucet_balance_after = sequencer.state.get_account_by_id(faucet_account_id).balance; let vault_balance_after = sequencer.state.get_account_by_id(attacker_vault_id).balance; - // The attack tx must be dropped; only the mandatory clock invocation remains. - assert_eq!( - block.body.transactions, - vec![NSSATransaction::Public(clock_invocation( - block.header.timestamp - ))] - ); assert_eq!(faucet_balance_after, faucet_balance_before); assert_eq!(vault_balance_after, vault_balance_before); } From 58226fd0f7f7da204c66affdd72a14a4dc6388e3 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Fri, 15 May 2026 18:54:20 -0300 Subject: [PATCH 13/33] fix test --- .../faucet_chain_caller.bin | Bin 401332 -> 401352 bytes nssa/src/state.rs | 1 - sequencer/core/src/lib.rs | 37 +++++++++++++----- .../guest/src/bin/faucet_chain_caller.rs | 4 +- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/artifacts/test_program_methods/faucet_chain_caller.bin b/artifacts/test_program_methods/faucet_chain_caller.bin index d9686f9cdf26777520df81491d7341de3fe3c6b5..6311ad4bbe99bec8dcd6c4bc5966fb69e29957b1 100644 GIT binary patch delta 10967 zcmai)e|(Ph`oORIxu1v8hOufG-S=b3kB!YX8)srtAvD@4Wf-k<)@h1Tp>a>GlR^kR zoCtk=Q?JPC$h~t?oOAfTgKR>SP`dpvu zx;~%J{n)fMap%^=g-M#Rs6!{MWOm-udD=U9zE$JmJBvtj{**l!ls^2OWS<`Adt=dr zzkem-k2R#!C*t#Ia^RrINdHB6Z#zTE{1IOD zwMhPThU`(}^X!W?zW#x{b4NvtPKFH7BIBO>Mr8d1K}p0G&F7P}Z;=CME1m*xhg&Ir zJ2dmW?>g()aglkR<{Q2fNxs35B!)TW&xcDq+~a$Z3b;h6T?ZT84M|k&J0Wtiiy_O@ z{ONE-S3{~4?|^f=8G`kW{9e-Rq)26{Ygfk_6k<@20nR!W!dKBhNb$ey;XnDTfc3%w zk(9~q`aXk`;OP1i*@xFWJnN81O&>$1MHI`EM?}iu$%@~HtMc51H^;)gaE$7I4PN2) zTe1klr`>Ewnp$~WHHP;!q)=^q>M4;eQ-abR0nS1u!|UOwfq#YvKkRbx4=C{TuY*rM zLns%-Z^#{vB^r!Q|ED{hil=4fv)4m|0I$IcTwX%f=7G$e^Vr{^{1LxevW|vW>}rWX$C2N`?cu8wcmG)=$J0Lv9u1FG{TtzXiG)Fl&%k%#=$jO0 z{UY)$JVEg^_yIPiX_(vi{Jo*Ao+A?s3C(Df2V8m2II;6@WTH2PPN`sw|XF^{1H#!z?0$VKE4gNn(A_i zrb(-OLyjx4I%3nPN`57FY7K zNG;gGdY0V5M5X8!6t%j?kQFF$YDEfLwjMsNcw{q8wiFmLPmMp_T$7?l-H6V(N|QNo zv_w4$PlMG$M~O{?|FQZ8xd1O2 zB5cWC8g|m~ni_Cpk|y(}ySq3WUhCoQaMD9=VQtfa@o=)rl09(340lu8bkt-j9D{r( zz3+r8r*J}q-JGGxIvR341CA4aTTpnXn$W$gCdu?CDt<6DytV%EgbOqmK2CjBcIS1| zQ~>)intd(xz7cTFmYf~Z|X-~q@>Qt}qrGu!B^d{(z>HQ7Ji6HT26 zi`lN;WpF9%$ZWdvGfpU^ODraPfI8+2}l zA^VhoTsYP;BnMYJ9+&~w)eB&^;gnhK{Ea=3hrv~9e*d0?=o4m?ruE-51#4Hd67B0XS=7^HR+lZJn8Cu1$Mq(S=DD@%AY93UoIG{< z&1~es1&WK|#mFxTGpE!@+*=phDI77I`Ldf?>)`}=fLeL08?W4=k#H-|mc0Py&URzuQ#b{V zE-azH6LaWwUypXI5IDqcyGeXBb@S%A+<_=t6Q(wM4#MYzn87A zicg=EPnCk-Bsf7W;752T za-!kddpHN`r|$W%2p;w?9wN%0yWzcz@22#`jiB7lbL|)b7q~o87Sd4VG4x;X_D|dm z>2N!h!<``G;VFzCq!g@%FM0SdT+H}zIc1@pLUF^msoZYQ9HuYOMlK)8@$jV~3zb6! zzr=pd`j!0|aMHis^&f=O;9`|Ux8Ff9&Ue?-&mKEMw|wcd3fP!xLv|~_oq?B~beD1C zZ}G!Icb;X(jnoeYtmYHYcZyr3nzy)^<<}Z=Qt_wo>P7CntM6m{3+~Bq7rdW-CmEc5 zT@F`XFl4Wq{{_6zGr#@sI9}mSk@2l%EDe=3L^o_zXy#q|4++Nv{SER`v=HpiE3P{L)Z?wMAZ*9X5`!C{OB`5Aq>iK2& zmVFPrPt5vP#X8vVnf3RcGjKV25|y6JyYRcG--1g#{eOeY-F{1AM>D}QU<6#rfb|G; zs*!#-_u|E_LvMixz|n<13m599B&dLS7oO~Qxf-qrxP09`1VR&2)`sOA}&=9R+(0KK>tUjlHt}nsFZXv%*TddYs-;&pXV{ z*EKVxMk&@y*s>T?ij^lmzn@D4{bh=;`U7*}VT${P`c0%X{&X)Fv?Z>Cy4n{f>f?F% z(Y}TDXk<=-w>|CNP&dIfo_QZVKxD?6>LSM3RmyxgO{tp)@AE`d%Sn`4=C`2ViTqJ; zNxUiLk@3Ccfd@%l&jI%)yqyUtYQkyQGeI)#xZhJLCfwopp^Yge5kb-uKdf(UO0x3P zbMSE#ZCCw|KST*!>N=nbF8A;SSm0T4e;(O2mc{y7cqOYz+IG{C$J;G zgUj1OA5PZ~#(yx83edx>|0H*_{oV|HYg21R9iRC6nv$cY7a+c%mswxI%9xkX!p;0X zRIubM`c(ye`}brt{gJo`$V%KjEscy<^6q_;>s1V*x*`jl?P#2+L1%5E|x)*nfk{SZ?H*Is0Q)%fxA*?`NY7>Z+_r@|rM$qVeZyYJLT2CP4! zctpj6V3=^1bq-j9N4lJs7Rci>c|a5|jC_-KDy zyWf}kLjf!91umeT_VX`tTJ;Im2g{(4Cc$@u;VSJU*B{}B;UEricqhDM3-2q%&6km^ zRY4i8^bUhd;XR6IMa6s`B*sKT>7icMU!P7sBn7 zpsCOBf`p?Nkoe_xk0bhxnzqQEbX4EkMB8Pjp3pby+GhK}DX#8XnmxZp{~@3a;im&` z!tL!2Kk1h>EBS!PvWbxkRBNJrEP&xgn$0(;IhEzuSEqQ~6;`f+y?>zNKc{J-sk!^S=*6Ftp@FyC!{7>W&=VS1a|Kic4`m5m;|2FHl;Ozh>QkCoB-c2~LH%8=Hj)KiJ z3_@T&0vv%S;4Xiy-yA&qj{C@hz#HKS!>7 z4zGhVeUUf4!(YOC*}@_bE9}xXtvK_VP&}!=&VYP4IVLEpmBQy?ZxEe=2OVNX_|O^u zOgx`&w8$gL;l1$5A0t;ghp%eQ)dP7XUwHh@a3QsCD*D3>JDmp49(Heo5%0JwnhPKI z@CkTMFc^MzI0}X*a0Yukupai#Z*ldN^C!b8$4pshsTHrHVeMIN1&Y6M2K-`%-&c-; zlxr}Zs2!|4ayL8}E>(O1-a9mMs5#@GzLqau(<5K;9R2_Va zHhF^PG+g&tx~oy_6%S1#Rl9fhtY^5MxDUkgwBiyK4J4X(fI z4cVmhecGKu`L$_6*YKW79JQL3>)kiu&g&(aLTMt({G5u~_A$ zGvT-WaT!|>E)?)Zc-djz*dsTt*K;3cFn_J-5=Znz6K&q#kj#=*-x{olh@ z%CMjeQ!DPA$BNIJ^`(`c%cYhebaXfdeFSeKh>{h@3}l5_kvosmUqdjI;gM)1?0hqa zZk}5=mflJ~@(Z!Z8UNL-nkCyPEYT>=8+_%St$|li38OLbGn^I|x!OAd(uQCOSG`&# zuo(8{`ARq;)(oG<&iIS)Zc4AA7BF$Bg#rr4WF_DqLn$0P+|z2(ZMclm>;#=7pe?TQ zo^Ge}NxQTB{{R&u3-8e6&wmSYH*mJVCx>9~VfDoXJa${S@`dHKv?j7gZQV3#$7|uJ zXOD)%vFu@VPc68WhigiBz9*Pct_-~Y4_6kR4`6TMdf)-lw4E6?&{>dmb17e@Jqq{1 z6)ny14>-<%rIR@EhD7cq4j+RH`vzsZa$)tu1l=%GCMzEL2p%QsOI2DnnR=x`C9uaJ zOLoy9$)=z;?2=1xc{fv%6lXq4(4~=4e-qC9Qn{as- zo;hlM#^Y4Zu9V&|v;UPe?4x0-8qj+hH!lpxR9p$K=uXtC6`h1@Q(XfRc%K=$rWk7c zR9M&|CvBb6)Z~3unI3sCIvza3yQ|>$Tv(i#anAoaWn895(ZCF6K()gN%vA!jW|B5= zvErHVA$YXn9dJ%R_e$1s77OwO*%Y{l{$*9^ZlWTDLY!-E^8Gao&3z`V$=LTiBvtoD!Y{1Bmoc~|Y z(1k*huN1U>k}T-Od9GYOkeckhU>t$H$L*6`o|9~zrb@x}e%Mf52slLFqEMX{2Gq3%IoYR;tMnxU@@97AhBSSxU8|^hPV; zm=`e^kF8fLyu<#`?|=M2LV8wadUl`mtgJp6**Q7s8JRiR*`d3>_OHCUp&kjn73c39 z>T$#$(^&sx`WuvN&pqNF+q6xu-su?`y|c12GW+CY=kTwzEW7S||6;A7p3sDo{u|o$ z?onF$*rXl}%#8H+X}mu)qT1h}-WN~%GeRq>{Tmuo{pL0P+|cq<{%afTogE*zyTOk1 zAN(&h*fHgqz|c^)8vmmW_U_3D1Vf+IG^`CnA8BwF%C5CvKJEWmYh+70^va1i=+}2O zDI@*YhlJvX2Cfekobyj>L`hP5S|bw7AN>;>T!493piO9HMIbI@|LE`E;E-?#q-Xrv z9*4{pft*mqdH=RXtP9Qh$=|fWs0=Op$-k?Sne7|#T{wQetM&J9WPVacBLYH(7UMsh7XdP(UVDE%$ z{o_IdF8P}@EVU@cU)28Bml!E4NsYu`WJIHG3j6W@)uHOhuctxi;^jt*+tU7l#%f=O zj7D-mtusRvtA>n-ghL}ToB=%>_VVAfK$1O63v_(herZ);rlyUu+pY<`H0%EW(hylf delta 10944 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 Date: Fri, 15 May 2026 20:56:21 -0300 Subject: [PATCH 14/33] replace unit tests with integration tests --- .../tests/auth_transfer/private.rs | 128 ++++++++++++ .../tests/auth_transfer/public.rs | 68 ++++++- sequencer/core/src/lib.rs | 184 ------------------ 3 files changed, 195 insertions(+), 185 deletions(-) diff --git a/integration_tests/tests/auth_transfer/private.rs b/integration_tests/tests/auth_transfer/private.rs index 9508ee29..feb5e5e8 100644 --- a/integration_tests/tests/auth_transfer/private.rs +++ b/integration_tests/tests/auth_transfer/private.rs @@ -1,6 +1,7 @@ use std::time::Duration; use anyhow::{Context as _, Result}; +use common::transaction::NSSATransaction; use integration_tests::{ TIME_TO_WAIT_FOR_BLOCK_SECONDS, TestContext, fetch_privacy_preserving_tx, private_mention, public_mention, verify_commitment_is_in_state, @@ -623,3 +624,130 @@ async fn shielded_transfers_to_two_identifiers_same_npk() -> Result<()> { Ok(()) } + +#[test] +async fn ppt_that_chain_calls_faucet_is_dropped() -> Result<()> { + use nssa::{ + EphemeralPublicKey, SharedSecretKey, execute_and_prove, + privacy_preserving_transaction::{self, circuit::ProgramWithDependencies}, + }; + use nssa_core::{InputAccountIdentity, account::AccountWithMetadata}; + + let ctx = TestContext::new().await?; + + let binary = std::fs::read( + std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../artifacts/test_program_methods/faucet_chain_caller.bin"), + )?; + let deploy_tx = NSSATransaction::ProgramDeployment(nssa::ProgramDeploymentTransaction::new( + nssa::program_deployment_transaction::Message::new(binary.clone()), + )); + ctx.sequencer_client().send_transaction(deploy_tx).await?; + + info!("Waiting for deploy block creation"); + tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await; + + let faucet_account_id = nssa::system_faucet_account_id(); + let attacker_id = ctx.existing_public_accounts()[0]; + let faucet_program_id = Program::faucet().id(); + let vault_program_id = Program::vault().id(); + let auth_transfer_program_id = Program::authenticated_transfer_program().id(); + let nsk: nssa_core::NullifierSecretKey = [3; 32]; + let npk = NullifierPublicKey::from(&nsk); + let vpk = Secp256k1Point::from_scalar([4; 32]); + let ssk = SharedSecretKey::new([55; 32], &vpk); + let epk = EphemeralPublicKey::from_scalar([55; 32]); + let attacker_vault_id = { + let seed = vault_core::compute_vault_seed(attacker_id); + AccountId::for_private_pda(&vault_program_id, &seed, &npk, 1337) + }; + let amount: u128 = 1; + + let faucet_pre = AccountWithMetadata::new( + ctx.sequencer_client() + .get_account(faucet_account_id) + .await?, + false, + faucet_account_id, + ); + let vault_pda_pre = AccountWithMetadata::new( + ctx.sequencer_client() + .get_account(attacker_vault_id) + .await?, + false, + attacker_vault_id, + ); + + let faucet_chain_caller = Program::new(binary)?; + let program_with_deps = ProgramWithDependencies::new( + faucet_chain_caller, + [ + (faucet_program_id, Program::faucet()), + (vault_program_id, Program::vault()), + ( + auth_transfer_program_id, + Program::authenticated_transfer_program(), + ), + ] + .into(), + ); + + let instruction = + Program::serialize_instruction((faucet_program_id, vault_program_id, attacker_id, amount))?; + + let (output, proof) = execute_and_prove( + vec![faucet_pre, vault_pda_pre], + instruction, + vec![ + InputAccountIdentity::Public, + InputAccountIdentity::PrivatePdaInit { + npk, + ssk, + identifier: 1337, + }, + ], + &program_with_deps, + )?; + + let message = privacy_preserving_transaction::Message::try_from_circuit_output( + vec![faucet_account_id], + vec![], + vec![(npk, vpk, epk)], + output, + )?; + let witness_set = privacy_preserving_transaction::WitnessSet::for_message(&message, proof, &[]); + let attack_ppt = NSSATransaction::PrivacyPreserving(nssa::PrivacyPreservingTransaction::new( + message, + witness_set, + )); + + let faucet_balance_before = ctx + .sequencer_client() + .get_account_balance(faucet_account_id) + .await?; + let vault_balance_before = ctx + .sequencer_client() + .get_account_balance(attacker_vault_id) + .await?; + + let tx_hash = ctx.sequencer_client().send_transaction(attack_ppt).await?; + + info!("Waiting for next block creation"); + tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await; + + let faucet_balance_after = ctx + .sequencer_client() + .get_account_balance(faucet_account_id) + .await?; + let vault_balance_after = ctx + .sequencer_client() + .get_account_balance(attacker_vault_id) + .await?; + let tx_on_chain = ctx.sequencer_client().get_transaction(tx_hash).await?; + + assert_eq!(faucet_balance_after, faucet_balance_before); + assert_eq!(vault_balance_after, vault_balance_before); + assert!(tx_on_chain.is_none()); + + Ok(()) +} diff --git a/integration_tests/tests/auth_transfer/public.rs b/integration_tests/tests/auth_transfer/public.rs index 54713f67..736c24c5 100644 --- a/integration_tests/tests/auth_transfer/public.rs +++ b/integration_tests/tests/auth_transfer/public.rs @@ -1,4 +1,4 @@ -use std::time::Duration; +use std::{path::PathBuf, time::Duration}; use anyhow::Result; use common::transaction::NSSATransaction; @@ -492,3 +492,69 @@ async fn cannot_execute_faucet_program() -> Result<()> { Ok(()) } + +#[test] +async fn user_tx_that_chain_calls_faucet_is_dropped() -> Result<()> { + let ctx = TestContext::new().await?; + + let binary = std::fs::read( + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../artifacts/test_program_methods/faucet_chain_caller.bin"), + )?; + let faucet_chain_caller_id = Program::new(binary.clone())?.id(); + let deploy_tx = NSSATransaction::ProgramDeployment(nssa::ProgramDeploymentTransaction::new( + nssa::program_deployment_transaction::Message::new(binary), + )); + ctx.sequencer_client().send_transaction(deploy_tx).await?; + + info!("Waiting for deploy block creation"); + tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await; + + let faucet_account_id = system_faucet_account_id(); + let attacker = ctx.existing_public_accounts()[0]; + let faucet_program_id = Program::faucet().id(); + let vault_program_id = Program::vault().id(); + let attacker_vault_id = vault_core::compute_vault_account_id(vault_program_id, attacker); + let amount: u128 = 1; + + let message = public_transaction::Message::try_new( + faucet_chain_caller_id, + vec![faucet_account_id, attacker_vault_id], + vec![], + (faucet_program_id, vault_program_id, attacker, amount), + )?; + let attack_tx = NSSATransaction::Public(nssa::PublicTransaction::new( + message, + nssa::public_transaction::WitnessSet::from_raw_parts(vec![]), + )); + + let faucet_balance_before = ctx + .sequencer_client() + .get_account_balance(faucet_account_id) + .await?; + let vault_balance_before = ctx + .sequencer_client() + .get_account_balance(attacker_vault_id) + .await?; + + let tx_hash = ctx.sequencer_client().send_transaction(attack_tx).await?; + + info!("Waiting for next block creation"); + tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await; + + let faucet_balance_after = ctx + .sequencer_client() + .get_account_balance(faucet_account_id) + .await?; + let vault_balance_after = ctx + .sequencer_client() + .get_account_balance(attacker_vault_id) + .await?; + let tx_on_chain = ctx.sequencer_client().get_transaction(tx_hash).await?; + + assert_eq!(faucet_balance_after, faucet_balance_before); + assert_eq!(vault_balance_after, vault_balance_before); + assert!(tx_on_chain.is_none()); + + Ok(()) +} diff --git a/sequencer/core/src/lib.rs b/sequencer/core/src/lib.rs index fa151d9c..c6606145 100644 --- a/sequencer/core/src/lib.rs +++ b/sequencer/core/src/lib.rs @@ -437,8 +437,6 @@ mod tests { }; use logos_blockchain_core::mantle::ops::channel::ChannelId; use mempool::MemPoolHandle; - use nssa::{EphemeralPublicKey, SharedSecretKey}; - use nssa_core::{NullifierPublicKey, account::AccountId, encryption::ViewingPublicKey}; use tempfile::tempdir; use testnet_initial_state::{initial_accounts, initial_pub_accounts_private_keys}; @@ -1062,186 +1060,4 @@ mod tests { "Block production should abort when clock account data is corrupted" ); } - - #[tokio::test] - async fn user_tx_that_chain_calls_faucet_is_dropped() { - let (mut sequencer, mempool_handle) = common_setup().await; - - // Deploy the faucet_chain_caller test program. - let deploy_tx = - NSSATransaction::ProgramDeployment(nssa::ProgramDeploymentTransaction::new( - nssa::program_deployment_transaction::Message::new( - test_program_methods::FAUCET_CHAIN_CALLER_ELF.to_vec(), - ), - )); - mempool_handle.push(deploy_tx).await.unwrap(); - sequencer.produce_new_block().await.unwrap(); - - // The attacker chain-calls the faucet through their own program: - // faucet_chain_caller → faucet → vault → authenticated_transfer. - // Funds from the system faucet would land in the attacker's vault PDA. - let faucet_account_id = nssa::system_faucet_account_id(); - let attacker_id = initial_accounts()[0].account_id; - let faucet_program_id = nssa::program::Program::faucet().id(); - let vault_program_id = nssa::program::Program::vault().id(); - let attacker_vault_id = vault_core::compute_vault_account_id(vault_program_id, attacker_id); - let amount: u128 = 1; - - let faucet_chain_caller_id = - nssa::program::Program::new(test_program_methods::FAUCET_CHAIN_CALLER_ELF.to_vec()) - .unwrap() - .id(); - - let message = nssa::public_transaction::Message::try_new( - faucet_chain_caller_id, - vec![faucet_account_id, attacker_vault_id], - vec![], // no signers — faucet PDA authorization is handled internally - (faucet_program_id, vault_program_id, attacker_id, amount), - ) - .unwrap(); - let attack_tx = NSSATransaction::Public(nssa::PublicTransaction::new( - message, - nssa::public_transaction::WitnessSet::from_raw_parts(vec![]), - )); - - let faucet_balance_before = sequencer.state.get_account_by_id(faucet_account_id).balance; - let vault_balance_before = sequencer.state.get_account_by_id(attacker_vault_id).balance; - - mempool_handle.push(attack_tx).await.unwrap(); - sequencer.produce_new_block().await.unwrap(); - - let faucet_balance_after = sequencer.state.get_account_by_id(faucet_account_id).balance; - let vault_balance_after = sequencer.state.get_account_by_id(attacker_vault_id).balance; - - assert_eq!(faucet_balance_after, faucet_balance_before); - assert_eq!(vault_balance_after, vault_balance_before); - } - - #[tokio::test] - async fn ppt_that_chain_calls_faucet_is_dropped() { - use nssa::privacy_preserving_transaction::circuit::ProgramWithDependencies; - use nssa_core::{InputAccountIdentity, account::AccountWithMetadata}; - - let (mut sequencer, mempool_handle) = common_setup().await; - - // Deploy the faucet_chain_caller test program. - let deploy_tx = - NSSATransaction::ProgramDeployment(nssa::ProgramDeploymentTransaction::new( - nssa::program_deployment_transaction::Message::new( - test_program_methods::FAUCET_CHAIN_CALLER_ELF.to_vec(), - ), - )); - mempool_handle.push(deploy_tx).await.unwrap(); - sequencer.produce_new_block().await.unwrap(); - - // The attacker runs faucet_chain_caller inside a PPT circuit, producing a valid proof - // that the faucet was drained into their vault PDA. - let faucet_account_id = nssa::system_faucet_account_id(); - let attacker_id = initial_accounts()[0].account_id; - let faucet_program_id = nssa::program::Program::faucet().id(); - let vault_program_id = nssa::program::Program::vault().id(); - let auth_transfer_program_id = - nssa::program::Program::authenticated_transfer_program().id(); - let nsk = [3; 32]; - let npk = NullifierPublicKey::from(&nsk); - let vsk = [4; 32]; - let vpk = ViewingPublicKey::from_scalar(vsk); - let ssk = SharedSecretKey::new([55; 32], &vpk); - let epk = EphemeralPublicKey::from_scalar([55; 32]); - let attacker_vault_id = { - let seed = vault_core::compute_vault_seed(attacker_id); - AccountId::for_private_pda(&vault_program_id, &seed, &npk, 1337) - }; - let amount: u128 = 1; - - let faucet_pre = AccountWithMetadata::new( - sequencer.state.get_account_by_id(faucet_account_id), - false, - faucet_account_id, - ); - let vault_pda_pre = AccountWithMetadata::new( - sequencer.state.get_account_by_id(attacker_vault_id), - false, - attacker_vault_id, - ); - - let faucet_chain_caller = - nssa::program::Program::new(test_program_methods::FAUCET_CHAIN_CALLER_ELF.to_vec()) - .unwrap(); - let program_with_deps = ProgramWithDependencies::new( - faucet_chain_caller, - [ - (faucet_program_id, nssa::program::Program::faucet()), - (vault_program_id, nssa::program::Program::vault()), - ( - auth_transfer_program_id, - nssa::program::Program::authenticated_transfer_program(), - ), - ] - .into(), - ); - - let instruction = nssa::program::Program::serialize_instruction(( - faucet_program_id, - vault_program_id, - attacker_id, - amount, - )) - .unwrap(); - - let (output, proof) = nssa::execute_and_prove( - vec![faucet_pre, vault_pda_pre], - instruction, - vec![ - InputAccountIdentity::Public, - InputAccountIdentity::PrivatePdaInit { - npk, - ssk, - identifier: 1337, - }, - ], - &program_with_deps, - ) - .unwrap(); - - let message = nssa::privacy_preserving_transaction::Message::try_from_circuit_output( - vec![faucet_account_id], - vec![], // no public signers - vec![(npk, vpk, epk)], - output, - ) - .unwrap(); - let witness_set = nssa::privacy_preserving_transaction::WitnessSet::for_message( - &message, - proof, - &[], // no signatures - ); - let attack_ppt = NSSATransaction::PrivacyPreserving( - nssa::PrivacyPreservingTransaction::new(message, witness_set), - ); - - let faucet_balance_before = sequencer.state.get_account_by_id(faucet_account_id).balance; - let vault_balance_before = sequencer.state.get_account_by_id(attacker_vault_id).balance; - - mempool_handle.push(attack_ppt).await.unwrap(); - sequencer.produce_new_block().await.unwrap(); - - let block = sequencer - .store - .get_block_at_id(sequencer.chain_height) - .unwrap() - .unwrap(); - let faucet_balance_after = sequencer.state.get_account_by_id(faucet_account_id).balance; - let vault_balance_after = sequencer.state.get_account_by_id(attacker_vault_id).balance; - - // The attack PPT must be dropped; only the mandatory clock invocation remains. - assert_eq!( - block.body.transactions, - vec![NSSATransaction::Public(clock_invocation( - block.header.timestamp - ))] - ); - assert_eq!(faucet_balance_after, faucet_balance_before); - assert_eq!(vault_balance_after, vault_balance_before); - } } From 518c0e020592e2229c3e8e1e7ec5c6ebc38fddd0 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Fri, 15 May 2026 21:07:17 -0300 Subject: [PATCH 15/33] remove test. Now directly modifying faucet account is forbidden --- .../tests/auth_transfer/public.rs | 38 ------------------- 1 file changed, 38 deletions(-) diff --git a/integration_tests/tests/auth_transfer/public.rs b/integration_tests/tests/auth_transfer/public.rs index 736c24c5..72685d0b 100644 --- a/integration_tests/tests/auth_transfer/public.rs +++ b/integration_tests/tests/auth_transfer/public.rs @@ -397,44 +397,6 @@ async fn cannot_transfer_funds_from_system_faucet_account() -> Result<()> { Ok(()) } -#[test] -async fn can_transfer_funds_to_system_faucet_account() -> Result<()> { - let mut ctx = TestContext::new().await?; - let faucet_account_id = system_faucet_account_id(); - - let sender = ctx.existing_public_accounts()[0]; - let sender_balance_before = ctx.sequencer_client().get_account_balance(sender).await?; - let faucet_balance_before = ctx - .sequencer_client() - .get_account_balance(faucet_account_id) - .await?; - - let amount = 100_u128; - let command = Command::AuthTransfer(AuthTransferSubcommand::Send { - from: public_mention(sender), - to: Some(public_mention(faucet_account_id)), - to_npk: None, - to_vpk: None, - to_identifier: Some(0), - amount, - }); - wallet::cli::execute_subcommand(ctx.wallet_mut(), command).await?; - - info!("Waiting for next block creation"); - tokio::time::sleep(Duration::from_secs(TIME_TO_WAIT_FOR_BLOCK_SECONDS)).await; - - let sender_balance_after = ctx.sequencer_client().get_account_balance(sender).await?; - let faucet_balance_after = ctx - .sequencer_client() - .get_account_balance(faucet_account_id) - .await?; - - assert_eq!(sender_balance_after, sender_balance_before - amount); - assert_eq!(faucet_balance_after, faucet_balance_before + amount); - - Ok(()) -} - #[test] async fn cannot_execute_faucet_program() -> Result<()> { let ctx = TestContext::new().await?; From 28db42315b5308662b03fe1caf6f5816fcd22a91 Mon Sep 17 00:00:00 2001 From: Moudy Date: Mon, 18 May 2026 15:49:24 +0200 Subject: [PATCH 16/33] =?UTF-8?q?chore(cycle=5Fbench):=20tighten=20lint=20?= =?UTF-8?q?discipline=20(allow=20=E2=86=92=20expect,=20fix=20issues=20in?= =?UTF-8?q?=20code)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Switch crate-level #![allow] to #![expect] in main.rs and prune 17 entries the compiler reports as unfulfilled or workspace-allowed. - Fix the underlying issues rather than allow: source ordering (mods/uses regrouped), doc_markdown (identifiers backticked), redundant_type_annotations, map_unwrap_or, unnecessary_wraps. - Extract feature-gated mod ppe_impl into its own file tools/cycle_bench/src/ppe/ppe_impl.rs so the mod declaration can precede the public structs per arbitrary_source_item_ordering. Net: 35 → 12 expects in main.rs, all load-bearing. --- Cargo.lock | 18 ++ tools/cycle_bench/src/main.rs | 62 +++---- tools/cycle_bench/src/ppe.rs | 228 ++------------------------ tools/cycle_bench/src/ppe/ppe_impl.rs | 194 ++++++++++++++++++++++ 4 files changed, 248 insertions(+), 254 deletions(-) create mode 100644 tools/cycle_bench/src/ppe/ppe_impl.rs diff --git a/Cargo.lock b/Cargo.lock index 1c49d7e7..856e038b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1971,6 +1971,24 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "cycle_bench" +version = "0.1.0" +dependencies = [ + "amm_core", + "anyhow", + "ata_core", + "borsh", + "clap", + "clock_core", + "nssa", + "nssa_core", + "risc0-zkvm", + "serde", + "serde_json", + "token_core", +] + [[package]] name = "darling" version = "0.20.11" diff --git a/tools/cycle_bench/src/main.rs b/tools/cycle_bench/src/main.rs index b87bdb3e..6f254868 100644 --- a/tools/cycle_bench/src/main.rs +++ b/tools/cycle_bench/src/main.rs @@ -7,50 +7,24 @@ //! Run with `cargo run --release -p cycle_bench`. `RISC0_DEV_MODE` has no effect on //! executor cycle counts. -#![allow( - clippy::arbitrary_source_item_ordering, +#![expect( clippy::arithmetic_side_effects, clippy::as_conversions, clippy::cast_precision_loss, - clippy::doc_markdown, clippy::float_arithmetic, - clippy::ignored_unit_patterns, - clippy::items_after_statements, - clippy::let_underscore_must_use, - clippy::let_underscore_untyped, - clippy::map_unwrap_or, clippy::missing_const_for_fn, - clippy::missing_docs_in_private_items, - clippy::module_inception, - clippy::module_name_repetitions, clippy::needless_pass_by_value, - clippy::no_effect_underscore_binding, clippy::non_ascii_literal, clippy::print_literal, clippy::print_stderr, clippy::print_stdout, - clippy::redundant_type_annotations, - clippy::ref_option, clippy::ref_patterns, - clippy::similar_names, - clippy::single_call_fn, - clippy::single_match_else, - clippy::std_instead_of_alloc, - clippy::std_instead_of_core, clippy::too_many_arguments, - clippy::too_many_lines, - clippy::unnecessary_wraps, - clippy::unwrap_used, - clippy::useless_format, - clippy::wildcard_enum_match_arm, reason = "Bench tool: matches test-style fixture code" )] use std::{path::PathBuf, time::Instant}; -mod ppe; -mod stats; - use amm_core::{PoolDefinition, compute_liquidity_token_pda, compute_pool_pda, compute_vault_pda}; use anyhow::Result; use ata_core::{compute_ata_seed, get_associated_token_account_id}; @@ -71,9 +45,13 @@ use nssa_core::{ }; use risc0_zkvm::{ExecutorEnv, default_executor, default_prover}; use serde::Serialize; -use stats::Stats; use token_core::{TokenDefinition, TokenHolding}; +use stats::Stats; + +mod ppe; +mod stats; + #[derive(Parser, Debug)] #[command(about = "Per-program executor and (optionally) prover cycle measurements")] struct Cli { @@ -82,14 +60,14 @@ struct Cli { prove: bool, /// Also run privacy-preserving execution circuit (PPE) composition cases: - /// (a) single auth_transfer Transfer through `execute_and_prove`, (b) chain_caller + /// (a) single `auth_transfer` Transfer through `execute_and_prove`, (b) `chain_caller` /// with depth N=1,3,5,9. Requires --features ppe at build time. Very slow. #[arg(long)] ppe: bool, /// After running --ppe-style proving once for auth_transfer-in-PPE, time - /// receipt.verify(PRIVACY_PRESERVING_CIRCUIT_ID) over many iterations. - /// Produces G_verify for the fee model. Requires --features ppe. + /// `receipt.verify(PRIVACY_PRESERVING_CIRCUIT_ID)` over many iterations. + /// Produces `G_verify` for the fee model. Requires --features ppe. #[arg(long)] verify: bool, @@ -343,11 +321,11 @@ fn amm_lp_def_id() -> AccountId { compute_liquidity_token_pda(AMM_ID, amm_pool_id()) } -/// Pool seeded with reserves 1_000 / 500, lp supply sqrt(1000*500) = 707. +/// Pool seeded with reserves `1_000` / `500`, lp supply `sqrt(1000*500) = 707`. fn amm_pool_account() -> AccountWithMetadata { let reserve_a: u128 = 1_000; let reserve_b: u128 = 500; - let lp_supply: u128 = (reserve_a * reserve_b).isqrt(); + let lp_supply = (reserve_a * reserve_b).isqrt(); AccountWithMetadata { account: Account { program_owner: AMM_ID, @@ -384,7 +362,7 @@ fn amm_add_liquidity_pre_states() -> Vec { let pool = amm_pool_account(); let vault_a = token_holding(amm_token_a_def_id(), amm_vault_a_id(), 1_000, true); let vault_b = token_holding(amm_token_b_def_id(), amm_vault_b_id(), 500, true); - let lp_supply: u128 = (1_000_u128 * 500_u128).isqrt(); + let lp_supply = (1_000_u128 * 500_u128).isqrt(); let lp_def = token_definition(amm_lp_def_id(), lp_supply, true); let user_a = token_holding(amm_token_a_def_id(), AccountId::new([45; 32]), 1_000, true); let user_b = token_holding(amm_token_b_def_id(), AccountId::new([46; 32]), 500, true); @@ -538,7 +516,7 @@ fn main() -> Result<()> { print_table(&results, prove); #[cfg(feature = "ppe")] - let ppe_results = if cli.ppe { ppe::run_all()? } else { Vec::new() }; + let ppe_results = if cli.ppe { ppe::run_all() } else { Vec::new() }; #[cfg(not(feature = "ppe"))] let ppe_results: Vec = { if cli.ppe { @@ -637,16 +615,14 @@ fn print_table(results: &[BenchResult], prove: bool) { for r in results { let total = r .prove_total_cycles - .map(|c| c.to_string()) - .unwrap_or_else(|| "-".to_owned()); - let pms = r - .prove_stats - .map(|s| format!("{:.1} ({:.1}s)", s.best_ms, s.best_ms / 1_000.0)) - .unwrap_or_else(|| "-".to_owned()); + .map_or_else(|| "-".to_owned(), |c| c.to_string()); + let pms = r.prove_stats.map_or_else( + || "-".to_owned(), + |s| format!("{:.1} ({:.1}s)", s.best_ms, s.best_ms / 1_000.0), + ); let psegs = r .prove_segments - .map(|s| s.to_string()) - .unwrap_or_else(|| "-".to_owned()); + .map_or_else(|| "-".to_owned(), |s| s.to_string()); println!( "{:pcw$} {:>pwallw$} {:>psw$}", r.program, r.instruction, total, pms, psegs, diff --git a/tools/cycle_bench/src/ppe.rs b/tools/cycle_bench/src/ppe.rs index c564980f..0390f533 100644 --- a/tools/cycle_bench/src/ppe.rs +++ b/tools/cycle_bench/src/ppe.rs @@ -1,14 +1,14 @@ -//! Privacy-preserving execution (PPE) cases for cycle_bench. +//! Privacy-preserving execution (PPE) cases for `cycle_bench`. //! //! Composition cost is the delta between standalone `prover.prove(env, elf)` for //! a single program (measured in the main bench) and a full `execute_and_prove` //! that wraps the same program in the privacy circuit. Chained-call depth sweep //! uses the `chain_caller` test program (loaded from artifacts/) with N=1, 3, 5, 9. //! -//! `run_verify` produces G_verify for the fee model: it generates one PPE -//! receipt (auth_transfer Transfer in PPE) and times `Receipt::verify` over +//! `run_verify` produces `G_verify` for the fee model: it generates one PPE +//! receipt (`auth_transfer` Transfer in PPE) and times `Receipt::verify` over //! `iters` iterations. The proof bytes captured here are also the on-wire -//! "outer proof" payload (S_agg in the fee model). +//! "outer proof" payload (`S_agg` in the fee model). #![allow( dead_code, @@ -20,12 +20,15 @@ use serde::Serialize; use crate::stats::Stats; +#[cfg(feature = "ppe")] +mod ppe_impl; + #[derive(Debug, Serialize, Clone)] pub struct PpeBenchResult { pub label: String, pub chain_depth: usize, pub prove_wall_ms: Option, - /// borsh-serialized InnerReceipt length (S_agg in the fee model). + /// borsh-serialized `InnerReceipt` length (`S_agg` in the fee model). pub proof_bytes: Option, pub error: Option, } @@ -39,12 +42,12 @@ pub struct VerifyBenchResult { } #[cfg(not(feature = "ppe"))] -pub fn run_all() -> Result> { - Ok(Vec::new()) +pub fn run_all() -> Vec { + Vec::new() } #[cfg(feature = "ppe")] -pub fn run_all() -> Result> { +pub fn run_all() -> Vec { let mut results = Vec::new(); eprintln!("PPE: running composition cost (auth_transfer Transfer in PPE)"); @@ -55,7 +58,7 @@ pub fn run_all() -> Result> { results.push(ppe_impl::run_chain_caller(depth)); } - Ok(results) + results } #[cfg(not(feature = "ppe"))] @@ -87,14 +90,13 @@ pub fn print_table(results: &[PpeBenchResult]) { ); println!("{}", "-".repeat(lw + 60)); for r in results { - let p = r - .prove_wall_ms - .map(|v| format!("{v:.1} ({:.1}s)", v / 1_000.0)) - .unwrap_or_else(|| "-".to_owned()); + let p = r.prove_wall_ms.map_or_else( + || "-".to_owned(), + |v| format!("{v:.1} ({:.1}s)", v / 1_000.0), + ); let b = r .proof_bytes - .map(|n| n.to_string()) - .unwrap_or_else(|| "-".to_owned()); + .map_or_else(|| "-".to_owned(), |n| n.to_string()); let e = r.error.as_deref().unwrap_or(""); println!( "{:5} {:>20} {:>12} {}", @@ -118,199 +120,3 @@ pub fn print_verify(r: &VerifyBenchResult) { println!(" journal_bytes : {}", r.journal_bytes); println!(" verify_ms : {}", r.stats.format()); } - -#[cfg(feature = "ppe")] -mod ppe_impl { - use std::{collections::HashMap, time::Instant}; - - use nssa::{ - execute_and_prove, - privacy_preserving_transaction::circuit::{ProgramWithDependencies, Proof}, - program::Program, - program_methods::PRIVACY_PRESERVING_CIRCUIT_ID, - }; - use nssa_core::{ - InputAccountIdentity, PrivacyPreservingCircuitOutput, - account::{Account, AccountId, AccountWithMetadata}, - program::ProgramId, - }; - use risc0_zkvm::{InnerReceipt, Receipt, serde::to_vec}; - - use super::{PpeBenchResult, VerifyBenchResult}; - use crate::stats::Stats; - - const AUTH_TRANSFER_ID: ProgramId = nssa::program_methods::AUTHENTICATED_TRANSFER_ID; - const AUTH_TRANSFER_ELF: &[u8] = nssa::program_methods::AUTHENTICATED_TRANSFER_ELF; - - /// chain_caller bytecode shipped at artifacts/test_program_methods/chain_caller.bin. - /// Loaded at compile time so we don't need a dev-dependency on test_program_methods. - const CHAIN_CALLER_ELF: &[u8] = - include_bytes!("../../../artifacts/test_program_methods/chain_caller.bin"); - - pub fn run_auth_transfer_in_ppe() -> PpeBenchResult { - let label = "auth_transfer Transfer in PPE".to_owned(); - let started = Instant::now(); - match prove_auth_transfer_in_ppe() { - Ok((_out, proof)) => { - let prove_ms = started.elapsed().as_secs_f64() * 1_000.0; - PpeBenchResult { - label, - chain_depth: 0, - prove_wall_ms: Some(prove_ms), - proof_bytes: Some(proof.into_inner().len()), - error: None, - } - } - Err(err) => PpeBenchResult { - label, - chain_depth: 0, - prove_wall_ms: None, - proof_bytes: None, - error: Some(err.to_string()), - }, - } - } - - fn prove_auth_transfer_in_ppe() -> anyhow::Result<(PrivacyPreservingCircuitOutput, Proof)> { - let program = Program::new(AUTH_TRANSFER_ELF.to_vec())?; - let pwd = ProgramWithDependencies::from(program); - - // For PPE to allow the sender's balance to be decremented by this - // program, the sender must already be claimed by auth_transfer. - // Recipient stays default-owned so the first call can claim it. - let sender = AccountWithMetadata { - account: Account { - program_owner: AUTH_TRANSFER_ID, - balance: 1_000_000, - ..Account::default() - }, - is_authorized: true, - account_id: AccountId::new([1; 32]), - }; - let recipient = AccountWithMetadata { - account: Account::default(), - is_authorized: true, - account_id: AccountId::new([2; 32]), - }; - let pre_states = vec![sender, recipient]; - - let balance_to_move: u128 = 5_000; - let instruction_data = to_vec(&balance_to_move)?; - - let account_identities = vec![InputAccountIdentity::Public; pre_states.len()]; - - Ok(execute_and_prove( - pre_states, - instruction_data, - account_identities, - &pwd, - )?) - } - - pub fn run_chain_caller(depth: u32) -> PpeBenchResult { - let label = format!("chain_caller depth={depth}"); - let started = Instant::now(); - match prove_chain_caller(depth) { - Ok((_out, proof)) => { - let prove_ms = started.elapsed().as_secs_f64() * 1_000.0; - PpeBenchResult { - label, - chain_depth: depth as usize, - prove_wall_ms: Some(prove_ms), - proof_bytes: Some(proof.into_inner().len()), - error: None, - } - } - Err(err) => PpeBenchResult { - label, - chain_depth: depth as usize, - prove_wall_ms: None, - proof_bytes: None, - error: Some(err.to_string()), - }, - } - } - - fn prove_chain_caller( - num_chain_calls: u32, - ) -> anyhow::Result<(PrivacyPreservingCircuitOutput, Proof)> { - let chain_caller = Program::new(CHAIN_CALLER_ELF.to_vec())?; - let auth_transfer = Program::new(AUTH_TRANSFER_ELF.to_vec())?; - let mut deps = HashMap::new(); - deps.insert(AUTH_TRANSFER_ID, auth_transfer); - let pwd = ProgramWithDependencies::new(chain_caller, deps); - - // Both accounts pre-claimed by auth_transfer. chain_caller doesn't - // track recipient's post-claim program_owner, so a default recipient - // would cause a state mismatch on subsequent chained calls. - let recipient_pre = AccountWithMetadata { - account: Account { - program_owner: AUTH_TRANSFER_ID, - ..Account::default() - }, - is_authorized: true, - account_id: AccountId::new([2; 32]), - }; - let sender_pre = AccountWithMetadata { - account: Account { - program_owner: AUTH_TRANSFER_ID, - balance: 1_000_000, - ..Account::default() - }, - is_authorized: true, - account_id: AccountId::new([1; 32]), - }; - // chain_caller expects pre_states = [recipient, sender]. - let pre_states = vec![recipient_pre, sender_pre]; - - let balance: u128 = 1; - let pda_seed: Option = None; - let instruction = (balance, AUTH_TRANSFER_ID, num_chain_calls, pda_seed); - let instruction_data = to_vec(&instruction)?; - - let account_identities = vec![InputAccountIdentity::Public; pre_states.len()]; - - Ok(execute_and_prove( - pre_states, - instruction_data, - account_identities, - &pwd, - )?) - } - - pub fn run_verify(iters: usize) -> anyhow::Result { - eprintln!("verify: generating PPE receipt for auth_transfer Transfer (~1 prove)"); - let (output, proof) = prove_auth_transfer_in_ppe()?; - let journal = output.to_bytes(); - let journal_bytes = journal.len(); - let proof_bytes_vec = proof.into_inner(); - let proof_bytes = proof_bytes_vec.len(); - - let inner: InnerReceipt = borsh::from_slice(&proof_bytes_vec) - .map_err(|e| anyhow::anyhow!("InnerReceipt deserialize: {e}"))?; - let receipt = Receipt::new(inner, journal); - - // Sanity-check before the timing loop so we don't measure 1000 failures. - receipt - .verify(PRIVACY_PRESERVING_CIRCUIT_ID) - .map_err(|e| anyhow::anyhow!("verify sanity check failed: {e}"))?; - - eprintln!("verify: timing {iters} iters of receipt.verify(...)"); - let mut samples = Vec::with_capacity(iters); - for _ in 0..iters { - let started = Instant::now(); - receipt - .verify(PRIVACY_PRESERVING_CIRCUIT_ID) - .map_err(|e| anyhow::anyhow!("verify failed mid-loop: {e}"))?; - samples.push(started.elapsed().as_secs_f64() * 1_000.0); - } - let stats = Stats::from_samples(&samples); - - Ok(VerifyBenchResult { - label: "auth_transfer Transfer in PPE".to_owned(), - stats, - proof_bytes, - journal_bytes, - }) - } -} diff --git a/tools/cycle_bench/src/ppe/ppe_impl.rs b/tools/cycle_bench/src/ppe/ppe_impl.rs new file mode 100644 index 00000000..c20db9ac --- /dev/null +++ b/tools/cycle_bench/src/ppe/ppe_impl.rs @@ -0,0 +1,194 @@ +//! Feature-gated implementation of PPE composition and verify benches. + +use std::{collections::HashMap, time::Instant}; + +use nssa::{ + execute_and_prove, + privacy_preserving_transaction::circuit::{ProgramWithDependencies, Proof}, + program::Program, + program_methods::PRIVACY_PRESERVING_CIRCUIT_ID, +}; +use nssa_core::{ + InputAccountIdentity, PrivacyPreservingCircuitOutput, + account::{Account, AccountId, AccountWithMetadata}, + program::ProgramId, +}; +use risc0_zkvm::{InnerReceipt, Receipt, serde::to_vec}; + +use super::{PpeBenchResult, VerifyBenchResult}; +use crate::stats::Stats; + +const AUTH_TRANSFER_ID: ProgramId = nssa::program_methods::AUTHENTICATED_TRANSFER_ID; +const AUTH_TRANSFER_ELF: &[u8] = nssa::program_methods::AUTHENTICATED_TRANSFER_ELF; + +/// `chain_caller` bytecode shipped at `artifacts/test_program_methods/chain_caller.bin`. +/// Loaded at compile time so we don't need a dev-dependency on `test_program_methods`. +const CHAIN_CALLER_ELF: &[u8] = + include_bytes!("../../../../artifacts/test_program_methods/chain_caller.bin"); + +pub fn run_auth_transfer_in_ppe() -> PpeBenchResult { + let label = "auth_transfer Transfer in PPE".to_owned(); + let started = Instant::now(); + match prove_auth_transfer_in_ppe() { + Ok((_out, proof)) => { + let prove_ms = started.elapsed().as_secs_f64() * 1_000.0; + PpeBenchResult { + label, + chain_depth: 0, + prove_wall_ms: Some(prove_ms), + proof_bytes: Some(proof.into_inner().len()), + error: None, + } + } + Err(err) => PpeBenchResult { + label, + chain_depth: 0, + prove_wall_ms: None, + proof_bytes: None, + error: Some(err.to_string()), + }, + } +} + +fn prove_auth_transfer_in_ppe() -> anyhow::Result<(PrivacyPreservingCircuitOutput, Proof)> { + let program = Program::new(AUTH_TRANSFER_ELF.to_vec())?; + let pwd = ProgramWithDependencies::from(program); + + // For PPE to allow the sender's balance to be decremented by this + // program, the sender must already be claimed by auth_transfer. + // Recipient stays default-owned so the first call can claim it. + let sender = AccountWithMetadata { + account: Account { + program_owner: AUTH_TRANSFER_ID, + balance: 1_000_000, + ..Account::default() + }, + is_authorized: true, + account_id: AccountId::new([1; 32]), + }; + let recipient = AccountWithMetadata { + account: Account::default(), + is_authorized: true, + account_id: AccountId::new([2; 32]), + }; + let pre_states = vec![sender, recipient]; + + let balance_to_move: u128 = 5_000; + let instruction_data = to_vec(&balance_to_move)?; + + let account_identities = vec![InputAccountIdentity::Public; pre_states.len()]; + + Ok(execute_and_prove( + pre_states, + instruction_data, + account_identities, + &pwd, + )?) +} + +pub fn run_chain_caller(depth: u32) -> PpeBenchResult { + let label = format!("chain_caller depth={depth}"); + let started = Instant::now(); + match prove_chain_caller(depth) { + Ok((_out, proof)) => { + let prove_ms = started.elapsed().as_secs_f64() * 1_000.0; + PpeBenchResult { + label, + chain_depth: depth as usize, + prove_wall_ms: Some(prove_ms), + proof_bytes: Some(proof.into_inner().len()), + error: None, + } + } + Err(err) => PpeBenchResult { + label, + chain_depth: depth as usize, + prove_wall_ms: None, + proof_bytes: None, + error: Some(err.to_string()), + }, + } +} + +fn prove_chain_caller( + num_chain_calls: u32, +) -> anyhow::Result<(PrivacyPreservingCircuitOutput, Proof)> { + let chain_caller = Program::new(CHAIN_CALLER_ELF.to_vec())?; + let auth_transfer = Program::new(AUTH_TRANSFER_ELF.to_vec())?; + let mut deps = HashMap::new(); + deps.insert(AUTH_TRANSFER_ID, auth_transfer); + let pwd = ProgramWithDependencies::new(chain_caller, deps); + + // Both accounts pre-claimed by auth_transfer. chain_caller doesn't + // track recipient's post-claim program_owner, so a default recipient + // would cause a state mismatch on subsequent chained calls. + let recipient_pre = AccountWithMetadata { + account: Account { + program_owner: AUTH_TRANSFER_ID, + ..Account::default() + }, + is_authorized: true, + account_id: AccountId::new([2; 32]), + }; + let sender_pre = AccountWithMetadata { + account: Account { + program_owner: AUTH_TRANSFER_ID, + balance: 1_000_000, + ..Account::default() + }, + is_authorized: true, + account_id: AccountId::new([1; 32]), + }; + // chain_caller expects pre_states = [recipient, sender]. + let pre_states = vec![recipient_pre, sender_pre]; + + let balance: u128 = 1; + let pda_seed: Option = None; + let instruction = (balance, AUTH_TRANSFER_ID, num_chain_calls, pda_seed); + let instruction_data = to_vec(&instruction)?; + + let account_identities = vec![InputAccountIdentity::Public; pre_states.len()]; + + Ok(execute_and_prove( + pre_states, + instruction_data, + account_identities, + &pwd, + )?) +} + +pub fn run_verify(iters: usize) -> anyhow::Result { + eprintln!("verify: generating PPE receipt for auth_transfer Transfer (~1 prove)"); + let (output, proof) = prove_auth_transfer_in_ppe()?; + let journal = output.to_bytes(); + let journal_bytes = journal.len(); + let proof_bytes_vec = proof.into_inner(); + let proof_bytes = proof_bytes_vec.len(); + + let inner: InnerReceipt = borsh::from_slice(&proof_bytes_vec) + .map_err(|e| anyhow::anyhow!("InnerReceipt deserialize: {e}"))?; + let receipt = Receipt::new(inner, journal); + + // Sanity-check before the timing loop so we don't measure 1000 failures. + receipt + .verify(PRIVACY_PRESERVING_CIRCUIT_ID) + .map_err(|e| anyhow::anyhow!("verify sanity check failed: {e}"))?; + + eprintln!("verify: timing {iters} iters of receipt.verify(...)"); + let mut samples = Vec::with_capacity(iters); + for _ in 0..iters { + let started = Instant::now(); + receipt + .verify(PRIVACY_PRESERVING_CIRCUIT_ID) + .map_err(|e| anyhow::anyhow!("verify failed mid-loop: {e}"))?; + samples.push(started.elapsed().as_secs_f64() * 1_000.0); + } + let stats = Stats::from_samples(&samples); + + Ok(VerifyBenchResult { + label: "auth_transfer Transfer in PPE".to_owned(), + stats, + proof_bytes, + journal_bytes, + }) +} From b84a3e8b44f8bf025cf0cb3001746a86aa0dd260 Mon Sep 17 00:00:00 2001 From: Moudy Date: Mon, 18 May 2026 16:37:11 +0200 Subject: [PATCH 17/33] docs(cycle_bench): document Stats fields and use Display instead of ::format() - Add /// doc comments on Stats {n, best_ms, mean_ms, stdev_ms} clarifying units, semantics, and Bessel's correction. - Replace pub fn format(&self) -> String with impl fmt::Display for Stats, idiomatic and lets println! use {} directly. - Update three call sites accordingly. --- tools/cycle_bench/src/main.rs | 8 ++------ tools/cycle_bench/src/ppe.rs | 2 +- tools/cycle_bench/src/stats.rs | 16 +++++++++++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/tools/cycle_bench/src/main.rs b/tools/cycle_bench/src/main.rs index 6f254868..d002d566 100644 --- a/tools/cycle_bench/src/main.rs +++ b/tools/cycle_bench/src/main.rs @@ -581,7 +581,7 @@ fn print_table(results: &[BenchResult], prove: bool) { let sw = 8_usize; let exec_w = results .iter() - .map(|r| r.exec_stats.format().len()) + .map(|r| r.exec_stats.to_string().len()) .max() .unwrap_or(0) .max("exec_ms (best / mean ± stdev)".len()); @@ -594,11 +594,7 @@ fn print_table(results: &[BenchResult], prove: bool) { for r in results { println!( "{:cw$} {:>sw$} {: String { - format!( +/// `best / mean ± stdev (n=N)` for table display. +impl fmt::Display for Stats { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, "{:.2} / {:.2} ± {:.2} (n={})", self.best_ms, self.mean_ms, self.stdev_ms, self.n, ) From 87170b93b04ccb93749e0c41749a9b2ed3a67232 Mon Sep 17 00:00:00 2001 From: Moudy Date: Mon, 18 May 2026 16:48:23 +0200 Subject: [PATCH 18/33] refactor(cycle_bench): collapse 9 inline run_case calls into Case struct + iterator - Introduce `struct Case` holding pre-serialized InstructionData, with new(...) -> Result constructor and fn run(self, prove, exec_iters) -> Result. - Replace 9 inline `run_case(...)?` push calls in main() with [Case::new(...)?, ...].into_iter().map(|c| c.run(prove, exec_iters)) .collect::>>()?. - Drop now-unused `needless_pass_by_value` and `too_many_arguments` from the crate-level #![expect] block. --- tools/cycle_bench/src/main.rs | 387 +++++++++++++++++----------------- 1 file changed, 196 insertions(+), 191 deletions(-) diff --git a/tools/cycle_bench/src/main.rs b/tools/cycle_bench/src/main.rs index d002d566..114af29f 100644 --- a/tools/cycle_bench/src/main.rs +++ b/tools/cycle_bench/src/main.rs @@ -13,13 +13,11 @@ clippy::cast_precision_loss, clippy::float_arithmetic, clippy::missing_const_for_fn, - clippy::needless_pass_by_value, clippy::non_ascii_literal, clippy::print_literal, clippy::print_stderr, clippy::print_stdout, clippy::ref_patterns, - clippy::too_many_arguments, reason = "Bench tool: matches test-style fixture code" )] @@ -101,90 +99,117 @@ struct BenchResult { prove_segments: Option, } -fn run_case( +struct Case { program: &'static str, instruction_label: &'static str, - elf: &[u8], + elf: &'static [u8], self_program_id: ProgramId, pre_states: Vec, - instruction: &I, - prove: bool, - exec_iters: usize, -) -> Result { - let caller_program_id: Option = None; - let instruction_words: InstructionData = risc0_zkvm::serde::to_vec(instruction)?; + instruction_words: InstructionData, +} - // One warmup pass discarded, then `exec_iters` samples. The executor has - // large per-call setup overhead (ELF parsing, env init); reporting both - // best-of-N and mean ± stdev shows whether jitter is significant. - let mut samples: Vec = Vec::with_capacity(exec_iters); - let mut last_info = None; - let total = exec_iters.saturating_add(1).max(2); - for iter in 0..total { - let mut env_builder = ExecutorEnv::builder(); - env_builder - .write(&self_program_id)? - .write(&caller_program_id)? - .write(&pre_states)? - .write(&instruction_words)?; - let env = env_builder.build()?; +impl Case { + fn new( + program: &'static str, + instruction_label: &'static str, + elf: &'static [u8], + self_program_id: ProgramId, + pre_states: Vec, + instruction: &I, + ) -> Result { + Ok(Self { + program, + instruction_label, + elf, + self_program_id, + pre_states, + instruction_words: risc0_zkvm::serde::to_vec(instruction)?, + }) + } - let started = Instant::now(); - let info = default_executor().execute(env, elf)?; - let elapsed_ms = started.elapsed().as_secs_f64() * 1_000.0; + fn run(self, prove: bool, exec_iters: usize) -> Result { + let Self { + program, + instruction_label, + elf, + self_program_id, + pre_states, + instruction_words, + } = self; + let caller_program_id: Option = None; - if iter > 0 { - samples.push(elapsed_ms); + // One warmup pass discarded, then `exec_iters` samples. The executor has + // large per-call setup overhead (ELF parsing, env init); reporting both + // best-of-N and mean ± stdev shows whether jitter is significant. + let mut samples: Vec = Vec::with_capacity(exec_iters); + let mut last_info = None; + let total = exec_iters.saturating_add(1).max(2); + for iter in 0..total { + let mut env_builder = ExecutorEnv::builder(); + env_builder + .write(&self_program_id)? + .write(&caller_program_id)? + .write(&pre_states)? + .write(&instruction_words)?; + let env = env_builder.build()?; + + let started = Instant::now(); + let info = default_executor().execute(env, elf)?; + let elapsed_ms = started.elapsed().as_secs_f64() * 1_000.0; + + if iter > 0 { + samples.push(elapsed_ms); + } + last_info = Some(info); } - last_info = Some(info); + let info = last_info.expect("at least one iteration"); + let exec_stats = Stats::from_samples(&samples); + + let mut prove_stats = None; + let mut prove_total_cycles = None; + let mut prove_user_cycles = None; + let mut prove_paging_cycles = None; + let mut prove_segments = None; + if prove { + let mut env_builder = ExecutorEnv::builder(); + env_builder + .write(&self_program_id)? + .write(&caller_program_id)? + .write(&pre_states)? + .write(&instruction_words)?; + let env = env_builder.build()?; + + let started = Instant::now(); + let prove_info = default_prover() + .prove(env, elf) + .map_err(|e| anyhow::anyhow!("prove failed: {e}"))?; + let prove_ms = started.elapsed().as_secs_f64() * 1_000.0; + prove_stats = Some(Stats::from_samples(&[prove_ms])); + prove_total_cycles = Some(prove_info.stats.total_cycles); + prove_user_cycles = Some(prove_info.stats.user_cycles); + prove_paging_cycles = Some(prove_info.stats.paging_cycles); + prove_segments = Some(prove_info.stats.segments); + eprintln!( + " prove({program}/{instruction_label}): {prove_ms:.1} ms ({:.1}s), total_cycles={}, segments={}", + prove_ms / 1_000.0, + prove_info.stats.total_cycles, + prove_info.stats.segments, + ); + } + + Ok(BenchResult { + program, + instruction: instruction_label, + user_cycles: info.cycles(), + segments: info.segments.len(), + exec_stats, + prove_stats, + prove_total_cycles, + prove_user_cycles, + prove_paging_cycles, + prove_segments, + }) } - let info = last_info.expect("at least one iteration"); - let exec_stats = Stats::from_samples(&samples); - - let mut prove_stats = None; - let mut prove_total_cycles = None; - let mut prove_user_cycles = None; - let mut prove_paging_cycles = None; - let mut prove_segments = None; - if prove { - let mut env_builder = ExecutorEnv::builder(); - env_builder - .write(&self_program_id)? - .write(&caller_program_id)? - .write(&pre_states)? - .write(&instruction_words)?; - let env = env_builder.build()?; - - let started = Instant::now(); - let prove_info = default_prover() - .prove(env, elf) - .map_err(|e| anyhow::anyhow!("prove failed: {e}"))?; - let prove_ms = started.elapsed().as_secs_f64() * 1_000.0; - prove_stats = Some(Stats::from_samples(&[prove_ms])); - prove_total_cycles = Some(prove_info.stats.total_cycles); - prove_user_cycles = Some(prove_info.stats.user_cycles); - prove_paging_cycles = Some(prove_info.stats.paging_cycles); - prove_segments = Some(prove_info.stats.segments); - eprintln!( - " prove({program}/{instruction_label}): {prove_ms:.1} ms ({:.1}s), total_cycles={}, segments={}", - prove_ms / 1_000.0, - prove_info.stats.total_cycles, - prove_info.stats.segments, - ); - } - - Ok(BenchResult { - program, - instruction: instruction_label, - user_cycles: info.cycles(), - segments: info.segments.len(), - exec_stats, - prove_stats, - prove_total_cycles, - prove_user_cycles, - prove_paging_cycles, - prove_segments, - }) } fn authenticated_transfer_init() -> Vec { @@ -397,121 +422,101 @@ fn main() -> Result<()> { eprintln!("cycle_bench: prove mode ON, this will be slow (~minutes per program)"); } - let mut results: Vec = Vec::new(); + let cases = [ + Case::new( + "authenticated_transfer", + "Transfer", + AUTHENTICATED_TRANSFER_ELF, + AUTHENTICATED_TRANSFER_ID, + authenticated_transfer_transfer(), + &5_000_u128, + )?, + Case::new( + "authenticated_transfer", + "Initialize", + AUTHENTICATED_TRANSFER_ELF, + AUTHENTICATED_TRANSFER_ID, + authenticated_transfer_init(), + &0_u128, + )?, + Case::new( + "token", + "Transfer", + TOKEN_ELF, + TOKEN_ID, + token_transfer_pre_states(), + &token_core::Instruction::Transfer { + amount_to_transfer: 5_000, + }, + )?, + Case::new( + "token", + "Mint", + TOKEN_ELF, + TOKEN_ID, + token_mint_pre_states(), + &token_core::Instruction::Mint { + amount_to_mint: 5_000, + }, + )?, + Case::new( + "token", + "Burn", + TOKEN_ELF, + TOKEN_ID, + token_burn_pre_states(), + &token_core::Instruction::Burn { + amount_to_burn: 500, + }, + )?, + Case::new( + "clock", + "Tick (block_id+1, no multiples)", + CLOCK_ELF, + CLOCK_ID, + clock_pre_states_tick_at(0), + &Timestamp::from(1_700_000_000_u64), + )?, + Case::new( + "amm", + "SwapExactInput", + AMM_ELF, + AMM_ID, + amm_swap_pre_states(), + &amm_core::Instruction::SwapExactInput { + swap_amount_in: 200, + min_amount_out: 1, + token_definition_id_in: amm_token_a_def_id(), + }, + )?, + Case::new( + "amm", + "AddLiquidity", + AMM_ELF, + AMM_ID, + amm_add_liquidity_pre_states(), + &amm_core::Instruction::AddLiquidity { + min_amount_liquidity: 1, + max_amount_to_add_token_a: 400, + max_amount_to_add_token_b: 200, + }, + )?, + Case::new( + "ata", + "Create", + ASSOCIATED_TOKEN_ACCOUNT_ELF, + ASSOCIATED_TOKEN_ACCOUNT_ID, + ata_create_pre_states(), + &ata_core::Instruction::Create { + ata_program_id: ASSOCIATED_TOKEN_ACCOUNT_ID, + }, + )?, + ]; - let transfer_amount: u128 = 5_000; - results.push(run_case( - "authenticated_transfer", - "Transfer", - AUTHENTICATED_TRANSFER_ELF, - AUTHENTICATED_TRANSFER_ID, - authenticated_transfer_transfer(), - &transfer_amount, - prove, - exec_iters, - )?); - let init_amount: u128 = 0; - results.push(run_case( - "authenticated_transfer", - "Initialize", - AUTHENTICATED_TRANSFER_ELF, - AUTHENTICATED_TRANSFER_ID, - authenticated_transfer_init(), - &init_amount, - prove, - exec_iters, - )?); - - results.push(run_case( - "token", - "Transfer", - TOKEN_ELF, - TOKEN_ID, - token_transfer_pre_states(), - &token_core::Instruction::Transfer { - amount_to_transfer: 5_000, - }, - prove, - exec_iters, - )?); - results.push(run_case( - "token", - "Mint", - TOKEN_ELF, - TOKEN_ID, - token_mint_pre_states(), - &token_core::Instruction::Mint { - amount_to_mint: 5_000, - }, - prove, - exec_iters, - )?); - results.push(run_case( - "token", - "Burn", - TOKEN_ELF, - TOKEN_ID, - token_burn_pre_states(), - &token_core::Instruction::Burn { - amount_to_burn: 500, - }, - prove, - exec_iters, - )?); - - let clock_timestamp = Timestamp::from(1_700_000_000_u64); - results.push(run_case( - "clock", - "Tick (block_id+1, no multiples)", - CLOCK_ELF, - CLOCK_ID, - clock_pre_states_tick_at(0), - &clock_timestamp, - prove, - exec_iters, - )?); - - results.push(run_case( - "amm", - "SwapExactInput", - AMM_ELF, - AMM_ID, - amm_swap_pre_states(), - &amm_core::Instruction::SwapExactInput { - swap_amount_in: 200, - min_amount_out: 1, - token_definition_id_in: amm_token_a_def_id(), - }, - prove, - exec_iters, - )?); - results.push(run_case( - "amm", - "AddLiquidity", - AMM_ELF, - AMM_ID, - amm_add_liquidity_pre_states(), - &amm_core::Instruction::AddLiquidity { - min_amount_liquidity: 1, - max_amount_to_add_token_a: 400, - max_amount_to_add_token_b: 200, - }, - prove, - exec_iters, - )?); - - results.push(run_case( - "ata", - "Create", - ASSOCIATED_TOKEN_ACCOUNT_ELF, - ASSOCIATED_TOKEN_ACCOUNT_ID, - ata_create_pre_states(), - &ata_core::Instruction::Create { - ata_program_id: ASSOCIATED_TOKEN_ACCOUNT_ID, - }, - prove, - exec_iters, - )?); + let results: Vec = cases + .into_iter() + .map(|c| c.run(prove, exec_iters)) + .collect::>>()?; print_table(&results, prove); From ba65b168dd3d96d3f3f009bc5e768f3de51273fb Mon Sep 17 00:00:00 2001 From: Moudy Date: Mon, 18 May 2026 17:13:07 +0200 Subject: [PATCH 19/33] rename(wallet_crypto_bench): rename to crypto_primitives_bench --- Cargo.lock | 12 ++++++++++++ Cargo.toml | 2 +- docs/benchmarks/README.md | 2 +- ...et_crypto_bench.md => crypto_primitives_bench.md} | 8 ++++---- .../Cargo.toml | 2 +- .../README.md | 8 ++++---- .../src/main.rs | 2 +- 7 files changed, 24 insertions(+), 12 deletions(-) rename docs/benchmarks/{wallet_crypto_bench.md => crypto_primitives_bench.md} (77%) rename tools/{wallet_crypto_bench => crypto_primitives_bench}/Cargo.toml (90%) rename tools/{wallet_crypto_bench => crypto_primitives_bench}/README.md (63%) rename tools/{wallet_crypto_bench => crypto_primitives_bench}/src/main.rs (99%) diff --git a/Cargo.lock b/Cargo.lock index 1c49d7e7..cfb08176 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1934,6 +1934,18 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "crypto_primitives_bench" +version = "0.1.0" +dependencies = [ + "anyhow", + "key_protocol", + "nssa_core", + "rand 0.8.5", + "serde", + "serde_json", +] + [[package]] name = "ctr" version = "0.9.2" diff --git a/Cargo.toml b/Cargo.toml index f41a41df..aa8eaba4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,7 @@ members = [ "examples/program_deployment/methods/guest", "testnet_initial_state", "indexer/ffi", - "tools/wallet_crypto_bench", + "tools/crypto_primitives_bench", ] [workspace.dependencies] diff --git a/docs/benchmarks/README.md b/docs/benchmarks/README.md index 65a57c80..9289d2bf 100644 --- a/docs/benchmarks/README.md +++ b/docs/benchmarks/README.md @@ -5,6 +5,6 @@ Bench tools live under `tools/` with READMEs for how to run each one. This direc | Bench | Doc | |---|---| | cycle_bench | [cycle_bench.md](cycle_bench.md) | -| wallet_crypto_bench | [wallet_crypto_bench.md](wallet_crypto_bench.md) | +| crypto_primitives_bench | [crypto_primitives_bench.md](crypto_primitives_bench.md) | All numbers are from a single M2 Pro dev box unless noted otherwise. diff --git a/docs/benchmarks/wallet_crypto_bench.md b/docs/benchmarks/crypto_primitives_bench.md similarity index 77% rename from docs/benchmarks/wallet_crypto_bench.md rename to docs/benchmarks/crypto_primitives_bench.md index a786f875..f25650af 100644 --- a/docs/benchmarks/wallet_crypto_bench.md +++ b/docs/benchmarks/crypto_primitives_bench.md @@ -1,6 +1,6 @@ -# wallet_crypto_bench +# crypto_primitives_bench -Wallet-side cryptographic primitives. Measures the per-call cost of key derivation, sender-side DH for note encryption, and Account note symmetric encrypt/decrypt. Standalone host binary, no live stack required. +Cryptographic primitives used by client/wallet code. Measures the per-call cost of key derivation, sender-side DH for note encryption, and Account note symmetric encrypt/decrypt. Standalone host binary, no live stack required. ## Machine @@ -33,10 +33,10 @@ Wallet-side cryptographic primitives. Measures the per-call cost of key derivati ## Reproduce ```sh -cargo run --release -p wallet_crypto_bench +cargo run --release -p crypto_primitives_bench ``` -JSON output: `target/wallet_crypto_bench.json`. +JSON output: `target/crypto_primitives_bench.json`. ## Caveats diff --git a/tools/wallet_crypto_bench/Cargo.toml b/tools/crypto_primitives_bench/Cargo.toml similarity index 90% rename from tools/wallet_crypto_bench/Cargo.toml rename to tools/crypto_primitives_bench/Cargo.toml index aa0e51b1..e6d1240c 100644 --- a/tools/wallet_crypto_bench/Cargo.toml +++ b/tools/crypto_primitives_bench/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "wallet_crypto_bench" +name = "crypto_primitives_bench" version = "0.1.0" edition = "2024" license = { workspace = true } diff --git a/tools/wallet_crypto_bench/README.md b/tools/crypto_primitives_bench/README.md similarity index 63% rename from tools/wallet_crypto_bench/README.md rename to tools/crypto_primitives_bench/README.md index 84a67bf1..f45174c4 100644 --- a/tools/wallet_crypto_bench/README.md +++ b/tools/crypto_primitives_bench/README.md @@ -1,11 +1,11 @@ -# wallet_crypto_bench +# crypto_primitives_bench -Wallet-side cryptographic microbenchmarks. Single host binary, no live sequencer or Bedrock needed. +Cryptographic primitive microbenchmarks used by client/wallet code. Single host binary, no live sequencer or Bedrock needed. ## Run ```sh -cargo run --release -p wallet_crypto_bench +cargo run --release -p crypto_primitives_bench ``` ## What you'll see @@ -17,4 +17,4 @@ Per-operation `best_us`, `mean_us`, and `stdev_us` over 100 iterations (plus 2 w - `SharedSecretKey::new (sender DH)` — secp256k1 ECDH per recipient. - `EncryptionScheme::encrypt` / `decrypt` — ChaCha20 over an Account note. -JSON output is written to `target/wallet_crypto_bench.json`. +JSON output is written to `target/crypto_primitives_bench.json`. diff --git a/tools/wallet_crypto_bench/src/main.rs b/tools/crypto_primitives_bench/src/main.rs similarity index 99% rename from tools/wallet_crypto_bench/src/main.rs rename to tools/crypto_primitives_bench/src/main.rs index df52aacf..ea727654 100644 --- a/tools/wallet_crypto_bench/src/main.rs +++ b/tools/crypto_primitives_bench/src/main.rs @@ -169,7 +169,7 @@ fn write_json(results: &[OpResult]) -> Result<()> { .canonicalize()?; let out_path = workspace_root .join("target") - .join("wallet_crypto_bench.json"); + .join("crypto_primitives_bench.json"); if let Some(parent) = out_path.parent() { std::fs::create_dir_all(parent)?; } From 8960df04d676becc6032584fdef7ed0bbb662ed7 Mon Sep 17 00:00:00 2001 From: Moudy Date: Mon, 18 May 2026 17:17:58 +0200 Subject: [PATCH 20/33] fix: fmt --- tools/cycle_bench/src/main.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/cycle_bench/src/main.rs b/tools/cycle_bench/src/main.rs index 114af29f..acdd9eff 100644 --- a/tools/cycle_bench/src/main.rs +++ b/tools/cycle_bench/src/main.rs @@ -43,9 +43,8 @@ use nssa_core::{ }; use risc0_zkvm::{ExecutorEnv, default_executor, default_prover}; use serde::Serialize; -use token_core::{TokenDefinition, TokenHolding}; - use stats::Stats; +use token_core::{TokenDefinition, TokenHolding}; mod ppe; mod stats; From dbe8ac61605ddd63e1fcd70ca76575d543a4206b Mon Sep 17 00:00:00 2001 From: Moudy Date: Mon, 18 May 2026 17:36:07 +0200 Subject: [PATCH 21/33] chore(crypto_primitives_bench): switch allow to expect, fix doc_markdown inline --- tools/crypto_primitives_bench/src/main.rs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/tools/crypto_primitives_bench/src/main.rs b/tools/crypto_primitives_bench/src/main.rs index ea727654..3fe71d92 100644 --- a/tools/crypto_primitives_bench/src/main.rs +++ b/tools/crypto_primitives_bench/src/main.rs @@ -1,23 +1,19 @@ -//! Wallet-side cryptographic microbenchmarks. +//! Cryptographic primitive microbenchmarks used by client/wallet code. //! //! Measures: -//! - KeyChain::new_os_random (mnemonic → SSK → NSK/VSK + public keys) -//! - KeyChain::new_mnemonic (same, but mnemonic exposed) -//! - SharedSecretKey::new (Diffie-Hellman shared key derivation, the per-recipient cost) -//! - EncryptionScheme::encrypt / decrypt (Account note encryption) +//! - `KeyChain::new_os_random` (mnemonic → SSK → NSK/VSK + public keys) +//! - `KeyChain::new_mnemonic` (same, but mnemonic exposed) +//! - `SharedSecretKey::new` (Diffie-Hellman shared key derivation, the per-recipient cost) +//! - `EncryptionScheme::encrypt` / `decrypt` (Account note encryption) //! //! Reports best-of-N wall time per operation. No live stack required. -#![allow( +#![expect( clippy::arithmetic_side_effects, clippy::as_conversions, clippy::cast_precision_loss, - clippy::doc_markdown, clippy::float_arithmetic, - clippy::print_stderr, clippy::print_stdout, - clippy::std_instead_of_alloc, - clippy::std_instead_of_core, reason = "Bench tool" )] From 34b6e346428c7426e7e87c95c03fd4883ce9137e Mon Sep 17 00:00:00 2001 From: Daniil Polyakov Date: Sat, 16 May 2026 00:10:20 +0300 Subject: [PATCH 22/33] docs(contributing): add CONTRIBUTING.md --- CONTRIBUTING.md | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..f948d321 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,73 @@ +# Contributing + +We're glad you're interested in contributing to Logos Execution Zone! + +This document describes the guidelines for contributing to the project. We will be updating it as we grow and we figure out what works best for us. + +If you have any questions, come say hi to our [Discord](https://discord.gg/tGJwgGrSPN)! + +## Commit and PR title format + +We use [Conventional Commits](https://www.conventionalcommits.org/). + +Use: +- `type(scope): description` +- `type(scope)!: description` for breaking changes + +Allowed `type` values: +- `feat` +- `fix` +- `chore` +- `docs` +- `test` +- `refactor` +- `perf` +- `build` +- `ci` +- `revert` + +Examples: +- `feat(nssa): add private PDA support` +- `fix(wallet): correct fee calculation` +- `feat(nssa)!: rename AccountId::from((prog, seed)) to AccountId::for_public_pda` + +Breaking changes: +- Mark with `!` in the title. +- Optionally add a `BREAKING CHANGE:` footer in the PR body with migration notes. + +`CHANGELOG.md` is generated from these markers on every `v*` tag via `git-cliff`, and GitHub Releases are created from the same content. + +Before merging PR consider squashing non-meaningful commits. E.g.: + +``` +- refactor(wallet): move user keys to a separate module +- revert(wallet): revert "refactor(wallet): move user keys to a separate module" +``` + +Could be squashed to an empty commit if they belong to the same PR. + +## Branch workflow + +When bringing your feature branch up to date, prefer rebasing on top of `main`. + +- Preferred: `git rebase main` +- Avoid: `git merge main` in feature branches + +This keeps commit history cleaner and makes reviews easier. + +## Useful commands + +We have [`Justfile`](./Justfile) which contains some useful utilities which may help you. + +To list all of them run the command: `just`. + +Any change to our core crates may invalidate our RISC0 [`artifacts`](./artifacts/), in that case you're required to run `just build-artifacts` to update them. + +## AI-assisted contributions + +AI tools are allowed for drafting code, docs, tests, and review suggestions. + +Requirements: +- A human author is fully responsible for all submitted code and text. +- The person opening the PR must review, verify, and be able to explain every change. +- Do not open PRs automatically via AI agents or bots. Automatic AI-created PRs are not allowed. From 20b9868acef7671bb0c2da34606804e0eede1b14 Mon Sep 17 00:00:00 2001 From: Moudy Date: Tue, 19 May 2026 00:36:31 +0200 Subject: [PATCH 23/33] feat: add e2e_bench tool for end-to-end scenario latency, block, and tx-byte measurements --- Cargo.lock | 27 ++ Cargo.toml | 2 + docs/benchmarks/README.md | 1 + docs/benchmarks/e2e_bench.md | 125 +++++++++ tools/e2e_bench/Cargo.toml | 33 +++ tools/e2e_bench/README.md | 33 +++ tools/e2e_bench/src/bedrock_handle.rs | 147 +++++++++++ tools/e2e_bench/src/bench_context.rs | 205 +++++++++++++++ tools/e2e_bench/src/harness.rs | 297 ++++++++++++++++++++++ tools/e2e_bench/src/main.rs | 229 +++++++++++++++++ tools/e2e_bench/src/scenarios/amm.rs | 200 +++++++++++++++ tools/e2e_bench/src/scenarios/fanout.rs | 90 +++++++ tools/e2e_bench/src/scenarios/mod.rs | 7 + tools/e2e_bench/src/scenarios/parallel.rs | 188 ++++++++++++++ tools/e2e_bench/src/scenarios/private.rs | 150 +++++++++++ tools/e2e_bench/src/scenarios/token.rs | 127 +++++++++ 16 files changed, 1861 insertions(+) create mode 100644 docs/benchmarks/e2e_bench.md create mode 100644 tools/e2e_bench/Cargo.toml create mode 100644 tools/e2e_bench/README.md create mode 100644 tools/e2e_bench/src/bedrock_handle.rs create mode 100644 tools/e2e_bench/src/bench_context.rs create mode 100644 tools/e2e_bench/src/harness.rs create mode 100644 tools/e2e_bench/src/main.rs create mode 100644 tools/e2e_bench/src/scenarios/amm.rs create mode 100644 tools/e2e_bench/src/scenarios/fanout.rs create mode 100644 tools/e2e_bench/src/scenarios/mod.rs create mode 100644 tools/e2e_bench/src/scenarios/parallel.rs create mode 100644 tools/e2e_bench/src/scenarios/private.rs create mode 100644 tools/e2e_bench/src/scenarios/token.rs diff --git a/Cargo.lock b/Cargo.lock index 57135709..96afcef6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2378,6 +2378,33 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +[[package]] +name = "e2e_bench" +version = "0.1.0" +dependencies = [ + "amm_core", + "anyhow", + "borsh", + "chrono", + "clap", + "common", + "indexer_service", + "indexer_service_rpc", + "integration_tests", + "jsonrpsee", + "log", + "nssa", + "nssa_core", + "sequencer_service", + "sequencer_service_rpc", + "serde", + "serde_json", + "tempfile", + "token_core", + "tokio", + "wallet", +] + [[package]] name = "ecdsa" version = "0.16.9" diff --git a/Cargo.toml b/Cargo.toml index 27f3564b..d75e26c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,7 @@ members = [ "indexer/ffi", "tools/cycle_bench", "tools/crypto_primitives_bench", + "tools/e2e_bench", ] [workspace.dependencies] @@ -75,6 +76,7 @@ faucet_core = { path = "programs/faucet/core" } vault_core = { path = "programs/vault/core" } test_program_methods = { path = "test_program_methods" } testnet_initial_state = { path = "testnet_initial_state" } +integration_tests = { path = "integration_tests" } tokio = { version = "1.50", features = [ "net", diff --git a/docs/benchmarks/README.md b/docs/benchmarks/README.md index 9289d2bf..db539966 100644 --- a/docs/benchmarks/README.md +++ b/docs/benchmarks/README.md @@ -6,5 +6,6 @@ Bench tools live under `tools/` with READMEs for how to run each one. This direc |---|---| | cycle_bench | [cycle_bench.md](cycle_bench.md) | | crypto_primitives_bench | [crypto_primitives_bench.md](crypto_primitives_bench.md) | +| e2e_bench | [e2e_bench.md](e2e_bench.md) | All numbers are from a single M2 Pro dev box unless noted otherwise. diff --git a/docs/benchmarks/e2e_bench.md b/docs/benchmarks/e2e_bench.md new file mode 100644 index 00000000..2f2a0a7a --- /dev/null +++ b/docs/benchmarks/e2e_bench.md @@ -0,0 +1,125 @@ +# e2e_bench + +End-to-end LEZ scenarios driven through the wallet against an in-process sequencer + indexer wired to an external Bedrock node. Times each step and records borsh sizes per block, split by tx variant. + +## Machine + +| Field | Value | +|---|---| +| Chip | Apple M2 Pro (8P+4E) | +| RAM | 16 GB | +| OS | macOS 15.5 | +| Rust | 1.94.0 | +| Risc0 zkVM | 3.0.5 | +| Profile | release | + +## Scenarios + +| Scenario | Description | +|---|---| +| token | Sequential public token Send + one shielded recipient setup. | +| amm | Pool create, add liquidity, swap, remove liquidity. All public. | +| fanout | One sender → N recipients, sequential. All public. | +| private | Shielded, deshielded, private→private chained private flow. | +| parallel | N senders submit concurrently into one block. All public. | + +## Dev-mode vs real-proving + +`RISC0_DEV_MODE=1` makes the prover emit stub receipts instead of running the recursive STARK pipeline. The table compares each quantity in **dev mode vs real proving** for the two classes of scenarios: + +| Quantity | Public-only scenarios (dev → real) | PPE-bearing scenarios (dev → real) | +|---|---|---| +| Wall time per step | same in both modes | real adds ~100 s per PPE step | +| `public_tx_bytes` | same in both modes | same in both modes | +| `ppe_tx_bytes` | n/a | dev ≈ 2 KB stub → real ≈ 225 KB (matches `S_agg` from cycle_bench) | +| `block_bytes` | same in both modes | real adds ~225 KB per PPE tx in the block | +| `bedrock_finality_ms` | same in both modes | same in both modes (L1 cadence, not LEZ prover) | +| Blocks captured | similar in both modes | real captures more empty clock-only ticks that fill prove wall-time | + +Tables below report dev-mode for all five scenarios. Real-proving numbers are included for `amm_swap_flow` (representative all-public) and `private_chained_flow` (representative chained-private flow); the public-only scenarios converge between modes within run-to-run jitter, so a full real-proving sweep is not run here. + +## Step latencies — dev mode (`RISC0_DEV_MODE=1`) + +Per-scenario wall time and Bedrock L1-finality latency for the closing tip. + +| Scenario | total_ms | total_s | bedrock_finality_ms | bedrock_finality_s | +|---|---:|---:|---:|---:| +| token_onboarding | 60,808 | 60.81 | 24,593 | 24.59 | +| amm_swap_flow | 162,058 | 162.06 | 19,210 | 19.21 | +| multi_recipient_fanout | 222,206 | 222.21 | 16,020 | 16.02 | +| private_chained_flow | 80,700 | 80.70 | 23,963 | 23.96 | +| parallel_fanout | 244,387 | 244.39 | 23,770 | 23.77 | + +Total dev-mode wall time across all five: 912.9 s. + +## Step latencies — real proving (selected scenarios) + +| Scenario | total_ms | total_s | bedrock_finality_ms | bedrock_finality_s | Δ vs dev | +|---|---:|---:|---:|---:|---:| +| amm_swap_flow | 162,437 | 162.44 | ~19,210 | ~19.21 | ~0 (all-public) | +| private_chained_flow | 354,843 | 354.84 | 23,778 | 23.78 | +274.14 s (≈ 91 s per PPE step × 3) | + +Per-step breakdown for `private_chained_flow` in real proving: + +| Step | submit_ms | inclusion_ms | total_ms | total_s | +|---|---:|---:|---:|---:| +| token_new_fungible (public) | 1.1 | 20,276.0 | 20,291.2 | 20.29 | +| shielded_transfer (PPE) | 111,683.3 | 1.0 | 111,730.4 | 111.73 | +| deshielded_transfer (PPE) | 111,454.7 | 1.1 | 111,511.2 | 111.51 | +| private_to_private (PPE) | 111,237.0 | 1.1 | 111,293.0 | 111.29 | + +PPE steps move the cost from `inclusion_ms` (waiting for the next sealed block) to `submit_ms` (the wallet itself proving the PPE circuit before sending). Each PPE prove is ≈ 111 s on this CPU. + +## Block + tx sizes (borsh) — dev mode + +Per scenario, every produced block is fetched via `getBlock(BlockId)` and serialized with `borsh::to_vec(&Block)`. Each transaction is serialized individually and counted by variant. The empty clock-only ticks at `min` give the per-block fixed-cost baseline (≈ 334 bytes across all scenarios). + +| Scenario | blocks | block_bytes (mean) | block_bytes (min..max) | public_tx (mean / n) | ppe_tx (mean / n) | +|---|---:|---:|---|---:|---:| +| token_onboarding | 6 | 881 | 334..2,890 | 206 / 8 | 2,556 / 1 | +| amm_swap_flow | 16 | 553 | 334..1,011 | 248 / 24 | n/a | +| multi_recipient_fanout | 22 | 513 | 334..707 | 221 / 33 | n/a | +| private_chained_flow | 8 | 1,399 | 334..3,565 | 177 / 9 | 2,715 / 3 | +| parallel_fanout | 24 | 646 | 334..3,904 | 248 / 45 | n/a | + +## Block + tx sizes (borsh) — real proving + +| Scenario | blocks | block_bytes (mean) | block_bytes (min..max) | public_tx (mean / n) | ppe_tx (mean / n) | +|---|---:|---:|---|---:|---:| +| amm_swap_flow | 16 | 553 | 334..1,011 | 248 / 24 | n/a | +| private_chained_flow | 35 | 19,692 | 334..226,578 | 159 / 36 | 225,728 / 3 | + +`amm_swap_flow` is byte-identical between dev and real (no proof payload). `private_chained_flow`'s `ppe_tx_bytes` matches the cycle_bench `S_agg` measurement (≈ 225 KB borsh InnerReceipt). The `block_bytes` max (226,578) is the block containing the largest PPE transaction. + +## Findings + +- Public-only scenarios converge between dev mode and real proving in both latency and byte counts. Either mode is suitable to characterize them. +- PPE transactions are ≈ 225 KB on the wire in real proving, dominated by the outer succinct proof. Dev mode emits a ≈ 2 KB stub that does not represent the L1 payload — fee-model storage gas inputs must come from a real-proving run. +- Per-PPE-step prove cost on M2 Pro CPU is ≈ 110-120 s, paid on the wallet side at submit time (not on the sequencer). For a single-program chained flow the cost stacks linearly. +- Empty clock-only ticks set the per-block fixed-cost baseline at ≈ 334 bytes across all scenarios and both modes. +- Bedrock L1 finality stays around 20 s regardless of proving mode, because finality is paced by L1 cadence, not the LEZ prover. + +## Reproduce + +```sh +export LEZ_BEDROCK_BIN=/path/to/logos-blockchain/target/release/logos-blockchain-node +export LEZ_BEDROCK_CONFIG_DIR=/path/to/bedrock/configs + +# Dev-mode sweep (fast, ~16 min for all five scenarios) +RISC0_DEV_MODE=1 cargo run --release -p e2e_bench -- --scenario all + +# Real-proving for representative private flow (~6 min on M2 Pro CPU) +cargo run --release -p e2e_bench -- --scenario private + +# Real-proving for representative public flow (~3 min) +cargo run --release -p e2e_bench -- --scenario amm +``` + +JSON output: `target/e2e_bench_dev.json` / `target/e2e_bench_prove.json` (suffix toggled by `RISC0_DEV_MODE`). + +## Caveats + +- Dev-mode `ppe_tx_bytes` and PPE-step latencies are not representative of production; use real-proving numbers for any fee-model input that touches the storage or prover-cost components. +- Single-host run, no GPU acceleration. Real-proving on production prover hardware will move per-step latencies by orders of magnitude; byte counts will not change. +- Bedrock running locally; no real network latency between sequencer and Bedrock. +- Some scenarios share account state via the same wallet; this is intentional (mirrors `integration_tests::TestContext`) and not a realistic multi-wallet workload. diff --git a/tools/e2e_bench/Cargo.toml b/tools/e2e_bench/Cargo.toml new file mode 100644 index 00000000..e3d7fd7a --- /dev/null +++ b/tools/e2e_bench/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "e2e_bench" +version = "0.1.0" +edition = "2024" +license = { workspace = true } +publish = false + +[lints] +workspace = true + +[dependencies] +integration_tests.workspace = true +wallet.workspace = true +nssa.workspace = true +nssa_core = { workspace = true, features = ["host"] } +sequencer_service.workspace = true +sequencer_service_rpc = { workspace = true, features = ["client"] } +indexer_service.workspace = true +indexer_service_rpc = { workspace = true, features = ["client"] } +jsonrpsee = { workspace = true, features = ["ws-client"] } +token_core.workspace = true +amm_core.workspace = true +common.workspace = true +tempfile.workspace = true +borsh.workspace = true +chrono.workspace = true + +anyhow.workspace = true +tokio = { workspace = true, features = ["macros", "rt-multi-thread", "time"] } +clap.workspace = true +serde.workspace = true +serde_json.workspace = true +log.workspace = true diff --git a/tools/e2e_bench/README.md b/tools/e2e_bench/README.md new file mode 100644 index 00000000..37d6b175 --- /dev/null +++ b/tools/e2e_bench/README.md @@ -0,0 +1,33 @@ +# e2e_bench + +End-to-end LEZ scenarios driven through the wallet against an in-process sequencer + indexer wired to an external Bedrock node. Times each step (submit, inclusion, wallet sync) and records borsh sizes for every block produced, split into per-tx-variant counts. + +## Run + +Required env vars (no defaults): + +```sh +export LEZ_BEDROCK_BIN=/path/to/logos-blockchain/target/release/logos-blockchain-node +export LEZ_BEDROCK_CONFIG_DIR=/path/to/bedrock/configs +# optional: LEZ_BEDROCK_PORT (default 18080) +``` + +The config dir must contain `node-config.yaml` and a `deployment-settings.yaml` template with the literal string `PLACEHOLDER_CHAIN_START_TIME` (rewritten per launch). + +```sh +# All scenarios, dev-mode proving (fast) +RISC0_DEV_MODE=1 cargo run --release -p e2e_bench -- --scenario all + +# One scenario, real proving (slow) +cargo run --release -p e2e_bench -- --scenario amm +``` + +Scenarios: `token`, `amm`, `fanout`, `private`, `parallel`, `all`. + +## What you'll see + +Per scenario: a step table (`submit_ms`, `inclusion_ms`, `sync_ms`, `total_ms`) and a size summary covering every block captured during the scenario (block_bytes total/mean/min/max; per-tx-variant sizes for public, PPE, and program-deployment transactions). + +The fanout, parallel, and private scenarios are the most representative for L1-payload-size measurements since they put multiple txs per block. + +JSON output is written to `target/e2e_bench.json`. diff --git a/tools/e2e_bench/src/bedrock_handle.rs b/tools/e2e_bench/src/bedrock_handle.rs new file mode 100644 index 00000000..ef59d8ad --- /dev/null +++ b/tools/e2e_bench/src/bedrock_handle.rs @@ -0,0 +1,147 @@ +//! Manages an external `logos-blockchain-node` process as a child of the bench. +//! Launches a fresh Bedrock instance per scenario so the indexer never has to +//! catch up a large finalization backlog. +//! +//! Required env vars (no defaults — path layouts differ per developer): +//! - `LEZ_BEDROCK_BIN` — absolute path to the `logos-blockchain-node` binary. +//! - `LEZ_BEDROCK_CONFIG_DIR` — directory containing `node-config.yaml` and +//! `deployment-settings.yaml` (template with `PLACEHOLDER_CHAIN_START_TIME`). +//! +//! Optional: +//! - `LEZ_BEDROCK_PORT` (default: 18080) + +use std::{ + env, + net::SocketAddr, + path::PathBuf, + process::{Child, Command, Stdio}, + time::{Duration, Instant}, +}; + +use anyhow::{Context as _, Result, bail}; + +pub struct BedrockHandle { + child: Option, + addr: SocketAddr, + workdir: PathBuf, +} + +impl BedrockHandle { + /// Launch a fresh Bedrock node. Cleans `state/` in the working dir, rewrites + /// `deployment-settings.yaml` with the current UTC `chain_start_time`, spawns + /// the binary, and polls the HTTP port until ready. + pub async fn launch_fresh() -> Result { + let bin = env::var("LEZ_BEDROCK_BIN").map_err(|err| { + anyhow::anyhow!( + "LEZ_BEDROCK_BIN is required ({err}). Set it to the absolute path of the \ + logos-blockchain-node binary (e.g. \ + `export LEZ_BEDROCK_BIN=/path/to/logos-blockchain/target/release/logos-blockchain-node`)." + ) + })?; + let config_dir = env::var("LEZ_BEDROCK_CONFIG_DIR").map_err(|err| { + anyhow::anyhow!( + "LEZ_BEDROCK_CONFIG_DIR is required ({err}). Set it to the directory containing \ + node-config.yaml and deployment-settings.yaml \ + (see tools/e2e_bench/README.md for the expected layout)." + ) + })?; + let port: u16 = env::var("LEZ_BEDROCK_PORT") + .ok() + .and_then(|p| p.parse().ok()) + .unwrap_or(18080); + + let bin_path = PathBuf::from(&bin); + if !bin_path.is_file() { + bail!( + "LEZ_BEDROCK_BIN does not point at a file: {bin}. Build it via \ + `cargo build -p logos-blockchain-node --release` in logos-blockchain." + ); + } + let config_dir = PathBuf::from(config_dir); + let node_config = config_dir.join("node-config.yaml"); + let dep_template = config_dir.join("deployment-settings.yaml"); + if !node_config.is_file() || !dep_template.is_file() { + bail!( + "LEZ_BEDROCK_CONFIG_DIR is missing node-config.yaml or \ + deployment-settings.yaml at {}", + config_dir.display() + ); + } + + let workdir = tempfile::tempdir() + .context("create bedrock workdir")? + .keep(); + let dep_runtime = workdir.join("deployment-settings.yaml"); + let raw = std::fs::read_to_string(&dep_template).context("read deployment template")?; + let timestamp = chrono_now_utc_string(); + let filled = raw.replace("PLACEHOLDER_CHAIN_START_TIME", ×tamp); + std::fs::write(&dep_runtime, filled).context("write deployment-settings runtime")?; + + let log_path = workdir.join("bedrock.log"); + let log_file = std::fs::File::create(&log_path).context("create bedrock log")?; + let log_err = log_file.try_clone().context("clone bedrock log")?; + + eprintln!( + "BedrockHandle: launching {} (workdir {})", + bin, + workdir.display() + ); + let child = Command::new(&bin_path) + .current_dir(&workdir) + .arg("--deployment") + .arg(&dep_runtime) + .arg(&node_config) + .env("POL_PROOF_DEV_MODE", "true") + .stdout(Stdio::from(log_file)) + .stderr(Stdio::from(log_err)) + .spawn() + .context("spawn logos-blockchain-node")?; + + let addr = SocketAddr::from(([127, 0, 0, 1], port)); + wait_for_http(addr, Duration::from_secs(60)) + .await + .context("bedrock HTTP did not come up in 60s")?; + + eprintln!("BedrockHandle: stdout/stderr at {}", log_path.display()); + Ok(Self { + child: Some(child), + addr, + workdir, + }) + } + + pub const fn addr(&self) -> SocketAddr { + self.addr + } +} + +impl Drop for BedrockHandle { + fn drop(&mut self) { + if let Some(mut child) = self.child.take() { + eprintln!("BedrockHandle: stopping bedrock pid {}", child.id()); + let _ = child.kill(); + let _ = child.wait(); + } + let _ = std::fs::remove_dir_all(&self.workdir); + } +} + +async fn wait_for_http(addr: SocketAddr, timeout: Duration) -> Result<()> { + let deadline = Instant::now() + timeout; + while Instant::now() < deadline { + if tokio::net::TcpStream::connect(addr).await.is_ok() { + // TCP accepts; give Bedrock a moment to finish chain bootstrap. + tokio::time::sleep(Duration::from_secs(2)).await; + return Ok(()); + } + tokio::time::sleep(Duration::from_millis(250)).await; + } + bail!("Bedrock at {addr} did not accept TCP within {timeout:?}"); +} + +fn chrono_now_utc_string() -> String { + // Format: YYYY-MM-DD HH:MM:SS.000000 +00:00:00 (matches the deployment-settings template). + chrono::Utc::now() + .format("%Y-%m-%d %H:%M:%S%.6f +00:00:00") + .to_string() +} diff --git a/tools/e2e_bench/src/bench_context.rs b/tools/e2e_bench/src/bench_context.rs new file mode 100644 index 00000000..43376811 --- /dev/null +++ b/tools/e2e_bench/src/bench_context.rs @@ -0,0 +1,205 @@ +//! BenchContext: wires sequencer + indexer + wallet in-process against an +//! externally-running Bedrock node. Mirrors the surface of +//! `integration_tests::TestContext` for the methods the scenarios need +//! (`wallet_mut()`, `sequencer_client()`), but skips the docker setup. +//! +//! The external Bedrock URL defaults to 127.0.0.1:18080 and can be overridden +//! with the `LEZ_BEDROCK_ADDR` env var. + +use std::{env, net::SocketAddr, path::Path}; + +use anyhow::{Context as _, Result}; +use indexer_service::IndexerHandle; +use integration_tests::config::{ + SequencerPartialConfig, UrlProtocol, addr_to_url, default_private_accounts_for_wallet, + default_public_accounts_for_wallet, genesis_from_accounts, indexer_config, sequencer_config, + wallet_config, +}; +use sequencer_service::SequencerHandle; +use sequencer_service_rpc::{SequencerClient, SequencerClientBuilder}; +use serde::Serialize; +use tempfile::TempDir; +use wallet::{WalletCore, config::WalletConfigOverrides}; + +const DEFAULT_BEDROCK_ADDR: &str = "127.0.0.1:18080"; + +#[expect( + clippy::partial_pub_fields, + reason = "Internal TempDirs are kept alive via private fields for RAII; \ + client and wallet are public for scenarios to drive." +)] +pub struct BenchContext { + pub sequencer_client: SequencerClient, + pub wallet: WalletCore, + #[expect( + dead_code, + reason = "Retained for parity with TestContext; may be needed later." + )] + pub wallet_password: String, + sequencer_handle: Option, + indexer_handle: IndexerHandle, + temp_indexer_dir: TempDir, + temp_sequencer_dir: TempDir, + temp_wallet_dir: TempDir, +} + +impl BenchContext { + pub async fn new() -> Result { + let bedrock_addr_str = + env::var("LEZ_BEDROCK_ADDR").unwrap_or_else(|_| DEFAULT_BEDROCK_ADDR.to_owned()); + let bedrock_addr: SocketAddr = bedrock_addr_str + .parse() + .with_context(|| format!("invalid LEZ_BEDROCK_ADDR `{bedrock_addr_str}`"))?; + + eprintln!("BenchContext: using external bedrock at {bedrock_addr}"); + + let initial_public_accounts = default_public_accounts_for_wallet(); + let initial_private_accounts = default_private_accounts_for_wallet(); + let genesis_transactions = + genesis_from_accounts(&initial_public_accounts, &initial_private_accounts); + let sequencer_partial = SequencerPartialConfig::default(); + + let temp_indexer_dir = tempfile::tempdir().context("indexer temp dir")?; + let indexer_cfg = indexer_config(bedrock_addr, temp_indexer_dir.path().to_owned()) + .context("indexer config")?; + let indexer_handle = indexer_service::run_server(indexer_cfg, 0) + .await + .context("indexer run_server")?; + + let temp_sequencer_dir = tempfile::tempdir().context("sequencer temp dir")?; + let sequencer_cfg = sequencer_config( + sequencer_partial, + temp_sequencer_dir.path().to_owned(), + bedrock_addr, + genesis_transactions, + ) + .context("sequencer config")?; + let sequencer_handle = sequencer_service::run(sequencer_cfg, 0) + .await + .context("sequencer run")?; + + let temp_wallet_dir = tempfile::tempdir().context("wallet temp dir")?; + let mut wallet_cfg = wallet_config(sequencer_handle.addr()).context("wallet config")?; + // The default 30s poll interval is far too slow for a measurement run; + // shrink so the wallet sees new blocks within ~1s. + wallet_cfg.seq_poll_timeout = std::time::Duration::from_secs(1); + let wallet_cfg_str = + serde_json::to_string_pretty(&wallet_cfg).context("serialize wallet config")?; + let wallet_cfg_path = temp_wallet_dir.path().join("wallet_config.json"); + std::fs::write(&wallet_cfg_path, wallet_cfg_str).context("write wallet config")?; + let storage_path = temp_wallet_dir.path().join("storage.json"); + let password = "bench_pass".to_owned(); + let (mut wallet, _mnemonic) = WalletCore::new_init_storage( + wallet_cfg_path, + storage_path, + Some(WalletConfigOverrides::default()), + &password, + ) + .context("wallet init")?; + // Mirror integration_tests::setup_wallet: import the initial accounts + // produced above so the wallet can reference them by AccountId in scenarios. + for (private_key, _balance) in &initial_public_accounts { + wallet + .storage_mut() + .key_chain_mut() + .add_imported_public_account(private_key.clone()); + } + for private_account in &initial_private_accounts { + wallet + .storage_mut() + .key_chain_mut() + .add_imported_private_account( + private_account.key_chain.clone(), + None, + private_account.identifier, + nssa::Account::default(), + ); + } + wallet + .store_persistent_data() + .context("wallet store persistent")?; + + let sequencer_url = + addr_to_url(UrlProtocol::Http, sequencer_handle.addr()).context("sequencer url")?; + let sequencer_client = SequencerClientBuilder::default() + .build(sequencer_url) + .context("build sequencer client")?; + + Ok(Self { + sequencer_client, + wallet, + wallet_password: password, + sequencer_handle: Some(sequencer_handle), + indexer_handle, + temp_indexer_dir, + temp_sequencer_dir, + temp_wallet_dir, + }) + } + + pub const fn wallet_mut(&mut self) -> &mut WalletCore { + &mut self.wallet + } + + pub const fn sequencer_client(&self) -> &SequencerClient { + &self.sequencer_client + } + + pub fn indexer_addr(&self) -> SocketAddr { + self.indexer_handle.addr() + } + + /// Recursively-sized bytes on disk for sequencer + indexer + wallet tempdirs. + pub fn disk_sizes(&self) -> DiskSizes { + DiskSizes { + sequencer_bytes: dir_size_bytes(self.temp_sequencer_dir.path()), + indexer_bytes: dir_size_bytes(self.temp_indexer_dir.path()), + wallet_bytes: dir_size_bytes(self.temp_wallet_dir.path()), + } + } +} + +#[derive(Debug, Clone, Copy, Default, Serialize)] +#[expect( + clippy::struct_field_names, + reason = "The `_bytes` suffix carries the unit and is preserved verbatim in JSON output." +)] +pub struct DiskSizes { + pub sequencer_bytes: u64, + pub indexer_bytes: u64, + pub wallet_bytes: u64, +} + +fn dir_size_bytes(path: &Path) -> u64 { + let mut total = 0_u64; + let Ok(entries) = std::fs::read_dir(path) else { + return 0; + }; + for entry in entries.flatten() { + let Ok(metadata) = entry.metadata() else { + continue; + }; + if metadata.is_file() { + total = total.saturating_add(metadata.len()); + } else if metadata.is_dir() { + total = total.saturating_add(dir_size_bytes(&entry.path())); + } else { + // Sockets, FIFOs, block/char devices: ignore. Symlinks are + // already followed by `is_file()` / `is_dir()`. + } + } + total +} + +impl Drop for BenchContext { + fn drop(&mut self) { + if let Some(handle) = self.sequencer_handle.take() + && !handle.is_healthy() + { + eprintln!("BenchContext drop: sequencer handle was unhealthy"); + } + if !self.indexer_handle.is_healthy() { + eprintln!("BenchContext drop: indexer handle was unhealthy"); + } + } +} diff --git a/tools/e2e_bench/src/harness.rs b/tools/e2e_bench/src/harness.rs new file mode 100644 index 00000000..bcdff7a7 --- /dev/null +++ b/tools/e2e_bench/src/harness.rs @@ -0,0 +1,297 @@ +//! Step / scenario timing primitives shared across scenarios. + +use std::time::{Duration, Instant}; + +use anyhow::{Result, bail}; +use common::transaction::NSSATransaction; +use sequencer_service_rpc::RpcClient as _; +use serde::Serialize; +use wallet::cli::SubcommandReturnValue; + +use crate::bench_context::BenchContext; + +const TX_INCLUSION_POLL_INTERVAL: Duration = Duration::from_millis(250); +const TX_INCLUSION_TIMEOUT: Duration = Duration::from_secs(120); + +/// Borsh-serialized sizes for one zone block fetched after a step. `block_bytes` +/// is the full Block (header + body + bedrock metadata) and is the closest +/// proxy we have to the L1 payload posted per block. `tx_bytes` is each contained +/// transaction split by variant — this is what the fee model's S_tx slot covers. +#[derive(Debug, Serialize, Clone, Default)] +pub struct BlockSize { + pub block_id: u64, + pub block_bytes: usize, + pub public_tx_bytes: Vec, + pub ppe_tx_bytes: Vec, + pub deploy_tx_bytes: Vec, +} + +#[derive(Debug, Serialize, Clone)] +pub struct StepResult { + pub label: String, + pub submit_ms: f64, + pub inclusion_ms: Option, + pub wallet_sync_ms: Option, + pub total_ms: f64, + pub tx_hash: Option, + /// Borsh sizes for every zone block produced during this step. + /// Empty for steps that don't advance the chain (e.g. RegisterAccount). + pub blocks: Vec, +} + +#[derive(Debug, Serialize, Default)] +pub struct ScenarioResult { + pub name: String, + pub setup_ms: f64, + pub steps: Vec, + pub total_ms: f64, + /// Disk sizes (sequencer / indexer / wallet tempdirs) sampled at scenario start. + pub disk_before: Option, + /// Disk sizes sampled at scenario end. + pub disk_after: Option, + /// Bedrock-finality latency: time from final-step inclusion to the indexer + /// reporting the sequencer tip as L1-finalised. Effectively measures the + /// sequencer→Bedrock posting + Bedrock finalisation + indexer L1 ingest path. + /// A value at the timeout (60s) means finalisation did not happen within the bench window. + pub bedrock_finality_ms: Option, +} + +impl ScenarioResult { + pub fn new(name: impl Into) -> Self { + Self { + name: name.into(), + ..Default::default() + } + } + + pub fn push(&mut self, step: StepResult) { + self.total_ms += step.total_ms; + self.steps.push(step); + } +} + +/// Finish a timed wallet step. Records submit (the time between `started` +/// being captured and `ret` being received) and, if `ret` is a +/// [`SubcommandReturnValue::PrivacyPreservingTransfer`], polls the sequencer +/// for inclusion and records the inclusion latency. Returns a [`StepResult`]. +/// +/// Usage: +/// ```ignore +/// let started = Instant::now(); +/// let ret = wallet::cli::execute_subcommand(ctx.wallet_mut(), cmd).await?; +/// let step = finalize_step("label", started, ret, ctx).await?; +/// ``` +/// Begin a timed step. Capture this *before* submitting the wallet operation +/// so we can later subtract it from the post-submit block height to detect +/// when the chain has advanced past the tx's block. +pub async fn begin_step(ctx: &BenchContext) -> Result { + Ok(ctx.sequencer_client().get_last_block_id().await?) +} + +pub async fn finalize_step( + label: impl Into, + started: Instant, + pre_block_id: u64, + ret: &SubcommandReturnValue, + ctx: &mut BenchContext, +) -> Result { + let label = label.into(); + let submit_ms = started.elapsed().as_secs_f64() * 1_000.0; + + let mut tx_hash_str = None; + let mut inclusion_ms = None; + let mut wallet_sync_ms = None; + let mut blocks: Vec = Vec::new(); + + // For non-account-create steps (anything that produces a tx_hash, or even + // `Empty` for public Token Send), wait for the chain to advance past the + // submission block so state is applied before the next step. We use + // get_last_block_id as the canonical "block has been produced and + // recorded" signal. + let should_wait_for_chain = !matches!(ret, SubcommandReturnValue::RegisterAccount { .. }); + if should_wait_for_chain { + if let SubcommandReturnValue::PrivacyPreservingTransfer { tx_hash } = ret { + tx_hash_str = Some(format!("{tx_hash}")); + } + let started_inclusion = Instant::now(); + wait_for_chain_advance(ctx, pre_block_id, 2).await?; + inclusion_ms = Some(started_inclusion.elapsed().as_secs_f64() * 1_000.0); + + let started_sync = Instant::now(); + sync_wallet_to_tip(ctx).await?; + wallet_sync_ms = Some(started_sync.elapsed().as_secs_f64() * 1_000.0); + + // Capture block-byte and per-tx-byte sizes for every block produced + // during this step. We intentionally capture all blocks, including + // empty clock-only ticks: the empty-block baseline lets the fee model + // back out the per-tx contribution. + let tip = ctx.sequencer_client().get_last_block_id().await?; + for block_id in (pre_block_id.saturating_add(1))..=tip { + if let Some(block) = ctx.sequencer_client().get_block(block_id).await? { + let block_bytes = borsh::to_vec(&block).map_or(0, |v| v.len()); + let mut sz = BlockSize { + block_id, + block_bytes, + public_tx_bytes: Vec::new(), + ppe_tx_bytes: Vec::new(), + deploy_tx_bytes: Vec::new(), + }; + for tx in &block.body.transactions { + let n = borsh::to_vec(tx).map_or(0, |v| v.len()); + match tx { + NSSATransaction::Public(_) => sz.public_tx_bytes.push(n), + NSSATransaction::PrivacyPreserving(_) => sz.ppe_tx_bytes.push(n), + NSSATransaction::ProgramDeployment(_) => sz.deploy_tx_bytes.push(n), + } + } + blocks.push(sz); + } + } + } + + Ok(StepResult { + label, + submit_ms, + inclusion_ms, + wallet_sync_ms, + total_ms: started.elapsed().as_secs_f64() * 1_000.0, + tx_hash: tx_hash_str, + blocks, + }) +} + +/// Wait for `get_last_block_id` to advance by at least `min_blocks` from `from_block_id`. +pub async fn wait_for_chain_advance( + ctx: &BenchContext, + from_block_id: u64, + min_blocks: u64, +) -> Result<()> { + let target = from_block_id.saturating_add(min_blocks); + let deadline = Instant::now() + TX_INCLUSION_TIMEOUT; + loop { + match ctx.sequencer_client().get_last_block_id().await { + Ok(current) if current >= target => return Ok(()), + Ok(_) => {} + Err(err) => eprintln!("get_last_block_id error (continuing poll): {err:#}"), + } + if Instant::now() > deadline { + bail!( + "chain did not advance from {from_block_id} to at least {target} within {TX_INCLUSION_TIMEOUT:?}" + ); + } + tokio::time::sleep(TX_INCLUSION_POLL_INTERVAL).await; + } +} + +async fn sync_wallet_to_tip(ctx: &mut BenchContext) -> Result<()> { + let last_block = ctx.sequencer_client().get_last_block_id().await?; + ctx.wallet_mut().sync_to_block(last_block).await?; + Ok(()) +} + +pub fn print_table(result: &ScenarioResult) { + let label_width = result + .steps + .iter() + .map(|s| s.label.len()) + .max() + .unwrap_or(0) + .max("step".len()); + + println!( + "\nScenario: {} (setup {:.1} ms ({:.2}s), total {:.1} ms ({:.2}s))", + result.name, + result.setup_ms, + result.setup_ms / 1_000.0, + result.total_ms, + result.total_ms / 1_000.0, + ); + println!( + "{:10} {:>12} {:>10} {:>16}", + "step", + "submit_ms", + "inclusion_ms", + "sync_ms", + "total_ms (s)", + lw = label_width, + ); + println!("{}", "-".repeat(label_width + 62)); + for s in &result.steps { + let inclusion = s + .inclusion_ms + .map_or_else(|| "-".to_owned(), |v| format!("{v:.1}")); + let sync = s + .wallet_sync_ms + .map_or_else(|| "-".to_owned(), |v| format!("{v:.1}")); + let total = format!("{:.1} ({:.2}s)", s.total_ms, s.total_ms / 1_000.0); + println!( + "{:10.1} {:>12} {:>10} {:>16}", + s.label, + s.submit_ms, + inclusion, + sync, + total, + lw = label_width, + ); + } + + print_size_summary(result); +} + +/// Aggregate borsh sizes per scenario: total/mean/min/max block bytes, and +/// per-tx bytes split by variant. Empty if no blocks were captured. +fn print_size_summary(result: &ScenarioResult) { + let blocks: Vec<&BlockSize> = result.steps.iter().flat_map(|s| s.blocks.iter()).collect(); + if blocks.is_empty() { + return; + } + + let block_bytes: Vec = blocks.iter().map(|b| b.block_bytes).collect(); + let total_block_bytes: usize = block_bytes.iter().sum(); + let mean_block = mean_usize(&block_bytes); + let min_block = block_bytes.iter().copied().min().unwrap_or(0); + let max_block = block_bytes.iter().copied().max().unwrap_or(0); + + let public: Vec = blocks + .iter() + .flat_map(|b| b.public_tx_bytes.iter().copied()) + .collect(); + let ppe: Vec = blocks + .iter() + .flat_map(|b| b.ppe_tx_bytes.iter().copied()) + .collect(); + let deploy: Vec = blocks + .iter() + .flat_map(|b| b.deploy_tx_bytes.iter().copied()) + .collect(); + + println!( + "\nBlock + tx size summary ({} blocks captured):", + blocks.len() + ); + println!( + " block_bytes: total={total_block_bytes}, mean={mean_block}, min={min_block}, max={max_block}", + ); + print_tx_line("public_tx_bytes ", &public); + print_tx_line("ppe_tx_bytes ", &ppe); + print_tx_line("deploy_tx_bytes ", &deploy); +} + +fn print_tx_line(label: &str, samples: &[usize]) { + if samples.is_empty() { + println!(" {label}: (none)"); + return; + } + let total: usize = samples.iter().sum(); + let mean = mean_usize(samples); + let min = samples.iter().copied().min().unwrap_or(0); + let max = samples.iter().copied().max().unwrap_or(0); + println!( + " {label}: n={}, total={total}, mean={mean}, min={min}, max={max}", + samples.len() + ); +} + +fn mean_usize(xs: &[usize]) -> usize { + xs.iter().sum::().checked_div(xs.len()).unwrap_or(0) +} diff --git a/tools/e2e_bench/src/main.rs b/tools/e2e_bench/src/main.rs new file mode 100644 index 00000000..31ea1189 --- /dev/null +++ b/tools/e2e_bench/src/main.rs @@ -0,0 +1,229 @@ +//! End-to-end LEZ scenario bench. +//! +//! Spins up the full stack (native Bedrock node launched per-scenario via +//! `BedrockHandle` + in-process sequencer + indexer + wallet via +//! `BenchContext`) and drives the wallet through configurable scenarios that +//! mirror real user flows. Times each step and records borsh-serialized +//! block + tx sizes per scenario. +//! +//! Required env vars (no defaults; see `tools/e2e_bench/README.md`): +//! LEZ_BEDROCK_BIN absolute path to logos-blockchain-node. +//! LEZ_BEDROCK_CONFIG_DIR directory with node-config.yaml + deployment template. +//! +//! Run examples: +//! RISC0_DEV_MODE=1 cargo run --release -p e2e_bench -- --scenario all. +//! cargo run --release -p e2e_bench -- --scenario amm. +//! +//! `RISC0_DEV_MODE=1` skips proving and produces latency-only numbers in +//! ~minutes; omitting it produces realistic proving-inclusive numbers but +//! the run takes much longer. + +#![expect( + clippy::arbitrary_source_item_ordering, + clippy::arithmetic_side_effects, + clippy::as_conversions, + clippy::doc_markdown, + clippy::float_arithmetic, + clippy::let_underscore_must_use, + clippy::let_underscore_untyped, + clippy::missing_const_for_fn, + clippy::print_stderr, + clippy::print_stdout, + clippy::single_call_fn, + clippy::single_match_else, + clippy::std_instead_of_core, + clippy::too_many_lines, + clippy::wildcard_enum_match_arm, + reason = "Bench tool: matches test-style fixture code" +)] + +use std::{path::PathBuf, time::Duration}; + +use anyhow::{Context as _, Result}; +use bedrock_handle::BedrockHandle; +use bench_context::BenchContext; +use clap::{Parser, ValueEnum}; +use harness::ScenarioResult; +use serde::Serialize; + +mod bedrock_handle; +mod bench_context; +mod harness; +mod scenarios; + +#[derive(Copy, Clone, Debug, ValueEnum)] +enum ScenarioName { + Token, + Amm, + Fanout, + Private, + Parallel, + All, +} + +#[derive(Parser, Debug)] +#[command(about = "End-to-end LEZ scenario bench")] +struct Cli { + /// Which scenario(s) to run. + #[arg(long, value_enum, default_value_t = ScenarioName::All)] + scenario: ScenarioName, + + /// Optional JSON output path. Defaults to /target/e2e_bench.json. + #[arg(long)] + json_out: Option, +} + +#[derive(Debug, Serialize)] +struct BenchRunReport { + risc0_dev_mode: bool, + scenarios: Vec, + total_wall_seconds: f64, +} + +#[tokio::main(flavor = "multi_thread")] +async fn main() -> Result<()> { + // integration_tests initializes env_logger via a LazyLock, so we leave logger + // setup to it. Set RUST_LOG=info before running to see logs. + + let cli = Cli::parse(); + let risc0_dev_mode = std::env::var("RISC0_DEV_MODE").is_ok_and(|v| !v.is_empty() && v != "0"); + + eprintln!( + "e2e_bench: scenario={:?}, RISC0_DEV_MODE={}", + cli.scenario, + if risc0_dev_mode { "1" } else { "unset/0" } + ); + + let to_run: Vec = match cli.scenario { + ScenarioName::All => vec![ + ScenarioName::Token, + ScenarioName::Amm, + ScenarioName::Fanout, + ScenarioName::Private, + ScenarioName::Parallel, + ], + other => vec![other], + }; + + let overall_started = std::time::Instant::now(); + let mut all_results = Vec::with_capacity(to_run.len()); + + for name in to_run { + eprintln!("\n=== running scenario: {name:?} ==="); + let setup_started = std::time::Instant::now(); + // Spawn a fresh Bedrock node for this scenario. Each scenario therefore + // starts with an empty chain so the indexer never has a backlog from a + // prior scenario. + let bedrock = BedrockHandle::launch_fresh() + .await + .with_context(|| format!("failed to spawn Bedrock for scenario {name:?}"))?; + let bedrock_addr_string = format!("{}", bedrock.addr()); + // Safety: we restore the previous LEZ_BEDROCK_ADDR value (if any) at scenario teardown. + // SAFETY: this happens before any threaded setup that reads env. + unsafe { + std::env::set_var("LEZ_BEDROCK_ADDR", &bedrock_addr_string); + } + + let mut ctx = BenchContext::new() + .await + .with_context(|| format!("failed to setup BenchContext for scenario {name:?}"))?; + let setup_ms = elapsed_ms(setup_started); + eprintln!("setup: {setup_ms:.1} ms"); + + let disk_before = ctx.disk_sizes(); + let mut result = run_scenario(name, setup_ms, &mut ctx).await?; + result.disk_before = Some(disk_before); + result.disk_after = Some(ctx.disk_sizes()); + result.bedrock_finality_ms = Some(measure_bedrock_finality(&ctx).await?); + harness::print_table(&result); + all_results.push(result); + + drop(ctx); + drop(bedrock); + // Give Bedrock a moment to shut down before the next scenario. + tokio::time::sleep(Duration::from_secs(2)).await; + } + + let total_wall_seconds = overall_started.elapsed().as_secs_f64(); + eprintln!("\nTotal wall time: {total_wall_seconds:.1}s"); + + let report = BenchRunReport { + risc0_dev_mode, + scenarios: all_results, + total_wall_seconds, + }; + + let out_path = match cli.json_out { + Some(p) => p, + None => { + let workspace_root = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("..") + .join("..") + .canonicalize()?; + let suffix = if risc0_dev_mode { "dev" } else { "prove" }; + workspace_root + .join("target") + .join(format!("e2e_bench_{suffix}.json")) + } + }; + if let Some(parent) = out_path.parent() { + std::fs::create_dir_all(parent)?; + } + std::fs::write(&out_path, serde_json::to_string_pretty(&report)?)?; + eprintln!("\nJSON written to {}", out_path.display()); + + Ok(()) +} + +async fn run_scenario( + name: ScenarioName, + setup_ms: f64, + ctx: &mut BenchContext, +) -> Result { + let result = match name { + ScenarioName::Token => scenarios::token::run(ctx).await?, + ScenarioName::Amm => scenarios::amm::run(ctx).await?, + ScenarioName::Fanout => scenarios::fanout::run(ctx).await?, + ScenarioName::Private => scenarios::private::run(ctx).await?, + ScenarioName::Parallel => scenarios::parallel::run(ctx).await?, + ScenarioName::All => unreachable!("dispatched above"), + }; + Ok(ScenarioResult { setup_ms, ..result }) +} + +fn elapsed_ms(t: std::time::Instant) -> f64 { + t.elapsed().as_secs_f64() * 1_000.0 +} + +/// Poll the indexer's L1-finalised block id until it catches up with the +/// sequencer's last block id. This is effectively the sequencer→Bedrock posting +/// plus Bedrock finalisation plus indexer ingest latency. +async fn measure_bedrock_finality(ctx: &BenchContext) -> Result { + use indexer_service_rpc::RpcClient as _; + use jsonrpsee::ws_client::WsClientBuilder; + use sequencer_service_rpc::RpcClient as _; + + let indexer_url = format!("ws://{}", ctx.indexer_addr()); + let indexer_ws = WsClientBuilder::default() + .build(&indexer_url) + .await + .context("connect indexer WS")?; + let sequencer_tip = ctx.sequencer_client().get_last_block_id().await?; + + let started = std::time::Instant::now(); + let deadline = started + Duration::from_secs(60); + loop { + match indexer_ws.get_last_finalized_block_id().await { + Ok(Some(b)) if b >= sequencer_tip => { + return Ok(started.elapsed().as_secs_f64() * 1_000.0); + } + Ok(_) => {} + Err(err) => eprintln!("indexer last_synced poll error: {err:#}"), + } + if std::time::Instant::now() > deadline { + eprintln!("indexer did not catch up to {sequencer_tip} within 60s"); + return Ok(started.elapsed().as_secs_f64() * 1_000.0); + } + tokio::time::sleep(Duration::from_millis(200)).await; + } +} diff --git a/tools/e2e_bench/src/scenarios/amm.rs b/tools/e2e_bench/src/scenarios/amm.rs new file mode 100644 index 00000000..b92bd823 --- /dev/null +++ b/tools/e2e_bench/src/scenarios/amm.rs @@ -0,0 +1,200 @@ +//! AMM swap flow: setup two tokens, create pool, swap, add liquidity, remove liquidity. + +use std::time::Instant; + +use anyhow::{Result, bail}; +use integration_tests::public_mention; +use wallet::cli::{ + Command, SubcommandReturnValue, + account::{AccountSubcommand, NewSubcommand}, + programs::{amm::AmmProgramAgnosticSubcommand, token::TokenProgramAgnosticSubcommand}, +}; + +use crate::harness::{ScenarioResult, finalize_step}; + +pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { + let mut result = ScenarioResult::new("amm_swap_flow"); + + let def_a = new_public_account(ctx, &mut result, "create_acc_def_a").await?; + let supply_a = new_public_account(ctx, &mut result, "create_acc_supply_a").await?; + let user_a = new_public_account(ctx, &mut result, "create_acc_user_a").await?; + + let def_b = new_public_account(ctx, &mut result, "create_acc_def_b").await?; + let supply_b = new_public_account(ctx, &mut result, "create_acc_supply_b").await?; + let user_b = new_public_account(ctx, &mut result, "create_acc_user_b").await?; + + let user_lp = new_public_account(ctx, &mut result, "create_acc_user_lp").await?; + + timed_token_new(ctx, &mut result, "token_a_new", def_a, supply_a, "TokA").await?; + timed_token_send( + ctx, + &mut result, + "token_a_fund_user", + supply_a, + user_a, + 1_000, + ) + .await?; + + timed_token_new(ctx, &mut result, "token_b_new", def_b, supply_b, "TokB").await?; + timed_token_send( + ctx, + &mut result, + "token_b_fund_user", + supply_b, + user_b, + 1_000, + ) + .await?; + + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::AMM(AmmProgramAgnosticSubcommand::New { + user_holding_a: public_mention(user_a), + user_holding_b: public_mention(user_b), + user_holding_lp: public_mention(user_lp), + balance_a: 300, + balance_b: 300, + }), + ) + .await?; + let step = finalize_step("amm_new_pool", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::AMM(AmmProgramAgnosticSubcommand::SwapExactInput { + user_holding_a: public_mention(user_a), + user_holding_b: public_mention(user_b), + amount_in: 50, + min_amount_out: 1, + token_definition: def_a, + }), + ) + .await?; + let step = finalize_step("amm_swap_exact_input", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::AMM(AmmProgramAgnosticSubcommand::AddLiquidity { + user_holding_a: public_mention(user_a), + user_holding_b: public_mention(user_b), + user_holding_lp: public_mention(user_lp), + min_amount_lp: 1, + max_amount_a: 100, + max_amount_b: 100, + }), + ) + .await?; + let step = finalize_step("amm_add_liquidity", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::AMM(AmmProgramAgnosticSubcommand::RemoveLiquidity { + user_holding_a: public_mention(user_a), + user_holding_b: public_mention(user_b), + user_holding_lp: public_mention(user_lp), + balance_lp: 50, + min_amount_a: 1, + min_amount_b: 1, + }), + ) + .await?; + let step = finalize_step("amm_remove_liquidity", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + Ok(result) +} + +async fn new_public_account( + ctx: &mut crate::bench_context::BenchContext, + result: &mut ScenarioResult, + label: &str, +) -> Result { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + result.push(step); + match ret { + SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), + other => bail!("expected RegisterAccount, got {other:?}"), + } +} + +async fn timed_token_new( + ctx: &mut crate::bench_context::BenchContext, + result: &mut ScenarioResult, + label: &str, + def_id: nssa::AccountId, + supply_id: nssa::AccountId, + name: &str, +) -> Result<()> { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(def_id), + supply_account_id: public_mention(supply_id), + name: name.to_owned(), + total_supply: 10_000, + }), + ) + .await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + result.push(step); + Ok(()) +} + +async fn timed_token_send( + ctx: &mut crate::bench_context::BenchContext, + result: &mut ScenarioResult, + label: &str, + from_id: nssa::AccountId, + to_id: nssa::AccountId, + amount: u128, +) -> Result<()> { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(from_id), + to: Some(public_mention(to_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount, + }), + ) + .await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + result.push(step); + Ok(()) +} diff --git a/tools/e2e_bench/src/scenarios/fanout.rs b/tools/e2e_bench/src/scenarios/fanout.rs new file mode 100644 index 00000000..adede185 --- /dev/null +++ b/tools/e2e_bench/src/scenarios/fanout.rs @@ -0,0 +1,90 @@ +//! Multi-recipient fanout: one funded supply pays 10 distinct recipients. + +use std::time::Instant; + +use anyhow::{Result, bail}; +use integration_tests::public_mention; +use wallet::cli::{ + Command, SubcommandReturnValue, + account::{AccountSubcommand, NewSubcommand}, + programs::token::TokenProgramAgnosticSubcommand, +}; + +use crate::harness::{ScenarioResult, finalize_step}; + +const FANOUT_COUNT: usize = 10; +const AMOUNT_PER_TRANSFER: u128 = 100; + +pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { + let mut result = ScenarioResult::new("multi_recipient_fanout"); + + let def_id = new_public_account(ctx, &mut result, "create_acc_def").await?; + let supply_id = new_public_account(ctx, &mut result, "create_acc_supply").await?; + + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(def_id), + supply_account_id: public_mention(supply_id), + name: "FanoutToken".to_owned(), + total_supply: 10_000_000, + }), + ) + .await?; + let step = finalize_step("token_new_fungible", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + let mut recipients = Vec::with_capacity(FANOUT_COUNT); + for i in 0..FANOUT_COUNT { + let id = new_public_account(ctx, &mut result, &format!("create_recipient_{i:02}")).await?; + recipients.push(id); + } + + for (i, recipient_id) in recipients.iter().enumerate() { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(supply_id), + to: Some(public_mention(*recipient_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: AMOUNT_PER_TRANSFER, + }), + ) + .await?; + let step = finalize_step(format!("transfer_{i:02}"), started, pre_block, &ret, ctx).await?; + result.push(step); + } + + Ok(result) +} + +async fn new_public_account( + ctx: &mut crate::bench_context::BenchContext, + result: &mut ScenarioResult, + label: &str, +) -> Result { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + result.push(step); + match ret { + SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), + other => bail!("expected RegisterAccount, got {other:?}"), + } +} diff --git a/tools/e2e_bench/src/scenarios/mod.rs b/tools/e2e_bench/src/scenarios/mod.rs new file mode 100644 index 00000000..0536a250 --- /dev/null +++ b/tools/e2e_bench/src/scenarios/mod.rs @@ -0,0 +1,7 @@ +//! Scenarios driven by the e2e bench. + +pub mod amm; +pub mod fanout; +pub mod parallel; +pub mod private; +pub mod token; diff --git a/tools/e2e_bench/src/scenarios/parallel.rs b/tools/e2e_bench/src/scenarios/parallel.rs new file mode 100644 index 00000000..43bd25ac --- /dev/null +++ b/tools/e2e_bench/src/scenarios/parallel.rs @@ -0,0 +1,188 @@ +//! Parallel-fanout throughput scenario. N distinct senders each transfer one token +//! to one recipient. Submission is serialised through the single wallet but does +//! not wait for chain advance between submits, so all N txs land in the same +//! block (up to `max_num_tx_in_block`). Measures observed throughput. + +use std::time::Instant; + +use anyhow::{Result, bail}; +use common::transaction::NSSATransaction; +use integration_tests::public_mention; +use sequencer_service_rpc::RpcClient as _; +use wallet::cli::{ + Command, SubcommandReturnValue, + account::{AccountSubcommand, NewSubcommand}, + programs::token::TokenProgramAgnosticSubcommand, +}; + +use crate::{ + bench_context::BenchContext, + harness::{BlockSize, ScenarioResult, StepResult, finalize_step}, +}; + +const PARALLEL_FANOUT_N: usize = 10; +const AMOUNT_PER_TRANSFER: u128 = 100; + +pub async fn run(ctx: &mut BenchContext) -> Result { + let mut result = ScenarioResult::new("parallel_fanout"); + + // Setup: definition, master supply, N parallel supplies, N recipients. + let def_id = new_public_account(ctx, &mut result, "create_acc_def").await?; + let master_id = new_public_account(ctx, &mut result, "create_acc_master").await?; + + let mut senders = Vec::with_capacity(PARALLEL_FANOUT_N); + for i in 0..PARALLEL_FANOUT_N { + let id = new_public_account(ctx, &mut result, &format!("create_sender_{i:02}")).await?; + senders.push(id); + } + let mut recipients = Vec::with_capacity(PARALLEL_FANOUT_N); + for i in 0..PARALLEL_FANOUT_N { + let id = new_public_account(ctx, &mut result, &format!("create_recipient_{i:02}")).await?; + recipients.push(id); + } + + // Mint full supply into master. + let total_mint: u128 = (PARALLEL_FANOUT_N as u128) * AMOUNT_PER_TRANSFER * 10; + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(def_id), + supply_account_id: public_mention(master_id), + name: "ParToken".to_owned(), + total_supply: total_mint, + }), + ) + .await?; + let step = finalize_step("token_new_fungible", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + // Fund each sender from master. Serial; this is setup, not measured throughput. + for (i, sender_id) in senders.iter().enumerate() { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(master_id), + to: Some(public_mention(*sender_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: AMOUNT_PER_TRANSFER * 5, + }), + ) + .await?; + let step = + finalize_step(format!("fund_sender_{i:02}"), started, pre_block, &ret, ctx).await?; + result.push(step); + } + + // The measured phase: submit N transfers as fast as possible, do not wait + // for chain advance between submits. The sequencer batches whatever lands in + // its mempool before block_create_timeout. + let pre_block_burst = ctx.sequencer_client().get_last_block_id().await?; + let burst_started = Instant::now(); + + // Submit all N back-to-back. Wallet serialises through `wallet_mut()`, but + // each sender has its own nonce so there are no collisions. + for (sender_id, recipient_id) in senders.iter().zip(recipients.iter()) { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(*sender_id), + to: Some(public_mention(*recipient_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: AMOUNT_PER_TRANSFER, + }), + ) + .await?; + } + let all_submitted_at = Instant::now(); + let submit_duration_ms = (all_submitted_at - burst_started).as_secs_f64() * 1_000.0; + + // Wait for the chain to advance by at least 2 blocks past pre_block_burst. + // That guarantees the block holding our burst is sealed and applied. + crate::harness::wait_for_chain_advance(ctx, pre_block_burst, 2).await?; + let inclusion_done_at = Instant::now(); + let inclusion_after_submit_ms = (inclusion_done_at - all_submitted_at).as_secs_f64() * 1_000.0; + let burst_total_ms = (inclusion_done_at - burst_started).as_secs_f64() * 1_000.0; + + eprintln!( + "parallel_fanout: submitted {} txs in {:.1} ms, inclusion in {:.1} ms, total {:.1} ms", + senders.len(), + submit_duration_ms, + inclusion_after_submit_ms, + burst_total_ms, + ); + + // Capture every block produced during the burst window. This is the + // scenario where one block holds many txs, so block_bytes here is the + // most representative L1-payload-equivalent measurement we have. + let tip = ctx.sequencer_client().get_last_block_id().await?; + let mut blocks: Vec = Vec::new(); + for block_id in (pre_block_burst.saturating_add(1))..=tip { + if let Some(block) = ctx.sequencer_client().get_block(block_id).await? { + let block_bytes = borsh::to_vec(&block).map_or(0, |v| v.len()); + let mut sz = BlockSize { + block_id, + block_bytes, + public_tx_bytes: Vec::new(), + ppe_tx_bytes: Vec::new(), + deploy_tx_bytes: Vec::new(), + }; + for tx in &block.body.transactions { + let n = borsh::to_vec(tx).map_or(0, |v| v.len()); + match tx { + NSSATransaction::Public(_) => sz.public_tx_bytes.push(n), + NSSATransaction::PrivacyPreserving(_) => sz.ppe_tx_bytes.push(n), + NSSATransaction::ProgramDeployment(_) => sz.deploy_tx_bytes.push(n), + } + } + blocks.push(sz); + } + } + + // Synthesise a single summary "step" for the burst. Use the submit time + // for `submit_ms` and the inclusion-wait time for `inclusion_ms`. + let burst_step = StepResult { + label: format!("burst_{}_transfers", senders.len()), + submit_ms: submit_duration_ms, + inclusion_ms: Some(inclusion_after_submit_ms), + wallet_sync_ms: None, + total_ms: burst_total_ms, + tx_hash: None, + blocks, + }; + result.push(burst_step); + + Ok(result) +} + +async fn new_public_account( + ctx: &mut BenchContext, + result: &mut ScenarioResult, + label: &str, +) -> Result { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + result.push(step); + match ret { + SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), + other => bail!("expected RegisterAccount, got {other:?}"), + } +} diff --git a/tools/e2e_bench/src/scenarios/private.rs b/tools/e2e_bench/src/scenarios/private.rs new file mode 100644 index 00000000..2a154673 --- /dev/null +++ b/tools/e2e_bench/src/scenarios/private.rs @@ -0,0 +1,150 @@ +//! Private chained flow: shielded, deshielded, and private-to-private transfers. + +use std::time::Instant; + +use anyhow::{Result, bail}; +use integration_tests::{private_mention, public_mention}; +use wallet::cli::{ + Command, SubcommandReturnValue, + account::{AccountSubcommand, NewSubcommand}, + programs::token::TokenProgramAgnosticSubcommand, +}; + +use crate::harness::{ScenarioResult, finalize_step}; + +pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { + let mut result = ScenarioResult::new("private_chained_flow"); + + let def_id = new_public_account(ctx, &mut result, "create_acc_def").await?; + let supply_id = new_public_account(ctx, &mut result, "create_acc_supply").await?; + let public_recipient_id = + new_public_account(ctx, &mut result, "create_acc_pub_recipient").await?; + let private_a = new_private_account(ctx, &mut result, "create_acc_priv_a").await?; + let private_b = new_private_account(ctx, &mut result, "create_acc_priv_b").await?; + + // Mint into public supply. + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(def_id), + supply_account_id: public_mention(supply_id), + name: "PrivToken".to_owned(), + total_supply: 1_000_000, + }), + ) + .await?; + let step = finalize_step("token_new_fungible", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + // Shielded transfer: public supply -> private_a. + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(supply_id), + to: Some(private_mention(private_a)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 1_000, + }), + ) + .await?; + let step = finalize_step("shielded_transfer", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + // Deshielded transfer: private_a -> public_recipient. + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: private_mention(private_a), + to: Some(public_mention(public_recipient_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 100, + }), + ) + .await?; + let step = finalize_step("deshielded_transfer", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + // Private-to-private transfer: private_a -> private_b. + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: private_mention(private_a), + to: Some(private_mention(private_b)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 200, + }), + ) + .await?; + let step = finalize_step("private_to_private", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + Ok(result) +} + +async fn new_public_account( + ctx: &mut crate::bench_context::BenchContext, + result: &mut ScenarioResult, + label: &str, +) -> Result { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + result.push(step); + match ret { + SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), + other => bail!("expected RegisterAccount, got {other:?}"), + } +} + +async fn new_private_account( + ctx: &mut crate::bench_context::BenchContext, + result: &mut ScenarioResult, + label: &str, +) -> Result { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Private { + cci: None, + label: None, + })), + ) + .await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + result.push(step); + match ret { + SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), + other => bail!("expected RegisterAccount, got {other:?}"), + } +} diff --git a/tools/e2e_bench/src/scenarios/token.rs b/tools/e2e_bench/src/scenarios/token.rs new file mode 100644 index 00000000..c81bd8c1 --- /dev/null +++ b/tools/e2e_bench/src/scenarios/token.rs @@ -0,0 +1,127 @@ +//! Token onboarding scenario: create accounts, mint, public transfer, private transfer. + +use std::time::Instant; + +use anyhow::{Result, bail}; +use integration_tests::{private_mention, public_mention}; +use wallet::cli::{ + Command, SubcommandReturnValue, + account::{AccountSubcommand, NewSubcommand}, + programs::token::TokenProgramAgnosticSubcommand, +}; + +use crate::harness::{ScenarioResult, finalize_step}; + +pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { + let mut result = ScenarioResult::new("token_onboarding"); + + let definition_id = new_public_account(ctx, &mut result, "create_pub_definition").await?; + let supply_id = new_public_account(ctx, &mut result, "create_pub_supply").await?; + let recipient_id = new_public_account(ctx, &mut result, "create_pub_recipient").await?; + + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(definition_id), + supply_account_id: public_mention(supply_id), + name: "BenchToken".to_owned(), + total_supply: 1_000_000, + }), + ) + .await?; + let step = finalize_step("token_new_fungible", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(supply_id), + to: Some(public_mention(recipient_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 1_000, + }), + ) + .await?; + let step = finalize_step("token_public_transfer", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + let private_recipient_id = + new_private_account(ctx, &mut result, "create_priv_recipient").await?; + + { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(supply_id), + to: Some(private_mention(private_recipient_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 500, + }), + ) + .await?; + let step = finalize_step("token_shielded_transfer", started, pre_block, &ret, ctx).await?; + result.push(step); + } + + Ok(result) +} + +async fn new_public_account( + ctx: &mut crate::bench_context::BenchContext, + result: &mut ScenarioResult, + label: &str, +) -> Result { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + result.push(step); + match ret { + SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), + other => bail!("expected RegisterAccount, got {other:?}"), + } +} + +async fn new_private_account( + ctx: &mut crate::bench_context::BenchContext, + result: &mut ScenarioResult, + label: &str, +) -> Result { + let pre_block = crate::harness::begin_step(ctx).await?; + let started = Instant::now(); + let ret = wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Private { + cci: None, + label: None, + })), + ) + .await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + result.push(step); + match ret { + SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), + other => bail!("expected RegisterAccount, got {other:?}"), + } +} From 832b21f74d8c9866dac4310a7f3f8a8be565ddba Mon Sep 17 00:00:00 2001 From: Moudy Date: Tue, 19 May 2026 09:59:11 +0200 Subject: [PATCH 24/33] fix: cli --- .deny.toml | 1 + tools/e2e_bench/Cargo.toml | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.deny.toml b/.deny.toml index fb1ce3cf..320a9eda 100644 --- a/.deny.toml +++ b/.deny.toml @@ -16,6 +16,7 @@ ignore = [ { id = "RUSTSEC-2026-0097", reason = "`rand` v0.8.5 is present transitively from logos crates, modification may break integration" }, { id = "RUSTSEC-2026-0118", reason = "`hickory-proto` v0.25.0-alpha.5 is present transitively from logos crates, modification may break integration" }, { id = "RUSTSEC-2026-0119", reason = "`hickory-proto` v0.25.0-alpha.5 is present transitively from logos crates, modification may break integration" }, + { id = "RUSTSEC-2026-0145", reason = "`astral-tokio-tar` v0.6.1 is pulled transitively via testcontainers (integration_tests dev/test path); waiting on upstream fix" }, ] yanked = "deny" unused-ignored-advisory = "deny" diff --git a/tools/e2e_bench/Cargo.toml b/tools/e2e_bench/Cargo.toml index e3d7fd7a..c6658a8e 100644 --- a/tools/e2e_bench/Cargo.toml +++ b/tools/e2e_bench/Cargo.toml @@ -12,14 +12,11 @@ workspace = true integration_tests.workspace = true wallet.workspace = true nssa.workspace = true -nssa_core = { workspace = true, features = ["host"] } sequencer_service.workspace = true sequencer_service_rpc = { workspace = true, features = ["client"] } indexer_service.workspace = true indexer_service_rpc = { workspace = true, features = ["client"] } jsonrpsee = { workspace = true, features = ["ws-client"] } -token_core.workspace = true -amm_core.workspace = true common.workspace = true tempfile.workspace = true borsh.workspace = true @@ -30,4 +27,3 @@ tokio = { workspace = true, features = ["macros", "rt-multi-thread", "time"] } clap.workspace = true serde.workspace = true serde_json.workspace = true -log.workspace = true From c3daa9897d75e20615c5e2eca437e705ccba794c Mon Sep 17 00:00:00 2001 From: moudyellaz Date: Tue, 19 May 2026 18:54:11 +0200 Subject: [PATCH 25/33] docs(e2e_bench): drop machine table and stale benchmark numbers --- docs/benchmarks/e2e_bench.md | 79 ++++-------------------------------- 1 file changed, 7 insertions(+), 72 deletions(-) diff --git a/docs/benchmarks/e2e_bench.md b/docs/benchmarks/e2e_bench.md index 2f2a0a7a..278dab9b 100644 --- a/docs/benchmarks/e2e_bench.md +++ b/docs/benchmarks/e2e_bench.md @@ -2,16 +2,7 @@ End-to-end LEZ scenarios driven through the wallet against an in-process sequencer + indexer wired to an external Bedrock node. Times each step and records borsh sizes per block, split by tx variant. -## Machine - -| Field | Value | -|---|---| -| Chip | Apple M2 Pro (8P+4E) | -| RAM | 16 GB | -| OS | macOS 15.5 | -| Rust | 1.94.0 | -| Risc0 zkVM | 3.0.5 | -| Profile | release | +No numeric tables here yet. Absolute wall time and block sizes depend heavily on the bedrock config (block cadence and confirmation depth) and on dev-mode vs real proving; re-run the bench locally to get numbers for your own setup. Canonical numbers will be added once the bench runs against the standard configuration. ## Scenarios @@ -25,7 +16,7 @@ End-to-end LEZ scenarios driven through the wallet against an in-process sequenc ## Dev-mode vs real-proving -`RISC0_DEV_MODE=1` makes the prover emit stub receipts instead of running the recursive STARK pipeline. The table compares each quantity in **dev mode vs real proving** for the two classes of scenarios: +`RISC0_DEV_MODE=1` makes the prover emit stub receipts instead of running the recursive STARK pipeline. The table compares each quantity in dev mode vs real proving for the two classes of scenarios: | Quantity | Public-only scenarios (dev → real) | PPE-bearing scenarios (dev → real) | |---|---|---| @@ -33,71 +24,14 @@ End-to-end LEZ scenarios driven through the wallet against an in-process sequenc | `public_tx_bytes` | same in both modes | same in both modes | | `ppe_tx_bytes` | n/a | dev ≈ 2 KB stub → real ≈ 225 KB (matches `S_agg` from cycle_bench) | | `block_bytes` | same in both modes | real adds ~225 KB per PPE tx in the block | -| `bedrock_finality_ms` | same in both modes | same in both modes (L1 cadence, not LEZ prover) | +| `bedrock_finality_s` | same in both modes | same in both modes (L1 cadence, not LEZ prover) | | Blocks captured | similar in both modes | real captures more empty clock-only ticks that fill prove wall-time | -Tables below report dev-mode for all five scenarios. Real-proving numbers are included for `amm_swap_flow` (representative all-public) and `private_chained_flow` (representative chained-private flow); the public-only scenarios converge between modes within run-to-run jitter, so a full real-proving sweep is not run here. +Numbers are intentionally omitted in this document until the canonical run lands. Public-only scenarios converge between modes within run-to-run jitter; the qualitative differences are captured by the table above. -## Step latencies — dev mode (`RISC0_DEV_MODE=1`) +## Methodology -Per-scenario wall time and Bedrock L1-finality latency for the closing tip. - -| Scenario | total_ms | total_s | bedrock_finality_ms | bedrock_finality_s | -|---|---:|---:|---:|---:| -| token_onboarding | 60,808 | 60.81 | 24,593 | 24.59 | -| amm_swap_flow | 162,058 | 162.06 | 19,210 | 19.21 | -| multi_recipient_fanout | 222,206 | 222.21 | 16,020 | 16.02 | -| private_chained_flow | 80,700 | 80.70 | 23,963 | 23.96 | -| parallel_fanout | 244,387 | 244.39 | 23,770 | 23.77 | - -Total dev-mode wall time across all five: 912.9 s. - -## Step latencies — real proving (selected scenarios) - -| Scenario | total_ms | total_s | bedrock_finality_ms | bedrock_finality_s | Δ vs dev | -|---|---:|---:|---:|---:|---:| -| amm_swap_flow | 162,437 | 162.44 | ~19,210 | ~19.21 | ~0 (all-public) | -| private_chained_flow | 354,843 | 354.84 | 23,778 | 23.78 | +274.14 s (≈ 91 s per PPE step × 3) | - -Per-step breakdown for `private_chained_flow` in real proving: - -| Step | submit_ms | inclusion_ms | total_ms | total_s | -|---|---:|---:|---:|---:| -| token_new_fungible (public) | 1.1 | 20,276.0 | 20,291.2 | 20.29 | -| shielded_transfer (PPE) | 111,683.3 | 1.0 | 111,730.4 | 111.73 | -| deshielded_transfer (PPE) | 111,454.7 | 1.1 | 111,511.2 | 111.51 | -| private_to_private (PPE) | 111,237.0 | 1.1 | 111,293.0 | 111.29 | - -PPE steps move the cost from `inclusion_ms` (waiting for the next sealed block) to `submit_ms` (the wallet itself proving the PPE circuit before sending). Each PPE prove is ≈ 111 s on this CPU. - -## Block + tx sizes (borsh) — dev mode - -Per scenario, every produced block is fetched via `getBlock(BlockId)` and serialized with `borsh::to_vec(&Block)`. Each transaction is serialized individually and counted by variant. The empty clock-only ticks at `min` give the per-block fixed-cost baseline (≈ 334 bytes across all scenarios). - -| Scenario | blocks | block_bytes (mean) | block_bytes (min..max) | public_tx (mean / n) | ppe_tx (mean / n) | -|---|---:|---:|---|---:|---:| -| token_onboarding | 6 | 881 | 334..2,890 | 206 / 8 | 2,556 / 1 | -| amm_swap_flow | 16 | 553 | 334..1,011 | 248 / 24 | n/a | -| multi_recipient_fanout | 22 | 513 | 334..707 | 221 / 33 | n/a | -| private_chained_flow | 8 | 1,399 | 334..3,565 | 177 / 9 | 2,715 / 3 | -| parallel_fanout | 24 | 646 | 334..3,904 | 248 / 45 | n/a | - -## Block + tx sizes (borsh) — real proving - -| Scenario | blocks | block_bytes (mean) | block_bytes (min..max) | public_tx (mean / n) | ppe_tx (mean / n) | -|---|---:|---:|---|---:|---:| -| amm_swap_flow | 16 | 553 | 334..1,011 | 248 / 24 | n/a | -| private_chained_flow | 35 | 19,692 | 334..226,578 | 159 / 36 | 225,728 / 3 | - -`amm_swap_flow` is byte-identical between dev and real (no proof payload). `private_chained_flow`'s `ppe_tx_bytes` matches the cycle_bench `S_agg` measurement (≈ 225 KB borsh InnerReceipt). The `block_bytes` max (226,578) is the block containing the largest PPE transaction. - -## Findings - -- Public-only scenarios converge between dev mode and real proving in both latency and byte counts. Either mode is suitable to characterize them. -- PPE transactions are ≈ 225 KB on the wire in real proving, dominated by the outer succinct proof. Dev mode emits a ≈ 2 KB stub that does not represent the L1 payload — fee-model storage gas inputs must come from a real-proving run. -- Per-PPE-step prove cost on M2 Pro CPU is ≈ 110-120 s, paid on the wallet side at submit time (not on the sequencer). For a single-program chained flow the cost stacks linearly. -- Empty clock-only ticks set the per-block fixed-cost baseline at ≈ 334 bytes across all scenarios and both modes. -- Bedrock L1 finality stays around 20 s regardless of proving mode, because finality is paced by L1 cadence, not the LEZ prover. +Per scenario, every produced block is fetched via `getBlock(BlockId)` and serialized with `borsh::to_vec(&Block)`. Each transaction is serialized individually and counted by variant. Empty clock-only ticks give the per-block fixed-cost baseline. Wall time is captured per step (submit + inclusion + wallet sync) and per scenario (setup + steps + closing bedrock finality wait). ## Reproduce @@ -122,4 +56,5 @@ JSON output: `target/e2e_bench_dev.json` / `target/e2e_bench_prove.json` (suffix - Dev-mode `ppe_tx_bytes` and PPE-step latencies are not representative of production; use real-proving numbers for any fee-model input that touches the storage or prover-cost components. - Single-host run, no GPU acceleration. Real-proving on production prover hardware will move per-step latencies by orders of magnitude; byte counts will not change. - Bedrock running locally; no real network latency between sequencer and Bedrock. +- Bedrock L1 finality (`bedrock_finality_s`) is set by the bedrock config in `LEZ_BEDROCK_CONFIG_DIR` (block cadence × confirmation depth). Different configs will shift `bedrock_finality_s` materially. - Some scenarios share account state via the same wallet; this is intentional (mirrors `integration_tests::TestContext`) and not a realistic multi-wallet workload. From 619db3846d502cec49c7940678c829177a88cb59 Mon Sep 17 00:00:00 2001 From: moudyellaz Date: Tue, 19 May 2026 22:59:02 +0200 Subject: [PATCH 26/33] refactor(e2e_bench)!: Duration-typed timings, seconds-float JSON, tokio::timeout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING CHANGE: bench JSON renames per-step / per-scenario timing fields from *_ms (float milliseconds) to *_s (float seconds). Renames: submit_ms → submit_s, inclusion_ms → inclusion_s, wallet_sync_ms → wallet_sync_s, total_ms → total_s, setup_ms → setup_s, bedrock_finality_ms → bedrock_finality_s, total_wall_seconds → total_wall_s. measure_bedrock_finality timeout floor also shifts slightly: on timeout the field is now ~60.000s rather than "first poll tick past 60s". --- Cargo.lock | 4 - tools/e2e_bench/Cargo.toml | 18 +-- tools/e2e_bench/README.md | 2 +- tools/e2e_bench/src/bedrock_handle.rs | 11 +- tools/e2e_bench/src/bench_context.rs | 9 +- tools/e2e_bench/src/harness.rs | 143 +++++++++++--------- tools/e2e_bench/src/main.rs | 151 ++++++++++------------ tools/e2e_bench/src/scenarios/parallel.rs | 29 +++-- 8 files changed, 194 insertions(+), 173 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 96afcef6..f238fc2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2382,7 +2382,6 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" name = "e2e_bench" version = "0.1.0" dependencies = [ - "amm_core", "anyhow", "borsh", "chrono", @@ -2392,15 +2391,12 @@ dependencies = [ "indexer_service_rpc", "integration_tests", "jsonrpsee", - "log", "nssa", - "nssa_core", "sequencer_service", "sequencer_service_rpc", "serde", "serde_json", "tempfile", - "token_core", "tokio", "wallet", ] diff --git a/tools/e2e_bench/Cargo.toml b/tools/e2e_bench/Cargo.toml index c6658a8e..ab6a6eb0 100644 --- a/tools/e2e_bench/Cargo.toml +++ b/tools/e2e_bench/Cargo.toml @@ -9,21 +9,21 @@ publish = false workspace = true [dependencies] +common.workspace = true +indexer_service.workspace = true +indexer_service_rpc = { workspace = true, features = ["client"] } integration_tests.workspace = true -wallet.workspace = true nssa.workspace = true sequencer_service.workspace = true sequencer_service_rpc = { workspace = true, features = ["client"] } -indexer_service.workspace = true -indexer_service_rpc = { workspace = true, features = ["client"] } -jsonrpsee = { workspace = true, features = ["ws-client"] } -common.workspace = true -tempfile.workspace = true -borsh.workspace = true -chrono.workspace = true +wallet.workspace = true anyhow.workspace = true -tokio = { workspace = true, features = ["macros", "rt-multi-thread", "time"] } +borsh.workspace = true +chrono.workspace = true clap.workspace = true +jsonrpsee = { workspace = true, features = ["ws-client"] } serde.workspace = true serde_json.workspace = true +tempfile.workspace = true +tokio = { workspace = true, features = ["macros", "rt-multi-thread", "time"] } diff --git a/tools/e2e_bench/README.md b/tools/e2e_bench/README.md index 37d6b175..ddc76bb7 100644 --- a/tools/e2e_bench/README.md +++ b/tools/e2e_bench/README.md @@ -26,7 +26,7 @@ Scenarios: `token`, `amm`, `fanout`, `private`, `parallel`, `all`. ## What you'll see -Per scenario: a step table (`submit_ms`, `inclusion_ms`, `sync_ms`, `total_ms`) and a size summary covering every block captured during the scenario (block_bytes total/mean/min/max; per-tx-variant sizes for public, PPE, and program-deployment transactions). +Per scenario: a step table (`submit_s`, `inclusion_s`, `sync_s`, `total_s`) and a size summary covering every block captured during the scenario (block_bytes total/mean/min/max; per-tx-variant sizes for public, PPE, and program-deployment transactions). The fanout, parallel, and private scenarios are the most representative for L1-payload-size measurements since they put multiple txs per block. diff --git a/tools/e2e_bench/src/bedrock_handle.rs b/tools/e2e_bench/src/bedrock_handle.rs index ef59d8ad..94a8514a 100644 --- a/tools/e2e_bench/src/bedrock_handle.rs +++ b/tools/e2e_bench/src/bedrock_handle.rs @@ -2,14 +2,19 @@ //! Launches a fresh Bedrock instance per scenario so the indexer never has to //! catch up a large finalization backlog. //! -//! Required env vars (no defaults — path layouts differ per developer): -//! - `LEZ_BEDROCK_BIN` — absolute path to the `logos-blockchain-node` binary. -//! - `LEZ_BEDROCK_CONFIG_DIR` — directory containing `node-config.yaml` and +//! Required env vars (no defaults, path layouts differ per developer): +//! - `LEZ_BEDROCK_BIN` absolute path to the `logos-blockchain-node` binary. +//! - `LEZ_BEDROCK_CONFIG_DIR` directory containing `node-config.yaml` and //! `deployment-settings.yaml` (template with `PLACEHOLDER_CHAIN_START_TIME`). //! //! Optional: //! - `LEZ_BEDROCK_PORT` (default: 18080) +#![allow( + clippy::let_underscore_must_use, + reason = "file is deleted in the docker-compose pivot; teardown ignores child kill/wait results by design" +)] + use std::{ env, net::SocketAddr, diff --git a/tools/e2e_bench/src/bench_context.rs b/tools/e2e_bench/src/bench_context.rs index 43376811..41f0d59d 100644 --- a/tools/e2e_bench/src/bench_context.rs +++ b/tools/e2e_bench/src/bench_context.rs @@ -1,4 +1,4 @@ -//! BenchContext: wires sequencer + indexer + wallet in-process against an +//! `BenchContext`: wires sequencer + indexer + wallet in-process against an //! externally-running Bedrock node. Mirrors the surface of //! `integration_tests::TestContext` for the methods the scenarios need //! (`wallet_mut()`, `sequencer_client()`), but skips the docker setup. @@ -6,6 +6,11 @@ //! The external Bedrock URL defaults to 127.0.0.1:18080 and can be overridden //! with the `LEZ_BEDROCK_ADDR` env var. +#![allow( + clippy::arbitrary_source_item_ordering, + reason = "file is deleted in the docker-compose pivot; ordering churn is wasted work" +)] + use std::{env, net::SocketAddr, path::Path}; use anyhow::{Context as _, Result}; @@ -145,7 +150,7 @@ impl BenchContext { &self.sequencer_client } - pub fn indexer_addr(&self) -> SocketAddr { + pub const fn indexer_addr(&self) -> SocketAddr { self.indexer_handle.addr() } diff --git a/tools/e2e_bench/src/harness.rs b/tools/e2e_bench/src/harness.rs index bcdff7a7..c83904fd 100644 --- a/tools/e2e_bench/src/harness.rs +++ b/tools/e2e_bench/src/harness.rs @@ -1,11 +1,16 @@ //! Step / scenario timing primitives shared across scenarios. +#![allow( + clippy::ref_option, + reason = "serde::serialize_with requires fn(&Option, S) -> Result<...>" +)] + use std::time::{Duration, Instant}; use anyhow::{Result, bail}; use common::transaction::NSSATransaction; use sequencer_service_rpc::RpcClient as _; -use serde::Serialize; +use serde::{Serialize, Serializer}; use wallet::cli::SubcommandReturnValue; use crate::bench_context::BenchContext; @@ -16,7 +21,7 @@ const TX_INCLUSION_TIMEOUT: Duration = Duration::from_secs(120); /// Borsh-serialized sizes for one zone block fetched after a step. `block_bytes` /// is the full Block (header + body + bedrock metadata) and is the closest /// proxy we have to the L1 payload posted per block. `tx_bytes` is each contained -/// transaction split by variant — this is what the fee model's S_tx slot covers. +/// transaction split by variant, which is what the fee model's `S_tx` slot covers. #[derive(Debug, Serialize, Clone, Default)] pub struct BlockSize { pub block_id: u64, @@ -29,22 +34,28 @@ pub struct BlockSize { #[derive(Debug, Serialize, Clone)] pub struct StepResult { pub label: String, - pub submit_ms: f64, - pub inclusion_ms: Option, - pub wallet_sync_ms: Option, - pub total_ms: f64, + #[serde(serialize_with = "ser_duration_secs", rename = "submit_s")] + pub submit: Duration, + #[serde(serialize_with = "ser_opt_duration_secs", rename = "inclusion_s")] + pub inclusion: Option, + #[serde(serialize_with = "ser_opt_duration_secs", rename = "wallet_sync_s")] + pub wallet_sync: Option, + #[serde(serialize_with = "ser_duration_secs", rename = "total_s")] + pub total: Duration, pub tx_hash: Option, /// Borsh sizes for every zone block produced during this step. - /// Empty for steps that don't advance the chain (e.g. RegisterAccount). + /// Empty for steps that don't advance the chain (e.g. `RegisterAccount`). pub blocks: Vec, } #[derive(Debug, Serialize, Default)] pub struct ScenarioResult { pub name: String, - pub setup_ms: f64, + #[serde(serialize_with = "ser_duration_secs", rename = "setup_s")] + pub setup: Duration, pub steps: Vec, - pub total_ms: f64, + #[serde(serialize_with = "ser_duration_secs", rename = "total_s")] + pub total: Duration, /// Disk sizes (sequencer / indexer / wallet tempdirs) sampled at scenario start. pub disk_before: Option, /// Disk sizes sampled at scenario end. @@ -53,7 +64,8 @@ pub struct ScenarioResult { /// reporting the sequencer tip as L1-finalised. Effectively measures the /// sequencer→Bedrock posting + Bedrock finalisation + indexer L1 ingest path. /// A value at the timeout (60s) means finalisation did not happen within the bench window. - pub bedrock_finality_ms: Option, + #[serde(serialize_with = "ser_opt_duration_secs", rename = "bedrock_finality_s")] + pub bedrock_finality: Option, } impl ScenarioResult { @@ -65,11 +77,18 @@ impl ScenarioResult { } pub fn push(&mut self, step: StepResult) { - self.total_ms += step.total_ms; + self.total = self.total.saturating_add(step.total); self.steps.push(step); } } +/// Begin a timed step. Capture this *before* submitting the wallet operation +/// so we can later subtract it from the post-submit block height to detect +/// when the chain has advanced past the tx's block. +pub async fn begin_step(ctx: &BenchContext) -> Result { + Ok(ctx.sequencer_client().get_last_block_id().await?) +} + /// Finish a timed wallet step. Records submit (the time between `started` /// being captured and `ret` being received) and, if `ret` is a /// [`SubcommandReturnValue::PrivacyPreservingTransfer`], polls the sequencer @@ -79,15 +98,8 @@ impl ScenarioResult { /// ```ignore /// let started = Instant::now(); /// let ret = wallet::cli::execute_subcommand(ctx.wallet_mut(), cmd).await?; -/// let step = finalize_step("label", started, ret, ctx).await?; +/// let step = finalize_step("label", started, pre_block_id, &ret, ctx).await?; /// ``` -/// Begin a timed step. Capture this *before* submitting the wallet operation -/// so we can later subtract it from the post-submit block height to detect -/// when the chain has advanced past the tx's block. -pub async fn begin_step(ctx: &BenchContext) -> Result { - Ok(ctx.sequencer_client().get_last_block_id().await?) -} - pub async fn finalize_step( label: impl Into, started: Instant, @@ -96,11 +108,11 @@ pub async fn finalize_step( ctx: &mut BenchContext, ) -> Result { let label = label.into(); - let submit_ms = started.elapsed().as_secs_f64() * 1_000.0; + let submit = started.elapsed(); let mut tx_hash_str = None; - let mut inclusion_ms = None; - let mut wallet_sync_ms = None; + let mut inclusion = None; + let mut wallet_sync = None; let mut blocks: Vec = Vec::new(); // For non-account-create steps (anything that produces a tx_hash, or even @@ -115,11 +127,11 @@ pub async fn finalize_step( } let started_inclusion = Instant::now(); wait_for_chain_advance(ctx, pre_block_id, 2).await?; - inclusion_ms = Some(started_inclusion.elapsed().as_secs_f64() * 1_000.0); + inclusion = Some(started_inclusion.elapsed()); let started_sync = Instant::now(); sync_wallet_to_tip(ctx).await?; - wallet_sync_ms = Some(started_sync.elapsed().as_secs_f64() * 1_000.0); + wallet_sync = Some(started_sync.elapsed()); // Capture block-byte and per-tx-byte sizes for every block produced // during this step. We intentionally capture all blocks, including @@ -151,10 +163,10 @@ pub async fn finalize_step( Ok(StepResult { label, - submit_ms, - inclusion_ms, - wallet_sync_ms, - total_ms: started.elapsed().as_secs_f64() * 1_000.0, + submit, + inclusion, + wallet_sync, + total: started.elapsed(), tx_hash: tx_hash_str, blocks, }) @@ -167,19 +179,21 @@ pub async fn wait_for_chain_advance( min_blocks: u64, ) -> Result<()> { let target = from_block_id.saturating_add(min_blocks); - let deadline = Instant::now() + TX_INCLUSION_TIMEOUT; - loop { - match ctx.sequencer_client().get_last_block_id().await { - Ok(current) if current >= target => return Ok(()), - Ok(_) => {} - Err(err) => eprintln!("get_last_block_id error (continuing poll): {err:#}"), + let poll = async { + loop { + match ctx.sequencer_client().get_last_block_id().await { + Ok(current) if current >= target => return, + Ok(_) => {} + Err(err) => eprintln!("get_last_block_id error (continuing poll): {err:#}"), + } + tokio::time::sleep(TX_INCLUSION_POLL_INTERVAL).await; } - if Instant::now() > deadline { - bail!( - "chain did not advance from {from_block_id} to at least {target} within {TX_INCLUSION_TIMEOUT:?}" - ); - } - tokio::time::sleep(TX_INCLUSION_POLL_INTERVAL).await; + }; + match tokio::time::timeout(TX_INCLUSION_TIMEOUT, poll).await { + Ok(()) => Ok(()), + Err(_) => bail!( + "chain did not advance from {from_block_id} to at least {target} within {TX_INCLUSION_TIMEOUT:?}" + ), } } @@ -199,38 +213,35 @@ pub fn print_table(result: &ScenarioResult) { .max("step".len()); println!( - "\nScenario: {} (setup {:.1} ms ({:.2}s), total {:.1} ms ({:.2}s))", + "\nScenario: {} (setup {:.2}s, total {:.2}s)", result.name, - result.setup_ms, - result.setup_ms / 1_000.0, - result.total_ms, - result.total_ms / 1_000.0, + result.setup.as_secs_f64(), + result.total.as_secs_f64(), ); println!( - "{:10} {:>12} {:>10} {:>16}", + "{:10} {:>12} {:>10} {:>10}", "step", - "submit_ms", - "inclusion_ms", - "sync_ms", - "total_ms (s)", + "submit_s", + "inclusion_s", + "sync_s", + "total_s", lw = label_width, ); - println!("{}", "-".repeat(label_width + 62)); + println!("{}", "-".repeat(label_width.saturating_add(50))); for s in &result.steps { let inclusion = s - .inclusion_ms - .map_or_else(|| "-".to_owned(), |v| format!("{v:.1}")); + .inclusion + .map_or_else(|| "-".to_owned(), |v| format!("{:.3}", v.as_secs_f64())); let sync = s - .wallet_sync_ms - .map_or_else(|| "-".to_owned(), |v| format!("{v:.1}")); - let total = format!("{:.1} ({:.2}s)", s.total_ms, s.total_ms / 1_000.0); + .wallet_sync + .map_or_else(|| "-".to_owned(), |v| format!("{:.3}", v.as_secs_f64())); println!( - "{:10.1} {:>12} {:>10} {:>16}", + "{:10.3} {:>12} {:>10} {:>10.3}", s.label, - s.submit_ms, + s.submit.as_secs_f64(), inclusion, sync, - total, + s.total.as_secs_f64(), lw = label_width, ); } @@ -295,3 +306,17 @@ fn print_tx_line(label: &str, samples: &[usize]) { fn mean_usize(xs: &[usize]) -> usize { xs.iter().sum::().checked_div(xs.len()).unwrap_or(0) } + +fn ser_duration_secs(d: &Duration, s: S) -> std::result::Result { + s.serialize_f64(d.as_secs_f64()) +} + +fn ser_opt_duration_secs( + d: &Option, + s: S, +) -> std::result::Result { + match d { + Some(d) => s.serialize_f64(d.as_secs_f64()), + None => s.serialize_none(), + } +} diff --git a/tools/e2e_bench/src/main.rs b/tools/e2e_bench/src/main.rs index 31ea1189..80f547ab 100644 --- a/tools/e2e_bench/src/main.rs +++ b/tools/e2e_bench/src/main.rs @@ -7,34 +7,25 @@ //! block + tx sizes per scenario. //! //! Required env vars (no defaults; see `tools/e2e_bench/README.md`): -//! LEZ_BEDROCK_BIN absolute path to logos-blockchain-node. -//! LEZ_BEDROCK_CONFIG_DIR directory with node-config.yaml + deployment template. +//! `LEZ_BEDROCK_BIN` absolute path to logos-blockchain-node. +//! `LEZ_BEDROCK_CONFIG_DIR` directory with node-config.yaml + deployment template. //! //! Run examples: -//! RISC0_DEV_MODE=1 cargo run --release -p e2e_bench -- --scenario all. -//! cargo run --release -p e2e_bench -- --scenario amm. +//! `RISC0_DEV_MODE=1` `cargo run --release -p e2e_bench -- --scenario all`. +//! `cargo run --release -p e2e_bench -- --scenario amm`. //! //! `RISC0_DEV_MODE=1` skips proving and produces latency-only numbers in //! ~minutes; omitting it produces realistic proving-inclusive numbers but //! the run takes much longer. -#![expect( - clippy::arbitrary_source_item_ordering, +#![allow( clippy::arithmetic_side_effects, - clippy::as_conversions, - clippy::doc_markdown, - clippy::float_arithmetic, - clippy::let_underscore_must_use, - clippy::let_underscore_untyped, - clippy::missing_const_for_fn, clippy::print_stderr, clippy::print_stdout, - clippy::single_call_fn, - clippy::single_match_else, - clippy::std_instead_of_core, - clippy::too_many_lines, clippy::wildcard_enum_match_arm, - reason = "Bench tool: matches test-style fixture code" + reason = "Bench tool: stderr/stdout output is the deliverable; small Duration / iterator-sum \ + arithmetic is safe at bench scale; bench scenarios bail loudly on any unexpected \ + return variant, which is preferable to maintaining an exhaustive list in five files." )] use std::{path::PathBuf, time::Duration}; @@ -68,7 +59,7 @@ struct Cli { #[arg(long, value_enum, default_value_t = ScenarioName::All)] scenario: ScenarioName, - /// Optional JSON output path. Defaults to /target/e2e_bench.json. + /// Optional JSON output path. Defaults to `/target/e2e_bench.json`. #[arg(long)] json_out: Option, } @@ -77,7 +68,7 @@ struct Cli { struct BenchRunReport { risc0_dev_mode: bool, scenarios: Vec, - total_wall_seconds: f64, + total_wall_s: f64, } #[tokio::main(flavor = "multi_thread")] @@ -110,61 +101,61 @@ async fn main() -> Result<()> { for name in to_run { eprintln!("\n=== running scenario: {name:?} ==="); - let setup_started = std::time::Instant::now(); - // Spawn a fresh Bedrock node for this scenario. Each scenario therefore - // starts with an empty chain so the indexer never has a backlog from a - // prior scenario. - let bedrock = BedrockHandle::launch_fresh() - .await - .with_context(|| format!("failed to spawn Bedrock for scenario {name:?}"))?; - let bedrock_addr_string = format!("{}", bedrock.addr()); - // Safety: we restore the previous LEZ_BEDROCK_ADDR value (if any) at scenario teardown. - // SAFETY: this happens before any threaded setup that reads env. - unsafe { - std::env::set_var("LEZ_BEDROCK_ADDR", &bedrock_addr_string); + { + let setup_started = std::time::Instant::now(); + // Spawn a fresh Bedrock node for this scenario. Each scenario therefore + // starts with an empty chain so the indexer never has a backlog from a + // prior scenario. + let bedrock = BedrockHandle::launch_fresh() + .await + .with_context(|| format!("failed to spawn Bedrock for scenario {name:?}"))?; + let bedrock_addr_string = format!("{}", bedrock.addr()); + // SAFETY: env::set_var happens before any threaded setup that reads env. + unsafe { + std::env::set_var("LEZ_BEDROCK_ADDR", &bedrock_addr_string); + } + + let mut ctx = BenchContext::new() + .await + .with_context(|| format!("failed to setup BenchContext for scenario {name:?}"))?; + let setup = setup_started.elapsed(); + eprintln!("setup: {:.2}s", setup.as_secs_f64()); + + let disk_before = ctx.disk_sizes(); + let mut result = run_scenario(name, setup, &mut ctx).await?; + result.disk_before = Some(disk_before); + result.disk_after = Some(ctx.disk_sizes()); + result.bedrock_finality = Some(measure_bedrock_finality(&ctx).await?); + harness::print_table(&result); + all_results.push(result); + + // ctx and bedrock drop here at end of scope, killing the bedrock child + // before we sleep so the next iteration can rebind the port. } - - let mut ctx = BenchContext::new() - .await - .with_context(|| format!("failed to setup BenchContext for scenario {name:?}"))?; - let setup_ms = elapsed_ms(setup_started); - eprintln!("setup: {setup_ms:.1} ms"); - - let disk_before = ctx.disk_sizes(); - let mut result = run_scenario(name, setup_ms, &mut ctx).await?; - result.disk_before = Some(disk_before); - result.disk_after = Some(ctx.disk_sizes()); - result.bedrock_finality_ms = Some(measure_bedrock_finality(&ctx).await?); - harness::print_table(&result); - all_results.push(result); - - drop(ctx); - drop(bedrock); // Give Bedrock a moment to shut down before the next scenario. tokio::time::sleep(Duration::from_secs(2)).await; } - let total_wall_seconds = overall_started.elapsed().as_secs_f64(); - eprintln!("\nTotal wall time: {total_wall_seconds:.1}s"); + let total_wall_s = overall_started.elapsed().as_secs_f64(); + eprintln!("\nTotal wall time: {total_wall_s:.1}s"); let report = BenchRunReport { risc0_dev_mode, scenarios: all_results, - total_wall_seconds, + total_wall_s, }; - let out_path = match cli.json_out { - Some(p) => p, - None => { - let workspace_root = PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("..") - .join("..") - .canonicalize()?; - let suffix = if risc0_dev_mode { "dev" } else { "prove" }; - workspace_root - .join("target") - .join(format!("e2e_bench_{suffix}.json")) - } + let out_path = if let Some(p) = cli.json_out { + p + } else { + let workspace_root = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("..") + .join("..") + .canonicalize()?; + let suffix = if risc0_dev_mode { "dev" } else { "prove" }; + workspace_root + .join("target") + .join(format!("e2e_bench_{suffix}.json")) }; if let Some(parent) = out_path.parent() { std::fs::create_dir_all(parent)?; @@ -177,7 +168,7 @@ async fn main() -> Result<()> { async fn run_scenario( name: ScenarioName, - setup_ms: f64, + setup: Duration, ctx: &mut BenchContext, ) -> Result { let result = match name { @@ -188,17 +179,13 @@ async fn run_scenario( ScenarioName::Parallel => scenarios::parallel::run(ctx).await?, ScenarioName::All => unreachable!("dispatched above"), }; - Ok(ScenarioResult { setup_ms, ..result }) -} - -fn elapsed_ms(t: std::time::Instant) -> f64 { - t.elapsed().as_secs_f64() * 1_000.0 + Ok(ScenarioResult { setup, ..result }) } /// Poll the indexer's L1-finalised block id until it catches up with the /// sequencer's last block id. This is effectively the sequencer→Bedrock posting /// plus Bedrock finalisation plus indexer ingest latency. -async fn measure_bedrock_finality(ctx: &BenchContext) -> Result { +async fn measure_bedrock_finality(ctx: &BenchContext) -> Result { use indexer_service_rpc::RpcClient as _; use jsonrpsee::ws_client::WsClientBuilder; use sequencer_service_rpc::RpcClient as _; @@ -210,20 +197,20 @@ async fn measure_bedrock_finality(ctx: &BenchContext) -> Result { .context("connect indexer WS")?; let sequencer_tip = ctx.sequencer_client().get_last_block_id().await?; + let timeout = Duration::from_secs(60); let started = std::time::Instant::now(); - let deadline = started + Duration::from_secs(60); - loop { - match indexer_ws.get_last_finalized_block_id().await { - Ok(Some(b)) if b >= sequencer_tip => { - return Ok(started.elapsed().as_secs_f64() * 1_000.0); + let poll = async { + loop { + match indexer_ws.get_last_finalized_block_id().await { + Ok(Some(b)) if b >= sequencer_tip => return, + Ok(_) => {} + Err(err) => eprintln!("indexer last_synced poll error: {err:#}"), } - Ok(_) => {} - Err(err) => eprintln!("indexer last_synced poll error: {err:#}"), + tokio::time::sleep(Duration::from_millis(200)).await; } - if std::time::Instant::now() > deadline { - eprintln!("indexer did not catch up to {sequencer_tip} within 60s"); - return Ok(started.elapsed().as_secs_f64() * 1_000.0); - } - tokio::time::sleep(Duration::from_millis(200)).await; + }; + if tokio::time::timeout(timeout, poll).await.is_err() { + eprintln!("indexer did not catch up to {sequencer_tip} within {timeout:?}"); } + Ok(started.elapsed()) } diff --git a/tools/e2e_bench/src/scenarios/parallel.rs b/tools/e2e_bench/src/scenarios/parallel.rs index 43bd25ac..23dd2247 100644 --- a/tools/e2e_bench/src/scenarios/parallel.rs +++ b/tools/e2e_bench/src/scenarios/parallel.rs @@ -42,7 +42,10 @@ pub async fn run(ctx: &mut BenchContext) -> Result { } // Mint full supply into master. - let total_mint: u128 = (PARALLEL_FANOUT_N as u128) * AMOUNT_PER_TRANSFER * 10; + let total_mint = u128::try_from(PARALLEL_FANOUT_N) + .expect("usize fits u128") + .saturating_mul(AMOUNT_PER_TRANSFER) + .saturating_mul(10); { let pre_block = crate::harness::begin_step(ctx).await?; let started = Instant::now(); @@ -104,21 +107,21 @@ pub async fn run(ctx: &mut BenchContext) -> Result { .await?; } let all_submitted_at = Instant::now(); - let submit_duration_ms = (all_submitted_at - burst_started).as_secs_f64() * 1_000.0; + let submit_duration = all_submitted_at.saturating_duration_since(burst_started); // Wait for the chain to advance by at least 2 blocks past pre_block_burst. // That guarantees the block holding our burst is sealed and applied. crate::harness::wait_for_chain_advance(ctx, pre_block_burst, 2).await?; let inclusion_done_at = Instant::now(); - let inclusion_after_submit_ms = (inclusion_done_at - all_submitted_at).as_secs_f64() * 1_000.0; - let burst_total_ms = (inclusion_done_at - burst_started).as_secs_f64() * 1_000.0; + let inclusion_after_submit = inclusion_done_at.saturating_duration_since(all_submitted_at); + let burst_total = inclusion_done_at.saturating_duration_since(burst_started); eprintln!( - "parallel_fanout: submitted {} txs in {:.1} ms, inclusion in {:.1} ms, total {:.1} ms", + "parallel_fanout: submitted {} txs in {:.3}s, inclusion in {:.3}s, total {:.3}s", senders.len(), - submit_duration_ms, - inclusion_after_submit_ms, - burst_total_ms, + submit_duration.as_secs_f64(), + inclusion_after_submit.as_secs_f64(), + burst_total.as_secs_f64(), ); // Capture every block produced during the burst window. This is the @@ -149,13 +152,13 @@ pub async fn run(ctx: &mut BenchContext) -> Result { } // Synthesise a single summary "step" for the burst. Use the submit time - // for `submit_ms` and the inclusion-wait time for `inclusion_ms`. + // for `submit` and the inclusion-wait time for `inclusion`. let burst_step = StepResult { label: format!("burst_{}_transfers", senders.len()), - submit_ms: submit_duration_ms, - inclusion_ms: Some(inclusion_after_submit_ms), - wallet_sync_ms: None, - total_ms: burst_total_ms, + submit: submit_duration, + inclusion: Some(inclusion_after_submit), + wallet_sync: None, + total: burst_total, tx_hash: None, blocks, }; From 932763fcf2a5a98770c2a046c2cbc14916414f6f Mon Sep 17 00:00:00 2001 From: moudyellaz Date: Tue, 19 May 2026 23:48:05 +0200 Subject: [PATCH 27/33] refactor(e2e_bench): rename ScenarioResult to ScenarioOutput --- tools/e2e_bench/src/harness.rs | 22 +++++----- tools/e2e_bench/src/main.rs | 26 ++++++------ tools/e2e_bench/src/scenarios/amm.rs | 50 +++++++++++------------ tools/e2e_bench/src/scenarios/fanout.rs | 22 +++++----- tools/e2e_bench/src/scenarios/parallel.rs | 26 ++++++------ tools/e2e_bench/src/scenarios/private.rs | 34 +++++++-------- tools/e2e_bench/src/scenarios/token.rs | 30 +++++++------- 7 files changed, 105 insertions(+), 105 deletions(-) diff --git a/tools/e2e_bench/src/harness.rs b/tools/e2e_bench/src/harness.rs index c83904fd..7020352b 100644 --- a/tools/e2e_bench/src/harness.rs +++ b/tools/e2e_bench/src/harness.rs @@ -49,7 +49,7 @@ pub struct StepResult { } #[derive(Debug, Serialize, Default)] -pub struct ScenarioResult { +pub struct ScenarioOutput { pub name: String, #[serde(serialize_with = "ser_duration_secs", rename = "setup_s")] pub setup: Duration, @@ -68,7 +68,7 @@ pub struct ScenarioResult { pub bedrock_finality: Option, } -impl ScenarioResult { +impl ScenarioOutput { pub fn new(name: impl Into) -> Self { Self { name: name.into(), @@ -203,8 +203,8 @@ async fn sync_wallet_to_tip(ctx: &mut BenchContext) -> Result<()> { Ok(()) } -pub fn print_table(result: &ScenarioResult) { - let label_width = result +pub fn print_table(output: &ScenarioOutput) { + let label_width = output .steps .iter() .map(|s| s.label.len()) @@ -214,9 +214,9 @@ pub fn print_table(result: &ScenarioResult) { println!( "\nScenario: {} (setup {:.2}s, total {:.2}s)", - result.name, - result.setup.as_secs_f64(), - result.total.as_secs_f64(), + output.name, + output.setup.as_secs_f64(), + output.total.as_secs_f64(), ); println!( "{:10} {:>12} {:>10} {:>10}", @@ -228,7 +228,7 @@ pub fn print_table(result: &ScenarioResult) { lw = label_width, ); println!("{}", "-".repeat(label_width.saturating_add(50))); - for s in &result.steps { + for s in &output.steps { let inclusion = s .inclusion .map_or_else(|| "-".to_owned(), |v| format!("{:.3}", v.as_secs_f64())); @@ -246,13 +246,13 @@ pub fn print_table(result: &ScenarioResult) { ); } - print_size_summary(result); + print_size_summary(output); } /// Aggregate borsh sizes per scenario: total/mean/min/max block bytes, and /// per-tx bytes split by variant. Empty if no blocks were captured. -fn print_size_summary(result: &ScenarioResult) { - let blocks: Vec<&BlockSize> = result.steps.iter().flat_map(|s| s.blocks.iter()).collect(); +fn print_size_summary(output: &ScenarioOutput) { + let blocks: Vec<&BlockSize> = output.steps.iter().flat_map(|s| s.blocks.iter()).collect(); if blocks.is_empty() { return; } diff --git a/tools/e2e_bench/src/main.rs b/tools/e2e_bench/src/main.rs index 80f547ab..7de1d323 100644 --- a/tools/e2e_bench/src/main.rs +++ b/tools/e2e_bench/src/main.rs @@ -34,7 +34,7 @@ use anyhow::{Context as _, Result}; use bedrock_handle::BedrockHandle; use bench_context::BenchContext; use clap::{Parser, ValueEnum}; -use harness::ScenarioResult; +use harness::ScenarioOutput; use serde::Serialize; mod bedrock_handle; @@ -67,7 +67,7 @@ struct Cli { #[derive(Debug, Serialize)] struct BenchRunReport { risc0_dev_mode: bool, - scenarios: Vec, + scenarios: Vec, total_wall_s: f64, } @@ -97,7 +97,7 @@ async fn main() -> Result<()> { }; let overall_started = std::time::Instant::now(); - let mut all_results = Vec::with_capacity(to_run.len()); + let mut all_outputs = Vec::with_capacity(to_run.len()); for name in to_run { eprintln!("\n=== running scenario: {name:?} ==="); @@ -122,12 +122,12 @@ async fn main() -> Result<()> { eprintln!("setup: {:.2}s", setup.as_secs_f64()); let disk_before = ctx.disk_sizes(); - let mut result = run_scenario(name, setup, &mut ctx).await?; - result.disk_before = Some(disk_before); - result.disk_after = Some(ctx.disk_sizes()); - result.bedrock_finality = Some(measure_bedrock_finality(&ctx).await?); - harness::print_table(&result); - all_results.push(result); + let mut output = run_scenario(name, setup, &mut ctx).await?; + output.disk_before = Some(disk_before); + output.disk_after = Some(ctx.disk_sizes()); + output.bedrock_finality = Some(measure_bedrock_finality(&ctx).await?); + harness::print_table(&output); + all_outputs.push(output); // ctx and bedrock drop here at end of scope, killing the bedrock child // before we sleep so the next iteration can rebind the port. @@ -141,7 +141,7 @@ async fn main() -> Result<()> { let report = BenchRunReport { risc0_dev_mode, - scenarios: all_results, + scenarios: all_outputs, total_wall_s, }; @@ -170,8 +170,8 @@ async fn run_scenario( name: ScenarioName, setup: Duration, ctx: &mut BenchContext, -) -> Result { - let result = match name { +) -> Result { + let output = match name { ScenarioName::Token => scenarios::token::run(ctx).await?, ScenarioName::Amm => scenarios::amm::run(ctx).await?, ScenarioName::Fanout => scenarios::fanout::run(ctx).await?, @@ -179,7 +179,7 @@ async fn run_scenario( ScenarioName::Parallel => scenarios::parallel::run(ctx).await?, ScenarioName::All => unreachable!("dispatched above"), }; - Ok(ScenarioResult { setup, ..result }) + Ok(ScenarioOutput { setup, ..output }) } /// Poll the indexer's L1-finalised block id until it catches up with the diff --git a/tools/e2e_bench/src/scenarios/amm.rs b/tools/e2e_bench/src/scenarios/amm.rs index b92bd823..6756321d 100644 --- a/tools/e2e_bench/src/scenarios/amm.rs +++ b/tools/e2e_bench/src/scenarios/amm.rs @@ -10,25 +10,25 @@ use wallet::cli::{ programs::{amm::AmmProgramAgnosticSubcommand, token::TokenProgramAgnosticSubcommand}, }; -use crate::harness::{ScenarioResult, finalize_step}; +use crate::harness::{ScenarioOutput, finalize_step}; -pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { - let mut result = ScenarioResult::new("amm_swap_flow"); +pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { + let mut output = ScenarioOutput::new("amm_swap_flow"); - let def_a = new_public_account(ctx, &mut result, "create_acc_def_a").await?; - let supply_a = new_public_account(ctx, &mut result, "create_acc_supply_a").await?; - let user_a = new_public_account(ctx, &mut result, "create_acc_user_a").await?; + let def_a = new_public_account(ctx, &mut output, "create_acc_def_a").await?; + let supply_a = new_public_account(ctx, &mut output, "create_acc_supply_a").await?; + let user_a = new_public_account(ctx, &mut output, "create_acc_user_a").await?; - let def_b = new_public_account(ctx, &mut result, "create_acc_def_b").await?; - let supply_b = new_public_account(ctx, &mut result, "create_acc_supply_b").await?; - let user_b = new_public_account(ctx, &mut result, "create_acc_user_b").await?; + let def_b = new_public_account(ctx, &mut output, "create_acc_def_b").await?; + let supply_b = new_public_account(ctx, &mut output, "create_acc_supply_b").await?; + let user_b = new_public_account(ctx, &mut output, "create_acc_user_b").await?; - let user_lp = new_public_account(ctx, &mut result, "create_acc_user_lp").await?; + let user_lp = new_public_account(ctx, &mut output, "create_acc_user_lp").await?; - timed_token_new(ctx, &mut result, "token_a_new", def_a, supply_a, "TokA").await?; + timed_token_new(ctx, &mut output, "token_a_new", def_a, supply_a, "TokA").await?; timed_token_send( ctx, - &mut result, + &mut output, "token_a_fund_user", supply_a, user_a, @@ -36,10 +36,10 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result Result Result Result Result Result { let pre_block = crate::harness::begin_step(ctx).await?; @@ -140,7 +140,7 @@ async fn new_public_account( ) .await?; let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), @@ -149,7 +149,7 @@ async fn new_public_account( async fn timed_token_new( ctx: &mut crate::bench_context::BenchContext, - result: &mut ScenarioResult, + output: &mut ScenarioOutput, label: &str, def_id: nssa::AccountId, supply_id: nssa::AccountId, @@ -168,13 +168,13 @@ async fn timed_token_new( ) .await?; let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); Ok(()) } async fn timed_token_send( ctx: &mut crate::bench_context::BenchContext, - result: &mut ScenarioResult, + output: &mut ScenarioOutput, label: &str, from_id: nssa::AccountId, to_id: nssa::AccountId, @@ -195,6 +195,6 @@ async fn timed_token_send( ) .await?; let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); Ok(()) } diff --git a/tools/e2e_bench/src/scenarios/fanout.rs b/tools/e2e_bench/src/scenarios/fanout.rs index adede185..59e9a64b 100644 --- a/tools/e2e_bench/src/scenarios/fanout.rs +++ b/tools/e2e_bench/src/scenarios/fanout.rs @@ -10,16 +10,16 @@ use wallet::cli::{ programs::token::TokenProgramAgnosticSubcommand, }; -use crate::harness::{ScenarioResult, finalize_step}; +use crate::harness::{ScenarioOutput, finalize_step}; const FANOUT_COUNT: usize = 10; const AMOUNT_PER_TRANSFER: u128 = 100; -pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { - let mut result = ScenarioResult::new("multi_recipient_fanout"); +pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { + let mut output = ScenarioOutput::new("multi_recipient_fanout"); - let def_id = new_public_account(ctx, &mut result, "create_acc_def").await?; - let supply_id = new_public_account(ctx, &mut result, "create_acc_supply").await?; + let def_id = new_public_account(ctx, &mut output, "create_acc_def").await?; + let supply_id = new_public_account(ctx, &mut output, "create_acc_supply").await?; { let pre_block = crate::harness::begin_step(ctx).await?; @@ -35,12 +35,12 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result Result Result { let pre_block = crate::harness::begin_step(ctx).await?; @@ -82,7 +82,7 @@ async fn new_public_account( ) .await?; let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), diff --git a/tools/e2e_bench/src/scenarios/parallel.rs b/tools/e2e_bench/src/scenarios/parallel.rs index 23dd2247..86368a0d 100644 --- a/tools/e2e_bench/src/scenarios/parallel.rs +++ b/tools/e2e_bench/src/scenarios/parallel.rs @@ -17,27 +17,27 @@ use wallet::cli::{ use crate::{ bench_context::BenchContext, - harness::{BlockSize, ScenarioResult, StepResult, finalize_step}, + harness::{BlockSize, ScenarioOutput, StepResult, finalize_step}, }; const PARALLEL_FANOUT_N: usize = 10; const AMOUNT_PER_TRANSFER: u128 = 100; -pub async fn run(ctx: &mut BenchContext) -> Result { - let mut result = ScenarioResult::new("parallel_fanout"); +pub async fn run(ctx: &mut BenchContext) -> Result { + let mut output = ScenarioOutput::new("parallel_fanout"); // Setup: definition, master supply, N parallel supplies, N recipients. - let def_id = new_public_account(ctx, &mut result, "create_acc_def").await?; - let master_id = new_public_account(ctx, &mut result, "create_acc_master").await?; + let def_id = new_public_account(ctx, &mut output, "create_acc_def").await?; + let master_id = new_public_account(ctx, &mut output, "create_acc_master").await?; let mut senders = Vec::with_capacity(PARALLEL_FANOUT_N); for i in 0..PARALLEL_FANOUT_N { - let id = new_public_account(ctx, &mut result, &format!("create_sender_{i:02}")).await?; + let id = new_public_account(ctx, &mut output, &format!("create_sender_{i:02}")).await?; senders.push(id); } let mut recipients = Vec::with_capacity(PARALLEL_FANOUT_N); for i in 0..PARALLEL_FANOUT_N { - let id = new_public_account(ctx, &mut result, &format!("create_recipient_{i:02}")).await?; + let id = new_public_account(ctx, &mut output, &format!("create_recipient_{i:02}")).await?; recipients.push(id); } @@ -60,7 +60,7 @@ pub async fn run(ctx: &mut BenchContext) -> Result { ) .await?; let step = finalize_step("token_new_fungible", started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); } // Fund each sender from master. Serial; this is setup, not measured throughput. @@ -81,7 +81,7 @@ pub async fn run(ctx: &mut BenchContext) -> Result { .await?; let step = finalize_step(format!("fund_sender_{i:02}"), started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); } // The measured phase: submit N transfers as fast as possible, do not wait @@ -162,14 +162,14 @@ pub async fn run(ctx: &mut BenchContext) -> Result { tx_hash: None, blocks, }; - result.push(burst_step); + output.push(burst_step); - Ok(result) + Ok(output) } async fn new_public_account( ctx: &mut BenchContext, - result: &mut ScenarioResult, + output: &mut ScenarioOutput, label: &str, ) -> Result { let pre_block = crate::harness::begin_step(ctx).await?; @@ -183,7 +183,7 @@ async fn new_public_account( ) .await?; let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), diff --git a/tools/e2e_bench/src/scenarios/private.rs b/tools/e2e_bench/src/scenarios/private.rs index 2a154673..c6ef9888 100644 --- a/tools/e2e_bench/src/scenarios/private.rs +++ b/tools/e2e_bench/src/scenarios/private.rs @@ -10,17 +10,17 @@ use wallet::cli::{ programs::token::TokenProgramAgnosticSubcommand, }; -use crate::harness::{ScenarioResult, finalize_step}; +use crate::harness::{ScenarioOutput, finalize_step}; -pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { - let mut result = ScenarioResult::new("private_chained_flow"); +pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { + let mut output = ScenarioOutput::new("private_chained_flow"); - let def_id = new_public_account(ctx, &mut result, "create_acc_def").await?; - let supply_id = new_public_account(ctx, &mut result, "create_acc_supply").await?; + let def_id = new_public_account(ctx, &mut output, "create_acc_def").await?; + let supply_id = new_public_account(ctx, &mut output, "create_acc_supply").await?; let public_recipient_id = - new_public_account(ctx, &mut result, "create_acc_pub_recipient").await?; - let private_a = new_private_account(ctx, &mut result, "create_acc_priv_a").await?; - let private_b = new_private_account(ctx, &mut result, "create_acc_priv_b").await?; + new_public_account(ctx, &mut output, "create_acc_pub_recipient").await?; + let private_a = new_private_account(ctx, &mut output, "create_acc_priv_a").await?; + let private_b = new_private_account(ctx, &mut output, "create_acc_priv_b").await?; // Mint into public supply. { @@ -37,7 +37,7 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result private_a. @@ -57,7 +57,7 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result public_recipient. @@ -77,7 +77,7 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result private_b. @@ -97,15 +97,15 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result Result { let pre_block = crate::harness::begin_step(ctx).await?; @@ -119,7 +119,7 @@ async fn new_public_account( ) .await?; let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), @@ -128,7 +128,7 @@ async fn new_public_account( async fn new_private_account( ctx: &mut crate::bench_context::BenchContext, - result: &mut ScenarioResult, + output: &mut ScenarioOutput, label: &str, ) -> Result { let pre_block = crate::harness::begin_step(ctx).await?; @@ -142,7 +142,7 @@ async fn new_private_account( ) .await?; let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), diff --git a/tools/e2e_bench/src/scenarios/token.rs b/tools/e2e_bench/src/scenarios/token.rs index c81bd8c1..24c38fc3 100644 --- a/tools/e2e_bench/src/scenarios/token.rs +++ b/tools/e2e_bench/src/scenarios/token.rs @@ -10,14 +10,14 @@ use wallet::cli::{ programs::token::TokenProgramAgnosticSubcommand, }; -use crate::harness::{ScenarioResult, finalize_step}; +use crate::harness::{ScenarioOutput, finalize_step}; -pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { - let mut result = ScenarioResult::new("token_onboarding"); +pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { + let mut output = ScenarioOutput::new("token_onboarding"); - let definition_id = new_public_account(ctx, &mut result, "create_pub_definition").await?; - let supply_id = new_public_account(ctx, &mut result, "create_pub_supply").await?; - let recipient_id = new_public_account(ctx, &mut result, "create_pub_recipient").await?; + let definition_id = new_public_account(ctx, &mut output, "create_pub_definition").await?; + let supply_id = new_public_account(ctx, &mut output, "create_pub_supply").await?; + let recipient_id = new_public_account(ctx, &mut output, "create_pub_recipient").await?; { let pre_block = crate::harness::begin_step(ctx).await?; @@ -33,7 +33,7 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result Result Result Result { let pre_block = crate::harness::begin_step(ctx).await?; @@ -96,7 +96,7 @@ async fn new_public_account( ) .await?; let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), @@ -105,7 +105,7 @@ async fn new_public_account( async fn new_private_account( ctx: &mut crate::bench_context::BenchContext, - result: &mut ScenarioResult, + output: &mut ScenarioOutput, label: &str, ) -> Result { let pre_block = crate::harness::begin_step(ctx).await?; @@ -119,7 +119,7 @@ async fn new_private_account( ) .await?; let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - result.push(step); + output.push(step); match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), From 563a9ce0f7a3f964611a6043f24b93dbc0eef00d Mon Sep 17 00:00:00 2001 From: moudyellaz Date: Wed, 20 May 2026 10:08:24 +0200 Subject: [PATCH 28/33] refactor: extract test_fixtures crate from integration_tests --- Cargo.lock | 31 +- Cargo.toml | 2 + integration_tests/Cargo.toml | 2 + integration_tests/src/lib.rs | 445 +--------------- test_fixtures/Cargo.toml | 34 ++ .../src/config.rs | 0 .../src/indexer_client.rs | 0 test_fixtures/src/lib.rs | 500 ++++++++++++++++++ .../src/setup.rs | 0 tools/e2e_bench/Cargo.toml | 2 +- tools/e2e_bench/src/bench_context.rs | 2 +- tools/e2e_bench/src/scenarios/amm.rs | 2 +- tools/e2e_bench/src/scenarios/fanout.rs | 2 +- tools/e2e_bench/src/scenarios/parallel.rs | 2 +- tools/e2e_bench/src/scenarios/private.rs | 2 +- tools/e2e_bench/src/scenarios/token.rs | 2 +- 16 files changed, 580 insertions(+), 448 deletions(-) create mode 100644 test_fixtures/Cargo.toml rename {integration_tests => test_fixtures}/src/config.rs (100%) rename {integration_tests => test_fixtures}/src/indexer_client.rs (100%) create mode 100644 test_fixtures/src/lib.rs rename {integration_tests => test_fixtures}/src/setup.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index f238fc2f..ba2b0c5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2389,7 +2389,6 @@ dependencies = [ "common", "indexer_service", "indexer_service_rpc", - "integration_tests", "jsonrpsee", "nssa", "sequencer_service", @@ -2397,6 +2396,7 @@ dependencies = [ "serde", "serde_json", "tempfile", + "test_fixtures", "tokio", "wallet", ] @@ -4016,6 +4016,7 @@ dependencies = [ "sequencer_service_rpc", "serde_json", "tempfile", + "test_fixtures", "testcontainers", "token_core", "tokio", @@ -9221,6 +9222,34 @@ dependencies = [ "test-case-core", ] +[[package]] +name = "test_fixtures" +version = "0.1.0" +dependencies = [ + "anyhow", + "bytesize", + "common", + "env_logger", + "futures", + "indexer_service", + "jsonrpsee", + "key_protocol", + "log", + "nssa", + "nssa_core", + "sequencer_core", + "sequencer_service", + "sequencer_service_rpc", + "serde", + "serde_json", + "tempfile", + "testcontainers", + "tokio", + "url", + "vault_core", + "wallet", +] + [[package]] name = "test_program_methods" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index d75e26c0..169e0cb8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,7 @@ members = [ "examples/program_deployment/methods/guest", "testnet_initial_state", "indexer/ffi", + "test_fixtures", "tools/cycle_bench", "tools/crypto_primitives_bench", "tools/e2e_bench", @@ -77,6 +78,7 @@ vault_core = { path = "programs/vault/core" } test_program_methods = { path = "test_program_methods" } testnet_initial_state = { path = "testnet_initial_state" } integration_tests = { path = "integration_tests" } +test_fixtures = { path = "test_fixtures" } tokio = { version = "1.50", features = [ "net", diff --git a/integration_tests/Cargo.toml b/integration_tests/Cargo.toml index 536f30bc..04cd8f8c 100644 --- a/integration_tests/Cargo.toml +++ b/integration_tests/Cargo.toml @@ -8,6 +8,8 @@ license = { workspace = true } workspace = true [dependencies] +test_fixtures.workspace = true + nssa_core = { workspace = true, features = ["host"] } nssa.workspace = true authenticated_transfer_core.workspace = true diff --git a/integration_tests/src/lib.rs b/integration_tests/src/lib.rs index 3662e006..d3fa7c64 100644 --- a/integration_tests/src/lib.rs +++ b/integration_tests/src/lib.rs @@ -1,441 +1,6 @@ -//! This library contains common code for integration tests. +//! Integration test helpers, re-exported from `test_fixtures` for backwards +//! compatibility. The actual fixtures live in the `test_fixtures` crate so that +//! non-test consumers (e.g. `integration_bench`) can depend on them without +//! pulling in the test files. -use std::{net::SocketAddr, sync::LazyLock}; - -use anyhow::{Context as _, Result}; -use common::{HashType, transaction::NSSATransaction}; -use futures::FutureExt as _; -use indexer_service::IndexerHandle; -use log::{debug, error}; -use nssa::{AccountId, PrivacyPreservingTransaction}; -use nssa_core::Commitment; -use sequencer_core::config::GenesisAction; -use sequencer_service::SequencerHandle; -use sequencer_service_rpc::{RpcClient as _, SequencerClient, SequencerClientBuilder}; -use tempfile::TempDir; -use testcontainers::compose::DockerCompose; -use wallet::{WalletCore, account::AccountIdWithPrivacy, cli::CliAccountMention}; - -use crate::{ - indexer_client::IndexerClient, - setup::{ - setup_bedrock_node, setup_indexer, setup_private_accounts_with_initial_supply, - setup_public_accounts_with_initial_supply, setup_sequencer, setup_wallet, - }, -}; - -pub mod config; -pub mod indexer_client; -pub mod setup; - -// TODO: Remove this and control time from tests -pub const TIME_TO_WAIT_FOR_BLOCK_SECONDS: u64 = 12; -pub const NSSA_PROGRAM_FOR_TEST_DATA_CHANGER: &str = "data_changer.bin"; -pub const NSSA_PROGRAM_FOR_TEST_NOOP: &str = "noop.bin"; -pub const NSSA_PROGRAM_FOR_TEST_PDA_FUND_SPEND_PROXY: &str = "pda_fund_spend_proxy.bin"; - -const BEDROCK_SERVICE_WITH_OPEN_PORT: &str = "logos-blockchain-node-0"; -const BEDROCK_SERVICE_PORT: u16 = 18080; - -static LOGGER: LazyLock<()> = LazyLock::new(env_logger::init); - -struct IndexerComponents { - indexer_handle: IndexerHandle, - indexer_client: IndexerClient, - _temp_dir: TempDir, -} - -impl Drop for IndexerComponents { - fn drop(&mut self) { - let Self { - indexer_handle, - indexer_client: _, - _temp_dir: _, - } = self; - - if !indexer_handle.is_healthy() { - error!("Indexer handle has unexpectedly stopped before IndexerComponents drop"); - } - } -} - -/// Test context which sets up a sequencer and a wallet for integration tests. -/// -/// It's memory and logically safe to create multiple instances of this struct in parallel tests, -/// as each instance uses its own temporary directories for sequencer and wallet data. -// NOTE: Order of fields is important for proper drop order. -pub struct TestContext { - sequencer_client: SequencerClient, - wallet: WalletCore, - wallet_password: String, - /// Optional to move out value in Drop. - sequencer_handle: Option, - indexer_components: Option, - bedrock_compose: DockerCompose, - bedrock_addr: SocketAddr, - _temp_sequencer_dir: TempDir, - _temp_wallet_dir: TempDir, -} - -impl TestContext { - /// Create new test context. - pub async fn new() -> Result { - Self::builder().build().await - } - - /// Get a builder for the test context to customize its configuration. - #[must_use] - pub const fn builder() -> TestContextBuilder { - TestContextBuilder::new() - } - - /// Get reference to the wallet. - #[must_use] - pub const fn wallet(&self) -> &WalletCore { - &self.wallet - } - - #[must_use] - pub fn wallet_password(&self) -> &str { - &self.wallet_password - } - - /// Get mutable reference to the wallet. - pub const fn wallet_mut(&mut self) -> &mut WalletCore { - &mut self.wallet - } - - /// Get reference to the sequencer client. - #[must_use] - pub const fn sequencer_client(&self) -> &SequencerClient { - &self.sequencer_client - } - - /// Get the Bedrock Node address. - #[must_use] - pub const fn bedrock_addr(&self) -> SocketAddr { - self.bedrock_addr - } - - /// Get reference to the indexer. - /// - /// # Panics - /// - /// Panics if the indexer is not enabled in the test context. See - /// [`TestContextBuilder::disable_indexer()`]. - #[must_use] - pub fn indexer(&self) -> &IndexerHandle { - self.indexer_components - .as_ref() - .map(|components| &components.indexer_handle) - .expect("Called `TestContext::indexer()` on context with disabled indexer") - } - - /// Get reference to the indexer client. - /// - /// # Panics - /// - /// Panics if the indexer is not enabled in the test context. See - /// [`TestContextBuilder::disable_indexer()`]. - #[must_use] - pub fn indexer_client(&self) -> &IndexerClient { - self.indexer_components - .as_ref() - .map(|components| &components.indexer_client) - .expect("Called `TestContext::indexer_client()` on context with disabled indexer") - } - - /// Get existing public account IDs in the wallet. - #[must_use] - pub fn existing_public_accounts(&self) -> Vec { - self.wallet - .storage() - .key_chain() - .public_account_ids() - .map(|(account_id, _idx)| account_id) - .collect() - } - - /// Get existing private account IDs in the wallet. - #[must_use] - pub fn existing_private_accounts(&self) -> Vec { - self.wallet - .storage() - .key_chain() - .private_account_ids() - .map(|(account_id, _idx)| account_id) - .collect() - } -} - -impl Drop for TestContext { - fn drop(&mut self) { - let Self { - sequencer_handle, - bedrock_compose, - bedrock_addr: _, - indexer_components: _, - sequencer_client: _, - wallet: _, - wallet_password: _, - _temp_sequencer_dir: _, - _temp_wallet_dir: _, - } = self; - - let sequencer_handle = sequencer_handle - .take() - .expect("Sequencer handle should be present in TestContext drop"); - if !sequencer_handle.is_healthy() { - let Err(err) = sequencer_handle - .failed() - .now_or_never() - .expect("Sequencer handle should not be running"); - error!( - "Sequencer handle has unexpectedly stopped before TestContext drop with error: {err:#}" - ); - } - - let container = bedrock_compose - .service(BEDROCK_SERVICE_WITH_OPEN_PORT) - .unwrap_or_else(|| { - panic!("Failed to get Bedrock service container `{BEDROCK_SERVICE_WITH_OPEN_PORT}`") - }); - let output = std::process::Command::new("docker") - .args(["inspect", "-f", "{{.State.Running}}", container.id()]) - .output() - .expect("Failed to execute docker inspect command to check if Bedrock container is still running"); - let stdout = String::from_utf8(output.stdout) - .expect("Failed to parse docker inspect output as String"); - if stdout.trim() != "true" { - error!( - "Bedrock container `{}` is not running during TestContext drop, docker inspect output: {stdout}", - container.id() - ); - } - } -} - -pub struct TestContextBuilder { - genesis_transactions: Option>, - sequencer_partial_config: Option, - enable_indexer: bool, -} - -impl TestContextBuilder { - const fn new() -> Self { - Self { - genesis_transactions: None, - sequencer_partial_config: None, - enable_indexer: true, - } - } - - #[must_use] - pub fn with_genesis(mut self, genesis_transactions: Vec) -> Self { - self.genesis_transactions = Some(genesis_transactions); - self - } - - #[must_use] - pub const fn with_sequencer_partial_config( - mut self, - sequencer_partial_config: config::SequencerPartialConfig, - ) -> Self { - self.sequencer_partial_config = Some(sequencer_partial_config); - self - } - - /// Exclude Indexer from test context. - /// Indexer is enabled by default. - /// - /// Methods like [`TestContext::indexer()`] and [`TestContext::indexer_client()`] will panic if - /// called when indexer is disabled. - #[must_use] - pub const fn disable_indexer(mut self) -> Self { - self.enable_indexer = false; - self - } - - pub async fn build(self) -> Result { - let Self { - genesis_transactions, - sequencer_partial_config, - enable_indexer, - } = self; - - // Ensure logger is initialized only once - *LOGGER; - - debug!("Test context setup"); - - let (bedrock_compose, bedrock_addr) = setup_bedrock_node() - .await - .context("Failed to setup Bedrock node")?; - - let indexer_components = if enable_indexer { - let (indexer_handle, temp_indexer_dir) = setup_indexer(bedrock_addr) - .await - .context("Failed to setup Indexer")?; - let indexer_url = config::addr_to_url(config::UrlProtocol::Ws, indexer_handle.addr()) - .context("Failed to convert indexer addr to URL")?; - let indexer_client = IndexerClient::new(&indexer_url) - .await - .context("Failed to create indexer client")?; - Some(IndexerComponents { - indexer_handle, - indexer_client, - _temp_dir: temp_indexer_dir, - }) - } else { - None - }; - - let initial_public_accounts = config::default_public_accounts_for_wallet(); - let initial_private_accounts = config::default_private_accounts_for_wallet(); - let (sequencer_handle, temp_sequencer_dir) = setup_sequencer( - sequencer_partial_config.unwrap_or_default(), - bedrock_addr, - genesis_transactions.unwrap_or_else(|| { - config::genesis_from_accounts(&initial_public_accounts, &initial_private_accounts) - }), - ) - .await - .context("Failed to setup Sequencer")?; - - let (mut wallet, temp_wallet_dir, wallet_password) = setup_wallet( - sequencer_handle.addr(), - &initial_public_accounts, - &initial_private_accounts, - ) - .context("Failed to setup wallet")?; - - setup_public_accounts_with_initial_supply(&wallet, &initial_public_accounts) - .await - .context("Failed to initialize public accounts in wallet")?; - - setup_private_accounts_with_initial_supply(&mut wallet, &initial_private_accounts) - .await - .context("Failed to initialize private accounts in wallet")?; - - let sequencer_url = config::addr_to_url(config::UrlProtocol::Http, sequencer_handle.addr()) - .context("Failed to convert sequencer addr to URL")?; - let sequencer_client = SequencerClientBuilder::default() - .build(sequencer_url) - .context("Failed to create sequencer client")?; - - Ok(TestContext { - sequencer_client, - wallet, - wallet_password, - bedrock_compose, - bedrock_addr, - sequencer_handle: Some(sequencer_handle), - indexer_components, - _temp_sequencer_dir: temp_sequencer_dir, - _temp_wallet_dir: temp_wallet_dir, - }) - } - - pub fn build_blocking(self) -> Result { - let runtime = tokio::runtime::Runtime::new().context("Failed to create Tokio runtime")?; - - let ctx = runtime.block_on(self.build())?; - - Ok(BlockingTestContext { - ctx: Some(ctx), - runtime, - }) - } -} -/// A test context to be used in normal #[test] tests. -pub struct BlockingTestContext { - ctx: Option, - runtime: tokio::runtime::Runtime, -} - -impl BlockingTestContext { - pub fn new() -> Result { - TestContext::builder().build_blocking() - } - - pub const fn ctx(&self) -> &TestContext { - self.ctx.as_ref().expect("TestContext is set") - } - - pub const fn runtime(&self) -> &tokio::runtime::Runtime { - &self.runtime - } - - pub fn block_on<'ctx, F>(&'ctx self, f: impl FnOnce(&'ctx TestContext) -> F) -> F::Output - where - F: std::future::Future + 'ctx, - { - let future = f(self.ctx()); - self.runtime.block_on(future) - } - - pub fn block_on_mut<'ctx, F>( - &'ctx mut self, - f: impl FnOnce(&'ctx mut TestContext) -> F, - ) -> F::Output - where - F: std::future::Future + 'ctx, - { - let ctx_mut = self.ctx.as_mut().expect("TestContext is set"); - let future = f(ctx_mut); - self.runtime.block_on(future) - } -} - -impl Drop for BlockingTestContext { - fn drop(&mut self) { - let Self { ctx, runtime } = self; - - // Ensure async cleanup of TestContext by blocking on its drop in the runtime. - runtime.block_on(async { - if let Some(ctx) = ctx.take() { - drop(ctx); - } - }); - } -} - -#[must_use] -pub const fn public_mention(account_id: AccountId) -> CliAccountMention { - CliAccountMention::Id(AccountIdWithPrivacy::Public(account_id)) -} - -#[must_use] -pub const fn private_mention(account_id: AccountId) -> CliAccountMention { - CliAccountMention::Id(AccountIdWithPrivacy::Private(account_id)) -} - -#[expect( - clippy::wildcard_enum_match_arm, - reason = "We want the code to panic if the transaction type is not PrivacyPreserving" -)] -pub async fn fetch_privacy_preserving_tx( - seq_client: &SequencerClient, - tx_hash: HashType, -) -> PrivacyPreservingTransaction { - let tx = seq_client.get_transaction(tx_hash).await.unwrap().unwrap(); - - match tx { - NSSATransaction::PrivacyPreserving(privacy_preserving_transaction) => { - privacy_preserving_transaction - } - _ => panic!("Invalid tx type"), - } -} - -pub async fn verify_commitment_is_in_state( - commitment: Commitment, - seq_client: &SequencerClient, -) -> bool { - seq_client - .get_proof_for_commitment(commitment) - .await - .ok() - .flatten() - .is_some() -} +pub use test_fixtures::*; diff --git a/test_fixtures/Cargo.toml b/test_fixtures/Cargo.toml new file mode 100644 index 00000000..1bfd2284 --- /dev/null +++ b/test_fixtures/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "test_fixtures" +version = "0.1.0" +edition = "2024" +license = { workspace = true } +publish = false + +[lints] +workspace = true + +[dependencies] +common.workspace = true +indexer_service.workspace = true +key_protocol.workspace = true +nssa.workspace = true +nssa_core = { workspace = true, features = ["host"] } +sequencer_core = { workspace = true, features = ["default", "testnet"] } +sequencer_service.workspace = true +sequencer_service_rpc = { workspace = true, features = ["client"] } +vault_core.workspace = true +wallet.workspace = true + +anyhow.workspace = true +bytesize.workspace = true +env_logger.workspace = true +futures.workspace = true +jsonrpsee = { workspace = true, features = ["ws-client"] } +log.workspace = true +serde.workspace = true +serde_json.workspace = true +tempfile.workspace = true +testcontainers = { version = "0.27.3", features = ["docker-compose"] } +tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } +url.workspace = true diff --git a/integration_tests/src/config.rs b/test_fixtures/src/config.rs similarity index 100% rename from integration_tests/src/config.rs rename to test_fixtures/src/config.rs diff --git a/integration_tests/src/indexer_client.rs b/test_fixtures/src/indexer_client.rs similarity index 100% rename from integration_tests/src/indexer_client.rs rename to test_fixtures/src/indexer_client.rs diff --git a/test_fixtures/src/lib.rs b/test_fixtures/src/lib.rs new file mode 100644 index 00000000..da2b7be2 --- /dev/null +++ b/test_fixtures/src/lib.rs @@ -0,0 +1,500 @@ +//! Shared test/bench fixtures: spins up bedrock + sequencer + indexer + wallet +//! end-to-end against docker-compose, exposes a `TestContext` callers can drive. +//! +//! Originally lived under `integration_tests`; split out so non-test consumers +//! (e.g. `integration_bench`) can depend on the fixtures without pulling in the +//! `integration_tests` test files. + +use std::{net::SocketAddr, path::Path, sync::LazyLock}; + +use anyhow::{Context as _, Result}; +use common::{HashType, transaction::NSSATransaction}; +use futures::FutureExt as _; +use indexer_service::IndexerHandle; +use log::{debug, error}; +use nssa::{AccountId, PrivacyPreservingTransaction}; +use nssa_core::Commitment; +use sequencer_core::config::GenesisAction; +use sequencer_service::SequencerHandle; +use sequencer_service_rpc::{RpcClient as _, SequencerClient, SequencerClientBuilder}; +use serde::Serialize; +use tempfile::TempDir; +use testcontainers::compose::DockerCompose; +use wallet::{WalletCore, account::AccountIdWithPrivacy, cli::CliAccountMention}; + +use crate::{ + indexer_client::IndexerClient, + setup::{ + setup_bedrock_node, setup_indexer, setup_private_accounts_with_initial_supply, + setup_public_accounts_with_initial_supply, setup_sequencer, setup_wallet, + }, +}; + +pub mod config; +pub mod indexer_client; +pub mod setup; + +// TODO: Remove this and control time from tests +pub const TIME_TO_WAIT_FOR_BLOCK_SECONDS: u64 = 12; +pub const NSSA_PROGRAM_FOR_TEST_DATA_CHANGER: &str = "data_changer.bin"; +pub const NSSA_PROGRAM_FOR_TEST_NOOP: &str = "noop.bin"; +pub const NSSA_PROGRAM_FOR_TEST_PDA_FUND_SPEND_PROXY: &str = "pda_fund_spend_proxy.bin"; + +pub(crate) const BEDROCK_SERVICE_WITH_OPEN_PORT: &str = "logos-blockchain-node-0"; +pub(crate) const BEDROCK_SERVICE_PORT: u16 = 18080; + +static LOGGER: LazyLock<()> = LazyLock::new(env_logger::init); + +struct IndexerComponents { + indexer_handle: IndexerHandle, + indexer_client: IndexerClient, + temp_dir: TempDir, +} + +impl Drop for IndexerComponents { + fn drop(&mut self) { + let Self { + indexer_handle, + indexer_client: _, + temp_dir: _, + } = self; + + if !indexer_handle.is_healthy() { + error!("Indexer handle has unexpectedly stopped before IndexerComponents drop"); + } + } +} + +/// Recursively-sized bytes on disk for sequencer / indexer / wallet tempdirs. +#[derive(Debug, Clone, Copy, Default, Serialize)] +pub struct DiskSizes { + pub sequencer_bytes: u64, + pub indexer_bytes: u64, + pub wallet_bytes: u64, +} + +/// Test context which sets up a sequencer and a wallet for integration tests. +/// +/// It's memory and logically safe to create multiple instances of this struct in parallel tests, +/// as each instance uses its own temporary directories for sequencer and wallet data. +// NOTE: Order of fields is important for proper drop order. +pub struct TestContext { + sequencer_client: SequencerClient, + wallet: WalletCore, + wallet_password: String, + /// Optional to move out value in Drop. + sequencer_handle: Option, + indexer_components: Option, + bedrock_compose: DockerCompose, + bedrock_addr: SocketAddr, + temp_sequencer_dir: TempDir, + temp_wallet_dir: TempDir, +} + +impl TestContext { + /// Create new test context. + pub async fn new() -> Result { + Self::builder().build().await + } + + /// Get a builder for the test context to customize its configuration. + #[must_use] + pub const fn builder() -> TestContextBuilder { + TestContextBuilder::new() + } + + /// Get reference to the wallet. + #[must_use] + pub const fn wallet(&self) -> &WalletCore { + &self.wallet + } + + #[must_use] + pub fn wallet_password(&self) -> &str { + &self.wallet_password + } + + /// Get mutable reference to the wallet. + pub const fn wallet_mut(&mut self) -> &mut WalletCore { + &mut self.wallet + } + + /// Get reference to the sequencer client. + #[must_use] + pub const fn sequencer_client(&self) -> &SequencerClient { + &self.sequencer_client + } + + /// Get the Bedrock Node address. + #[must_use] + pub const fn bedrock_addr(&self) -> SocketAddr { + self.bedrock_addr + } + + /// Get reference to the indexer. + /// + /// # Panics + /// + /// Panics if the indexer is not enabled in the test context. See + /// [`TestContextBuilder::disable_indexer()`]. + #[must_use] + pub fn indexer(&self) -> &IndexerHandle { + self.indexer_components + .as_ref() + .map(|components| &components.indexer_handle) + .expect("Called `TestContext::indexer()` on context with disabled indexer") + } + + /// Get the indexer's bound socket address. + /// + /// # Panics + /// + /// Panics if the indexer is not enabled in the test context. + #[must_use] + pub fn indexer_addr(&self) -> SocketAddr { + self.indexer().addr() + } + + /// Get reference to the indexer client. + /// + /// # Panics + /// + /// Panics if the indexer is not enabled in the test context. See + /// [`TestContextBuilder::disable_indexer()`]. + #[must_use] + pub fn indexer_client(&self) -> &IndexerClient { + self.indexer_components + .as_ref() + .map(|components| &components.indexer_client) + .expect("Called `TestContext::indexer_client()` on context with disabled indexer") + } + + /// Recursively-sized bytes on disk for sequencer + indexer + wallet tempdirs. + /// Indexer bytes are zero if the indexer is disabled. + #[must_use] + pub fn disk_sizes(&self) -> DiskSizes { + DiskSizes { + sequencer_bytes: dir_size_bytes(self.temp_sequencer_dir.path()), + indexer_bytes: self + .indexer_components + .as_ref() + .map_or(0, |c| dir_size_bytes(c.temp_dir.path())), + wallet_bytes: dir_size_bytes(self.temp_wallet_dir.path()), + } + } + + /// Get existing public account IDs in the wallet. + #[must_use] + pub fn existing_public_accounts(&self) -> Vec { + self.wallet + .storage() + .key_chain() + .public_account_ids() + .map(|(account_id, _idx)| account_id) + .collect() + } + + /// Get existing private account IDs in the wallet. + #[must_use] + pub fn existing_private_accounts(&self) -> Vec { + self.wallet + .storage() + .key_chain() + .private_account_ids() + .map(|(account_id, _idx)| account_id) + .collect() + } +} + +impl Drop for TestContext { + fn drop(&mut self) { + let Self { + sequencer_handle, + bedrock_compose, + bedrock_addr: _, + indexer_components: _, + sequencer_client: _, + wallet: _, + wallet_password: _, + temp_sequencer_dir: _, + temp_wallet_dir: _, + } = self; + + let sequencer_handle = sequencer_handle + .take() + .expect("Sequencer handle should be present in TestContext drop"); + if !sequencer_handle.is_healthy() { + let Err(err) = sequencer_handle + .failed() + .now_or_never() + .expect("Sequencer handle should not be running"); + error!( + "Sequencer handle has unexpectedly stopped before TestContext drop with error: {err:#}" + ); + } + + let container = bedrock_compose + .service(BEDROCK_SERVICE_WITH_OPEN_PORT) + .unwrap_or_else(|| { + panic!("Failed to get Bedrock service container `{BEDROCK_SERVICE_WITH_OPEN_PORT}`") + }); + let output = std::process::Command::new("docker") + .args(["inspect", "-f", "{{.State.Running}}", container.id()]) + .output() + .expect("Failed to execute docker inspect command to check if Bedrock container is still running"); + let stdout = String::from_utf8(output.stdout) + .expect("Failed to parse docker inspect output as String"); + if stdout.trim() != "true" { + error!( + "Bedrock container `{}` is not running during TestContext drop, docker inspect output: {stdout}", + container.id() + ); + } + } +} + +pub struct TestContextBuilder { + genesis_transactions: Option>, + sequencer_partial_config: Option, + enable_indexer: bool, +} + +impl TestContextBuilder { + const fn new() -> Self { + Self { + genesis_transactions: None, + sequencer_partial_config: None, + enable_indexer: true, + } + } + + #[must_use] + pub fn with_genesis(mut self, genesis_transactions: Vec) -> Self { + self.genesis_transactions = Some(genesis_transactions); + self + } + + #[must_use] + pub const fn with_sequencer_partial_config( + mut self, + sequencer_partial_config: config::SequencerPartialConfig, + ) -> Self { + self.sequencer_partial_config = Some(sequencer_partial_config); + self + } + + /// Exclude Indexer from test context. + /// Indexer is enabled by default. + /// + /// Methods like [`TestContext::indexer()`] and [`TestContext::indexer_client()`] will panic if + /// called when indexer is disabled. + #[must_use] + pub const fn disable_indexer(mut self) -> Self { + self.enable_indexer = false; + self + } + + pub async fn build(self) -> Result { + let Self { + genesis_transactions, + sequencer_partial_config, + enable_indexer, + } = self; + + // Ensure logger is initialized only once + *LOGGER; + + debug!("Test context setup"); + + let (bedrock_compose, bedrock_addr) = setup_bedrock_node() + .await + .context("Failed to setup Bedrock node")?; + + let indexer_components = if enable_indexer { + let (indexer_handle, temp_indexer_dir) = setup_indexer(bedrock_addr) + .await + .context("Failed to setup Indexer")?; + let indexer_url = config::addr_to_url(config::UrlProtocol::Ws, indexer_handle.addr()) + .context("Failed to convert indexer addr to URL")?; + let indexer_client = IndexerClient::new(&indexer_url) + .await + .context("Failed to create indexer client")?; + Some(IndexerComponents { + indexer_handle, + indexer_client, + temp_dir: temp_indexer_dir, + }) + } else { + None + }; + + let initial_public_accounts = config::default_public_accounts_for_wallet(); + let initial_private_accounts = config::default_private_accounts_for_wallet(); + let (sequencer_handle, temp_sequencer_dir) = setup_sequencer( + sequencer_partial_config.unwrap_or_default(), + bedrock_addr, + genesis_transactions.unwrap_or_else(|| { + config::genesis_from_accounts(&initial_public_accounts, &initial_private_accounts) + }), + ) + .await + .context("Failed to setup Sequencer")?; + + let (mut wallet, temp_wallet_dir, wallet_password) = setup_wallet( + sequencer_handle.addr(), + &initial_public_accounts, + &initial_private_accounts, + ) + .context("Failed to setup wallet")?; + + setup_public_accounts_with_initial_supply(&wallet, &initial_public_accounts) + .await + .context("Failed to initialize public accounts in wallet")?; + + setup_private_accounts_with_initial_supply(&mut wallet, &initial_private_accounts) + .await + .context("Failed to initialize private accounts in wallet")?; + + let sequencer_url = config::addr_to_url(config::UrlProtocol::Http, sequencer_handle.addr()) + .context("Failed to convert sequencer addr to URL")?; + let sequencer_client = SequencerClientBuilder::default() + .build(sequencer_url) + .context("Failed to create sequencer client")?; + + Ok(TestContext { + sequencer_client, + wallet, + wallet_password, + bedrock_compose, + bedrock_addr, + sequencer_handle: Some(sequencer_handle), + indexer_components, + temp_sequencer_dir, + temp_wallet_dir, + }) + } + + pub fn build_blocking(self) -> Result { + let runtime = tokio::runtime::Runtime::new().context("Failed to create Tokio runtime")?; + + let ctx = runtime.block_on(self.build())?; + + Ok(BlockingTestContext { + ctx: Some(ctx), + runtime, + }) + } +} +/// A test context to be used in normal #[test] tests. +pub struct BlockingTestContext { + ctx: Option, + runtime: tokio::runtime::Runtime, +} + +impl BlockingTestContext { + pub fn new() -> Result { + TestContext::builder().build_blocking() + } + + pub const fn ctx(&self) -> &TestContext { + self.ctx.as_ref().expect("TestContext is set") + } + + pub const fn runtime(&self) -> &tokio::runtime::Runtime { + &self.runtime + } + + pub fn block_on<'ctx, F>(&'ctx self, f: impl FnOnce(&'ctx TestContext) -> F) -> F::Output + where + F: std::future::Future + 'ctx, + { + let future = f(self.ctx()); + self.runtime.block_on(future) + } + + pub fn block_on_mut<'ctx, F>( + &'ctx mut self, + f: impl FnOnce(&'ctx mut TestContext) -> F, + ) -> F::Output + where + F: std::future::Future + 'ctx, + { + let ctx_mut = self.ctx.as_mut().expect("TestContext is set"); + let future = f(ctx_mut); + self.runtime.block_on(future) + } +} + +impl Drop for BlockingTestContext { + fn drop(&mut self) { + let Self { ctx, runtime } = self; + + // Ensure async cleanup of TestContext by blocking on its drop in the runtime. + runtime.block_on(async { + if let Some(ctx) = ctx.take() { + drop(ctx); + } + }); + } +} + +#[must_use] +pub const fn public_mention(account_id: AccountId) -> CliAccountMention { + CliAccountMention::Id(AccountIdWithPrivacy::Public(account_id)) +} + +#[must_use] +pub const fn private_mention(account_id: AccountId) -> CliAccountMention { + CliAccountMention::Id(AccountIdWithPrivacy::Private(account_id)) +} + +#[expect( + clippy::wildcard_enum_match_arm, + reason = "We want the code to panic if the transaction type is not PrivacyPreserving" +)] +pub async fn fetch_privacy_preserving_tx( + seq_client: &SequencerClient, + tx_hash: HashType, +) -> PrivacyPreservingTransaction { + let tx = seq_client.get_transaction(tx_hash).await.unwrap().unwrap(); + + match tx { + NSSATransaction::PrivacyPreserving(privacy_preserving_transaction) => { + privacy_preserving_transaction + } + _ => panic!("Invalid tx type"), + } +} + +pub async fn verify_commitment_is_in_state( + commitment: Commitment, + seq_client: &SequencerClient, +) -> bool { + seq_client + .get_proof_for_commitment(commitment) + .await + .ok() + .flatten() + .is_some() +} + +fn dir_size_bytes(path: &Path) -> u64 { + let mut total = 0_u64; + let Ok(entries) = std::fs::read_dir(path) else { + return 0; + }; + for entry in entries.flatten() { + let Ok(metadata) = entry.metadata() else { + continue; + }; + if metadata.is_file() { + total = total.saturating_add(metadata.len()); + } else if metadata.is_dir() { + total = total.saturating_add(dir_size_bytes(&entry.path())); + } else { + // Sockets, FIFOs, block/char devices: ignore. Symlinks are + // already followed by `is_file()` / `is_dir()`. + } + } + total +} diff --git a/integration_tests/src/setup.rs b/test_fixtures/src/setup.rs similarity index 100% rename from integration_tests/src/setup.rs rename to test_fixtures/src/setup.rs diff --git a/tools/e2e_bench/Cargo.toml b/tools/e2e_bench/Cargo.toml index ab6a6eb0..97d34f53 100644 --- a/tools/e2e_bench/Cargo.toml +++ b/tools/e2e_bench/Cargo.toml @@ -12,10 +12,10 @@ workspace = true common.workspace = true indexer_service.workspace = true indexer_service_rpc = { workspace = true, features = ["client"] } -integration_tests.workspace = true nssa.workspace = true sequencer_service.workspace = true sequencer_service_rpc = { workspace = true, features = ["client"] } +test_fixtures.workspace = true wallet.workspace = true anyhow.workspace = true diff --git a/tools/e2e_bench/src/bench_context.rs b/tools/e2e_bench/src/bench_context.rs index 41f0d59d..e3de508e 100644 --- a/tools/e2e_bench/src/bench_context.rs +++ b/tools/e2e_bench/src/bench_context.rs @@ -15,7 +15,7 @@ use std::{env, net::SocketAddr, path::Path}; use anyhow::{Context as _, Result}; use indexer_service::IndexerHandle; -use integration_tests::config::{ +use test_fixtures::config::{ SequencerPartialConfig, UrlProtocol, addr_to_url, default_private_accounts_for_wallet, default_public_accounts_for_wallet, genesis_from_accounts, indexer_config, sequencer_config, wallet_config, diff --git a/tools/e2e_bench/src/scenarios/amm.rs b/tools/e2e_bench/src/scenarios/amm.rs index 6756321d..f295a4aa 100644 --- a/tools/e2e_bench/src/scenarios/amm.rs +++ b/tools/e2e_bench/src/scenarios/amm.rs @@ -3,7 +3,7 @@ use std::time::Instant; use anyhow::{Result, bail}; -use integration_tests::public_mention; +use test_fixtures::public_mention; use wallet::cli::{ Command, SubcommandReturnValue, account::{AccountSubcommand, NewSubcommand}, diff --git a/tools/e2e_bench/src/scenarios/fanout.rs b/tools/e2e_bench/src/scenarios/fanout.rs index 59e9a64b..6f85a974 100644 --- a/tools/e2e_bench/src/scenarios/fanout.rs +++ b/tools/e2e_bench/src/scenarios/fanout.rs @@ -3,7 +3,7 @@ use std::time::Instant; use anyhow::{Result, bail}; -use integration_tests::public_mention; +use test_fixtures::public_mention; use wallet::cli::{ Command, SubcommandReturnValue, account::{AccountSubcommand, NewSubcommand}, diff --git a/tools/e2e_bench/src/scenarios/parallel.rs b/tools/e2e_bench/src/scenarios/parallel.rs index 86368a0d..29c3a72f 100644 --- a/tools/e2e_bench/src/scenarios/parallel.rs +++ b/tools/e2e_bench/src/scenarios/parallel.rs @@ -7,7 +7,7 @@ use std::time::Instant; use anyhow::{Result, bail}; use common::transaction::NSSATransaction; -use integration_tests::public_mention; +use test_fixtures::public_mention; use sequencer_service_rpc::RpcClient as _; use wallet::cli::{ Command, SubcommandReturnValue, diff --git a/tools/e2e_bench/src/scenarios/private.rs b/tools/e2e_bench/src/scenarios/private.rs index c6ef9888..f0b4745b 100644 --- a/tools/e2e_bench/src/scenarios/private.rs +++ b/tools/e2e_bench/src/scenarios/private.rs @@ -3,7 +3,7 @@ use std::time::Instant; use anyhow::{Result, bail}; -use integration_tests::{private_mention, public_mention}; +use test_fixtures::{private_mention, public_mention}; use wallet::cli::{ Command, SubcommandReturnValue, account::{AccountSubcommand, NewSubcommand}, diff --git a/tools/e2e_bench/src/scenarios/token.rs b/tools/e2e_bench/src/scenarios/token.rs index 24c38fc3..4e63da32 100644 --- a/tools/e2e_bench/src/scenarios/token.rs +++ b/tools/e2e_bench/src/scenarios/token.rs @@ -3,7 +3,7 @@ use std::time::Instant; use anyhow::{Result, bail}; -use integration_tests::{private_mention, public_mention}; +use test_fixtures::{private_mention, public_mention}; use wallet::cli::{ Command, SubcommandReturnValue, account::{AccountSubcommand, NewSubcommand}, From 0119b38c1be882c2baeb50c655c934dd0811e795 Mon Sep 17 00:00:00 2001 From: moudyellaz Date: Wed, 20 May 2026 11:04:06 +0200 Subject: [PATCH 29/33] refactor(integration_bench)!: pivot to docker-compose via TestContext, share one node per run MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING CHANGE: - crate renamed e2e_bench → integration_bench. Run via `cargo run -p integration_bench`. - env vars removed: LEZ_BEDROCK_BIN, LEZ_BEDROCK_CONFIG_DIR, LEZ_BEDROCK_PORT. Replaced by a docker prerequisite (docker-compose Bedrock via test_fixtures::TestContext). - output filenames: target/e2e_bench_{dev,prove}.json → target/integration_bench_{dev,prove}.json. - JSON schema: per-scenario `setup_s` field removed; replaced by run-level `shared_setup_s` (one TestContext is shared across all scenarios in a run). - internal: bedrock_handle.rs and bench_context.rs deleted; placeholder-string config (PLACEHOLDER_CHAIN_START_TIME) gone. --- Cargo.lock | 42 ++-- Cargo.toml | 2 +- docs/benchmarks/README.md | 2 +- .../{e2e_bench.md => integration_bench.md} | 31 ++- tools/e2e_bench/README.md | 33 --- tools/e2e_bench/src/bedrock_handle.rs | 152 ------------- tools/e2e_bench/src/bench_context.rs | 210 ------------------ .../Cargo.toml | 6 +- tools/integration_bench/README.md | 27 +++ .../src/harness.rs | 20 +- .../src/main.rs | 112 ++++------ .../src/scenarios/amm.rs | 8 +- .../src/scenarios/fanout.rs | 4 +- .../src/scenarios/mod.rs | 0 .../src/scenarios/parallel.rs | 11 +- .../src/scenarios/private.rs | 6 +- .../src/scenarios/token.rs | 6 +- 17 files changed, 135 insertions(+), 537 deletions(-) rename docs/benchmarks/{e2e_bench.md => integration_bench.md} (62%) delete mode 100644 tools/e2e_bench/README.md delete mode 100644 tools/e2e_bench/src/bedrock_handle.rs delete mode 100644 tools/e2e_bench/src/bench_context.rs rename tools/{e2e_bench => integration_bench}/Cargo.toml (82%) create mode 100644 tools/integration_bench/README.md rename tools/{e2e_bench => integration_bench}/src/harness.rs (95%) rename tools/{e2e_bench => integration_bench}/src/main.rs (60%) rename tools/{e2e_bench => integration_bench}/src/scenarios/amm.rs (96%) rename tools/{e2e_bench => integration_bench}/src/scenarios/fanout.rs (95%) rename tools/{e2e_bench => integration_bench}/src/scenarios/mod.rs (100%) rename tools/{e2e_bench => integration_bench}/src/scenarios/parallel.rs (96%) rename tools/{e2e_bench => integration_bench}/src/scenarios/private.rs (96%) rename tools/{e2e_bench => integration_bench}/src/scenarios/token.rs (95%) diff --git a/Cargo.lock b/Cargo.lock index ba2b0c5b..7efb7761 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2378,29 +2378,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" -[[package]] -name = "e2e_bench" -version = "0.1.0" -dependencies = [ - "anyhow", - "borsh", - "chrono", - "clap", - "common", - "indexer_service", - "indexer_service_rpc", - "jsonrpsee", - "nssa", - "sequencer_service", - "sequencer_service_rpc", - "serde", - "serde_json", - "tempfile", - "test_fixtures", - "tokio", - "wallet", -] - [[package]] name = "ecdsa" version = "0.16.9" @@ -3989,6 +3966,25 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "integration_bench" +version = "0.1.0" +dependencies = [ + "anyhow", + "borsh", + "clap", + "common", + "indexer_service_rpc", + "jsonrpsee", + "nssa", + "sequencer_service_rpc", + "serde", + "serde_json", + "test_fixtures", + "tokio", + "wallet", +] + [[package]] name = "integration_tests" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 169e0cb8..ce67c92a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,7 +44,7 @@ members = [ "test_fixtures", "tools/cycle_bench", "tools/crypto_primitives_bench", - "tools/e2e_bench", + "tools/integration_bench", ] [workspace.dependencies] diff --git a/docs/benchmarks/README.md b/docs/benchmarks/README.md index db539966..d745f2f3 100644 --- a/docs/benchmarks/README.md +++ b/docs/benchmarks/README.md @@ -6,6 +6,6 @@ Bench tools live under `tools/` with READMEs for how to run each one. This direc |---|---| | cycle_bench | [cycle_bench.md](cycle_bench.md) | | crypto_primitives_bench | [crypto_primitives_bench.md](crypto_primitives_bench.md) | -| e2e_bench | [e2e_bench.md](e2e_bench.md) | +| integration_bench | [integration_bench.md](integration_bench.md) | All numbers are from a single M2 Pro dev box unless noted otherwise. diff --git a/docs/benchmarks/e2e_bench.md b/docs/benchmarks/integration_bench.md similarity index 62% rename from docs/benchmarks/e2e_bench.md rename to docs/benchmarks/integration_bench.md index 278dab9b..a1295dec 100644 --- a/docs/benchmarks/e2e_bench.md +++ b/docs/benchmarks/integration_bench.md @@ -1,6 +1,6 @@ -# e2e_bench +# integration_bench -End-to-end LEZ scenarios driven through the wallet against an in-process sequencer + indexer wired to an external Bedrock node. Times each step and records borsh sizes per block, split by tx variant. +End-to-end LEZ scenarios driven through the wallet against a docker-compose Bedrock node + in-process sequencer + indexer (via `test_fixtures::TestContext`). Times each step and records borsh sizes per block, split by tx variant. No numeric tables here yet. Absolute wall time and block sizes depend heavily on the bedrock config (block cadence and confirmation depth) and on dev-mode vs real proving; re-run the bench locally to get numbers for your own setup. Canonical numbers will be added once the bench runs against the standard configuration. @@ -31,30 +31,29 @@ Numbers are intentionally omitted in this document until the canonical run lands ## Methodology -Per scenario, every produced block is fetched via `getBlock(BlockId)` and serialized with `borsh::to_vec(&Block)`. Each transaction is serialized individually and counted by variant. Empty clock-only ticks give the per-block fixed-cost baseline. Wall time is captured per step (submit + inclusion + wallet sync) and per scenario (setup + steps + closing bedrock finality wait). +Per scenario, every produced block is fetched via `getBlock(BlockId)` and serialized with `borsh::to_vec(&Block)`. Each transaction is serialized individually and counted by variant. Empty clock-only ticks give the per-block fixed-cost baseline. Wall time is captured per step (submit + inclusion + wallet sync) and aggregated to the per-scenario `total_s`. The one-time stack-setup cost (`shared_setup_s` at the run level) and the closing bedrock finality wait (`bedrock_finality_s` per scenario) are reported separately, not folded into `total_s`. ## Reproduce +Prerequisite: a running local Docker daemon (the `bedrock/docker-compose.yml` is brought up by the bench). + ```sh -export LEZ_BEDROCK_BIN=/path/to/logos-blockchain/target/release/logos-blockchain-node -export LEZ_BEDROCK_CONFIG_DIR=/path/to/bedrock/configs +# Dev-mode sweep (fast) +RISC0_DEV_MODE=1 cargo run --release -p integration_bench -- --scenario all -# Dev-mode sweep (fast, ~16 min for all five scenarios) -RISC0_DEV_MODE=1 cargo run --release -p e2e_bench -- --scenario all +# Real-proving for representative private flow +cargo run --release -p integration_bench -- --scenario private -# Real-proving for representative private flow (~6 min on M2 Pro CPU) -cargo run --release -p e2e_bench -- --scenario private - -# Real-proving for representative public flow (~3 min) -cargo run --release -p e2e_bench -- --scenario amm +# Real-proving for representative public flow +cargo run --release -p integration_bench -- --scenario amm ``` -JSON output: `target/e2e_bench_dev.json` / `target/e2e_bench_prove.json` (suffix toggled by `RISC0_DEV_MODE`). +JSON output: `target/integration_bench_dev.json` / `target/integration_bench_prove.json` (suffix toggled by `RISC0_DEV_MODE`). ## Caveats - Dev-mode `ppe_tx_bytes` and PPE-step latencies are not representative of production; use real-proving numbers for any fee-model input that touches the storage or prover-cost components. - Single-host run, no GPU acceleration. Real-proving on production prover hardware will move per-step latencies by orders of magnitude; byte counts will not change. -- Bedrock running locally; no real network latency between sequencer and Bedrock. -- Bedrock L1 finality (`bedrock_finality_s`) is set by the bedrock config in `LEZ_BEDROCK_CONFIG_DIR` (block cadence × confirmation depth). Different configs will shift `bedrock_finality_s` materially. -- Some scenarios share account state via the same wallet; this is intentional (mirrors `integration_tests::TestContext`) and not a realistic multi-wallet workload. +- Bedrock running locally via docker-compose; no real network latency between sequencer and Bedrock. +- Bedrock L1 finality (`bedrock_finality_s`) is set by the bedrock config in `bedrock/docker-compose.yml` (block cadence × confirmation depth). Different configs will shift `bedrock_finality_s` materially. +- All scenarios share a single TestContext for the run (one bedrock + sequencer + indexer + wallet for the whole run, chain state accumulating across scenarios), which matches how the node runs in production. diff --git a/tools/e2e_bench/README.md b/tools/e2e_bench/README.md deleted file mode 100644 index ddc76bb7..00000000 --- a/tools/e2e_bench/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# e2e_bench - -End-to-end LEZ scenarios driven through the wallet against an in-process sequencer + indexer wired to an external Bedrock node. Times each step (submit, inclusion, wallet sync) and records borsh sizes for every block produced, split into per-tx-variant counts. - -## Run - -Required env vars (no defaults): - -```sh -export LEZ_BEDROCK_BIN=/path/to/logos-blockchain/target/release/logos-blockchain-node -export LEZ_BEDROCK_CONFIG_DIR=/path/to/bedrock/configs -# optional: LEZ_BEDROCK_PORT (default 18080) -``` - -The config dir must contain `node-config.yaml` and a `deployment-settings.yaml` template with the literal string `PLACEHOLDER_CHAIN_START_TIME` (rewritten per launch). - -```sh -# All scenarios, dev-mode proving (fast) -RISC0_DEV_MODE=1 cargo run --release -p e2e_bench -- --scenario all - -# One scenario, real proving (slow) -cargo run --release -p e2e_bench -- --scenario amm -``` - -Scenarios: `token`, `amm`, `fanout`, `private`, `parallel`, `all`. - -## What you'll see - -Per scenario: a step table (`submit_s`, `inclusion_s`, `sync_s`, `total_s`) and a size summary covering every block captured during the scenario (block_bytes total/mean/min/max; per-tx-variant sizes for public, PPE, and program-deployment transactions). - -The fanout, parallel, and private scenarios are the most representative for L1-payload-size measurements since they put multiple txs per block. - -JSON output is written to `target/e2e_bench.json`. diff --git a/tools/e2e_bench/src/bedrock_handle.rs b/tools/e2e_bench/src/bedrock_handle.rs deleted file mode 100644 index 94a8514a..00000000 --- a/tools/e2e_bench/src/bedrock_handle.rs +++ /dev/null @@ -1,152 +0,0 @@ -//! Manages an external `logos-blockchain-node` process as a child of the bench. -//! Launches a fresh Bedrock instance per scenario so the indexer never has to -//! catch up a large finalization backlog. -//! -//! Required env vars (no defaults, path layouts differ per developer): -//! - `LEZ_BEDROCK_BIN` absolute path to the `logos-blockchain-node` binary. -//! - `LEZ_BEDROCK_CONFIG_DIR` directory containing `node-config.yaml` and -//! `deployment-settings.yaml` (template with `PLACEHOLDER_CHAIN_START_TIME`). -//! -//! Optional: -//! - `LEZ_BEDROCK_PORT` (default: 18080) - -#![allow( - clippy::let_underscore_must_use, - reason = "file is deleted in the docker-compose pivot; teardown ignores child kill/wait results by design" -)] - -use std::{ - env, - net::SocketAddr, - path::PathBuf, - process::{Child, Command, Stdio}, - time::{Duration, Instant}, -}; - -use anyhow::{Context as _, Result, bail}; - -pub struct BedrockHandle { - child: Option, - addr: SocketAddr, - workdir: PathBuf, -} - -impl BedrockHandle { - /// Launch a fresh Bedrock node. Cleans `state/` in the working dir, rewrites - /// `deployment-settings.yaml` with the current UTC `chain_start_time`, spawns - /// the binary, and polls the HTTP port until ready. - pub async fn launch_fresh() -> Result { - let bin = env::var("LEZ_BEDROCK_BIN").map_err(|err| { - anyhow::anyhow!( - "LEZ_BEDROCK_BIN is required ({err}). Set it to the absolute path of the \ - logos-blockchain-node binary (e.g. \ - `export LEZ_BEDROCK_BIN=/path/to/logos-blockchain/target/release/logos-blockchain-node`)." - ) - })?; - let config_dir = env::var("LEZ_BEDROCK_CONFIG_DIR").map_err(|err| { - anyhow::anyhow!( - "LEZ_BEDROCK_CONFIG_DIR is required ({err}). Set it to the directory containing \ - node-config.yaml and deployment-settings.yaml \ - (see tools/e2e_bench/README.md for the expected layout)." - ) - })?; - let port: u16 = env::var("LEZ_BEDROCK_PORT") - .ok() - .and_then(|p| p.parse().ok()) - .unwrap_or(18080); - - let bin_path = PathBuf::from(&bin); - if !bin_path.is_file() { - bail!( - "LEZ_BEDROCK_BIN does not point at a file: {bin}. Build it via \ - `cargo build -p logos-blockchain-node --release` in logos-blockchain." - ); - } - let config_dir = PathBuf::from(config_dir); - let node_config = config_dir.join("node-config.yaml"); - let dep_template = config_dir.join("deployment-settings.yaml"); - if !node_config.is_file() || !dep_template.is_file() { - bail!( - "LEZ_BEDROCK_CONFIG_DIR is missing node-config.yaml or \ - deployment-settings.yaml at {}", - config_dir.display() - ); - } - - let workdir = tempfile::tempdir() - .context("create bedrock workdir")? - .keep(); - let dep_runtime = workdir.join("deployment-settings.yaml"); - let raw = std::fs::read_to_string(&dep_template).context("read deployment template")?; - let timestamp = chrono_now_utc_string(); - let filled = raw.replace("PLACEHOLDER_CHAIN_START_TIME", ×tamp); - std::fs::write(&dep_runtime, filled).context("write deployment-settings runtime")?; - - let log_path = workdir.join("bedrock.log"); - let log_file = std::fs::File::create(&log_path).context("create bedrock log")?; - let log_err = log_file.try_clone().context("clone bedrock log")?; - - eprintln!( - "BedrockHandle: launching {} (workdir {})", - bin, - workdir.display() - ); - let child = Command::new(&bin_path) - .current_dir(&workdir) - .arg("--deployment") - .arg(&dep_runtime) - .arg(&node_config) - .env("POL_PROOF_DEV_MODE", "true") - .stdout(Stdio::from(log_file)) - .stderr(Stdio::from(log_err)) - .spawn() - .context("spawn logos-blockchain-node")?; - - let addr = SocketAddr::from(([127, 0, 0, 1], port)); - wait_for_http(addr, Duration::from_secs(60)) - .await - .context("bedrock HTTP did not come up in 60s")?; - - eprintln!("BedrockHandle: stdout/stderr at {}", log_path.display()); - Ok(Self { - child: Some(child), - addr, - workdir, - }) - } - - pub const fn addr(&self) -> SocketAddr { - self.addr - } -} - -impl Drop for BedrockHandle { - fn drop(&mut self) { - if let Some(mut child) = self.child.take() { - eprintln!("BedrockHandle: stopping bedrock pid {}", child.id()); - let _ = child.kill(); - let _ = child.wait(); - } - let _ = std::fs::remove_dir_all(&self.workdir); - } -} - -async fn wait_for_http(addr: SocketAddr, timeout: Duration) -> Result<()> { - let deadline = Instant::now() + timeout; - while Instant::now() < deadline { - if tokio::net::TcpStream::connect(addr).await.is_ok() { - // TCP accepts; give Bedrock a moment to finish chain bootstrap. - tokio::time::sleep(Duration::from_secs(2)).await; - return Ok(()); - } - tokio::time::sleep(Duration::from_millis(250)).await; - } - bail!("Bedrock at {addr} did not accept TCP within {timeout:?}"); -} - -fn chrono_now_utc_string() -> String { - // Format: YYYY-MM-DD HH:MM:SS.000000 +00:00:00 (matches the deployment-settings template). - chrono::Utc::now() - .format("%Y-%m-%d %H:%M:%S%.6f +00:00:00") - .to_string() -} diff --git a/tools/e2e_bench/src/bench_context.rs b/tools/e2e_bench/src/bench_context.rs deleted file mode 100644 index e3de508e..00000000 --- a/tools/e2e_bench/src/bench_context.rs +++ /dev/null @@ -1,210 +0,0 @@ -//! `BenchContext`: wires sequencer + indexer + wallet in-process against an -//! externally-running Bedrock node. Mirrors the surface of -//! `integration_tests::TestContext` for the methods the scenarios need -//! (`wallet_mut()`, `sequencer_client()`), but skips the docker setup. -//! -//! The external Bedrock URL defaults to 127.0.0.1:18080 and can be overridden -//! with the `LEZ_BEDROCK_ADDR` env var. - -#![allow( - clippy::arbitrary_source_item_ordering, - reason = "file is deleted in the docker-compose pivot; ordering churn is wasted work" -)] - -use std::{env, net::SocketAddr, path::Path}; - -use anyhow::{Context as _, Result}; -use indexer_service::IndexerHandle; -use test_fixtures::config::{ - SequencerPartialConfig, UrlProtocol, addr_to_url, default_private_accounts_for_wallet, - default_public_accounts_for_wallet, genesis_from_accounts, indexer_config, sequencer_config, - wallet_config, -}; -use sequencer_service::SequencerHandle; -use sequencer_service_rpc::{SequencerClient, SequencerClientBuilder}; -use serde::Serialize; -use tempfile::TempDir; -use wallet::{WalletCore, config::WalletConfigOverrides}; - -const DEFAULT_BEDROCK_ADDR: &str = "127.0.0.1:18080"; - -#[expect( - clippy::partial_pub_fields, - reason = "Internal TempDirs are kept alive via private fields for RAII; \ - client and wallet are public for scenarios to drive." -)] -pub struct BenchContext { - pub sequencer_client: SequencerClient, - pub wallet: WalletCore, - #[expect( - dead_code, - reason = "Retained for parity with TestContext; may be needed later." - )] - pub wallet_password: String, - sequencer_handle: Option, - indexer_handle: IndexerHandle, - temp_indexer_dir: TempDir, - temp_sequencer_dir: TempDir, - temp_wallet_dir: TempDir, -} - -impl BenchContext { - pub async fn new() -> Result { - let bedrock_addr_str = - env::var("LEZ_BEDROCK_ADDR").unwrap_or_else(|_| DEFAULT_BEDROCK_ADDR.to_owned()); - let bedrock_addr: SocketAddr = bedrock_addr_str - .parse() - .with_context(|| format!("invalid LEZ_BEDROCK_ADDR `{bedrock_addr_str}`"))?; - - eprintln!("BenchContext: using external bedrock at {bedrock_addr}"); - - let initial_public_accounts = default_public_accounts_for_wallet(); - let initial_private_accounts = default_private_accounts_for_wallet(); - let genesis_transactions = - genesis_from_accounts(&initial_public_accounts, &initial_private_accounts); - let sequencer_partial = SequencerPartialConfig::default(); - - let temp_indexer_dir = tempfile::tempdir().context("indexer temp dir")?; - let indexer_cfg = indexer_config(bedrock_addr, temp_indexer_dir.path().to_owned()) - .context("indexer config")?; - let indexer_handle = indexer_service::run_server(indexer_cfg, 0) - .await - .context("indexer run_server")?; - - let temp_sequencer_dir = tempfile::tempdir().context("sequencer temp dir")?; - let sequencer_cfg = sequencer_config( - sequencer_partial, - temp_sequencer_dir.path().to_owned(), - bedrock_addr, - genesis_transactions, - ) - .context("sequencer config")?; - let sequencer_handle = sequencer_service::run(sequencer_cfg, 0) - .await - .context("sequencer run")?; - - let temp_wallet_dir = tempfile::tempdir().context("wallet temp dir")?; - let mut wallet_cfg = wallet_config(sequencer_handle.addr()).context("wallet config")?; - // The default 30s poll interval is far too slow for a measurement run; - // shrink so the wallet sees new blocks within ~1s. - wallet_cfg.seq_poll_timeout = std::time::Duration::from_secs(1); - let wallet_cfg_str = - serde_json::to_string_pretty(&wallet_cfg).context("serialize wallet config")?; - let wallet_cfg_path = temp_wallet_dir.path().join("wallet_config.json"); - std::fs::write(&wallet_cfg_path, wallet_cfg_str).context("write wallet config")?; - let storage_path = temp_wallet_dir.path().join("storage.json"); - let password = "bench_pass".to_owned(); - let (mut wallet, _mnemonic) = WalletCore::new_init_storage( - wallet_cfg_path, - storage_path, - Some(WalletConfigOverrides::default()), - &password, - ) - .context("wallet init")?; - // Mirror integration_tests::setup_wallet: import the initial accounts - // produced above so the wallet can reference them by AccountId in scenarios. - for (private_key, _balance) in &initial_public_accounts { - wallet - .storage_mut() - .key_chain_mut() - .add_imported_public_account(private_key.clone()); - } - for private_account in &initial_private_accounts { - wallet - .storage_mut() - .key_chain_mut() - .add_imported_private_account( - private_account.key_chain.clone(), - None, - private_account.identifier, - nssa::Account::default(), - ); - } - wallet - .store_persistent_data() - .context("wallet store persistent")?; - - let sequencer_url = - addr_to_url(UrlProtocol::Http, sequencer_handle.addr()).context("sequencer url")?; - let sequencer_client = SequencerClientBuilder::default() - .build(sequencer_url) - .context("build sequencer client")?; - - Ok(Self { - sequencer_client, - wallet, - wallet_password: password, - sequencer_handle: Some(sequencer_handle), - indexer_handle, - temp_indexer_dir, - temp_sequencer_dir, - temp_wallet_dir, - }) - } - - pub const fn wallet_mut(&mut self) -> &mut WalletCore { - &mut self.wallet - } - - pub const fn sequencer_client(&self) -> &SequencerClient { - &self.sequencer_client - } - - pub const fn indexer_addr(&self) -> SocketAddr { - self.indexer_handle.addr() - } - - /// Recursively-sized bytes on disk for sequencer + indexer + wallet tempdirs. - pub fn disk_sizes(&self) -> DiskSizes { - DiskSizes { - sequencer_bytes: dir_size_bytes(self.temp_sequencer_dir.path()), - indexer_bytes: dir_size_bytes(self.temp_indexer_dir.path()), - wallet_bytes: dir_size_bytes(self.temp_wallet_dir.path()), - } - } -} - -#[derive(Debug, Clone, Copy, Default, Serialize)] -#[expect( - clippy::struct_field_names, - reason = "The `_bytes` suffix carries the unit and is preserved verbatim in JSON output." -)] -pub struct DiskSizes { - pub sequencer_bytes: u64, - pub indexer_bytes: u64, - pub wallet_bytes: u64, -} - -fn dir_size_bytes(path: &Path) -> u64 { - let mut total = 0_u64; - let Ok(entries) = std::fs::read_dir(path) else { - return 0; - }; - for entry in entries.flatten() { - let Ok(metadata) = entry.metadata() else { - continue; - }; - if metadata.is_file() { - total = total.saturating_add(metadata.len()); - } else if metadata.is_dir() { - total = total.saturating_add(dir_size_bytes(&entry.path())); - } else { - // Sockets, FIFOs, block/char devices: ignore. Symlinks are - // already followed by `is_file()` / `is_dir()`. - } - } - total -} - -impl Drop for BenchContext { - fn drop(&mut self) { - if let Some(handle) = self.sequencer_handle.take() - && !handle.is_healthy() - { - eprintln!("BenchContext drop: sequencer handle was unhealthy"); - } - if !self.indexer_handle.is_healthy() { - eprintln!("BenchContext drop: indexer handle was unhealthy"); - } - } -} diff --git a/tools/e2e_bench/Cargo.toml b/tools/integration_bench/Cargo.toml similarity index 82% rename from tools/e2e_bench/Cargo.toml rename to tools/integration_bench/Cargo.toml index 97d34f53..0829a7f0 100644 --- a/tools/e2e_bench/Cargo.toml +++ b/tools/integration_bench/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "e2e_bench" +name = "integration_bench" version = "0.1.0" edition = "2024" license = { workspace = true } @@ -10,20 +10,16 @@ workspace = true [dependencies] common.workspace = true -indexer_service.workspace = true indexer_service_rpc = { workspace = true, features = ["client"] } nssa.workspace = true -sequencer_service.workspace = true sequencer_service_rpc = { workspace = true, features = ["client"] } test_fixtures.workspace = true wallet.workspace = true anyhow.workspace = true borsh.workspace = true -chrono.workspace = true clap.workspace = true jsonrpsee = { workspace = true, features = ["ws-client"] } serde.workspace = true serde_json.workspace = true -tempfile.workspace = true tokio = { workspace = true, features = ["macros", "rt-multi-thread", "time"] } diff --git a/tools/integration_bench/README.md b/tools/integration_bench/README.md new file mode 100644 index 00000000..f6e2ee04 --- /dev/null +++ b/tools/integration_bench/README.md @@ -0,0 +1,27 @@ +# integration_bench + +End-to-end LEZ scenarios driven through the wallet against a docker-compose Bedrock node + in-process sequencer + indexer (via `test_fixtures::TestContext`). Times each step (submit, inclusion, wallet sync) and records borsh sizes for every block produced, split into per-tx-variant counts. + +## Run + +Prerequisite: a running local Docker daemon. The Bedrock service comes up via the same `bedrock/docker-compose.yml` that integration tests use, so no host-side binary or env vars are required. + +```sh +# All scenarios, dev-mode proving (fast) +RISC0_DEV_MODE=1 cargo run --release -p integration_bench -- --scenario all + +# One scenario, real proving (slow) +cargo run --release -p integration_bench -- --scenario amm +``` + +Scenarios: `token`, `amm`, `fanout`, `private`, `parallel`, `all`. + +All scenarios share a single TestContext for the run (one Bedrock + sequencer + indexer + wallet across the whole run, chain state accumulating), which matches how the node runs in production. + +## What you'll see + +Per scenario: a step table (`submit_s`, `inclusion_s`, `sync_s`, `total_s`) and a size summary covering every block captured during the scenario (block_bytes total/mean/min/max; per-tx-variant sizes for public, PPE, and program-deployment transactions). + +The fanout, parallel, and private scenarios are the most representative for L1-payload-size measurements since they put multiple txs per block. + +JSON output is written to `target/integration_bench_dev.json` (dev mode) or `target/integration_bench_prove.json` (real proving). diff --git a/tools/e2e_bench/src/harness.rs b/tools/integration_bench/src/harness.rs similarity index 95% rename from tools/e2e_bench/src/harness.rs rename to tools/integration_bench/src/harness.rs index 7020352b..b00351b9 100644 --- a/tools/e2e_bench/src/harness.rs +++ b/tools/integration_bench/src/harness.rs @@ -11,10 +11,9 @@ use anyhow::{Result, bail}; use common::transaction::NSSATransaction; use sequencer_service_rpc::RpcClient as _; use serde::{Serialize, Serializer}; +use test_fixtures::{DiskSizes, TestContext}; use wallet::cli::SubcommandReturnValue; -use crate::bench_context::BenchContext; - const TX_INCLUSION_POLL_INTERVAL: Duration = Duration::from_millis(250); const TX_INCLUSION_TIMEOUT: Duration = Duration::from_secs(120); @@ -51,15 +50,13 @@ pub struct StepResult { #[derive(Debug, Serialize, Default)] pub struct ScenarioOutput { pub name: String, - #[serde(serialize_with = "ser_duration_secs", rename = "setup_s")] - pub setup: Duration, pub steps: Vec, #[serde(serialize_with = "ser_duration_secs", rename = "total_s")] pub total: Duration, /// Disk sizes (sequencer / indexer / wallet tempdirs) sampled at scenario start. - pub disk_before: Option, + pub disk_before: Option, /// Disk sizes sampled at scenario end. - pub disk_after: Option, + pub disk_after: Option, /// Bedrock-finality latency: time from final-step inclusion to the indexer /// reporting the sequencer tip as L1-finalised. Effectively measures the /// sequencer→Bedrock posting + Bedrock finalisation + indexer L1 ingest path. @@ -85,7 +82,7 @@ impl ScenarioOutput { /// Begin a timed step. Capture this *before* submitting the wallet operation /// so we can later subtract it from the post-submit block height to detect /// when the chain has advanced past the tx's block. -pub async fn begin_step(ctx: &BenchContext) -> Result { +pub async fn begin_step(ctx: &TestContext) -> Result { Ok(ctx.sequencer_client().get_last_block_id().await?) } @@ -105,7 +102,7 @@ pub async fn finalize_step( started: Instant, pre_block_id: u64, ret: &SubcommandReturnValue, - ctx: &mut BenchContext, + ctx: &mut TestContext, ) -> Result { let label = label.into(); let submit = started.elapsed(); @@ -174,7 +171,7 @@ pub async fn finalize_step( /// Wait for `get_last_block_id` to advance by at least `min_blocks` from `from_block_id`. pub async fn wait_for_chain_advance( - ctx: &BenchContext, + ctx: &TestContext, from_block_id: u64, min_blocks: u64, ) -> Result<()> { @@ -197,7 +194,7 @@ pub async fn wait_for_chain_advance( } } -async fn sync_wallet_to_tip(ctx: &mut BenchContext) -> Result<()> { +async fn sync_wallet_to_tip(ctx: &mut TestContext) -> Result<()> { let last_block = ctx.sequencer_client().get_last_block_id().await?; ctx.wallet_mut().sync_to_block(last_block).await?; Ok(()) @@ -213,9 +210,8 @@ pub fn print_table(output: &ScenarioOutput) { .max("step".len()); println!( - "\nScenario: {} (setup {:.2}s, total {:.2}s)", + "\nScenario: {} (total {:.2}s)", output.name, - output.setup.as_secs_f64(), output.total.as_secs_f64(), ); println!( diff --git a/tools/e2e_bench/src/main.rs b/tools/integration_bench/src/main.rs similarity index 60% rename from tools/e2e_bench/src/main.rs rename to tools/integration_bench/src/main.rs index 7de1d323..b218a087 100644 --- a/tools/e2e_bench/src/main.rs +++ b/tools/integration_bench/src/main.rs @@ -1,18 +1,18 @@ //! End-to-end LEZ scenario bench. //! -//! Spins up the full stack (native Bedrock node launched per-scenario via -//! `BedrockHandle` + in-process sequencer + indexer + wallet via -//! `BenchContext`) and drives the wallet through configurable scenarios that -//! mirror real user flows. Times each step and records borsh-serialized -//! block + tx sizes per scenario. +//! Spins up the full stack via `test_fixtures::TestContext` (docker-compose +//! Bedrock + in-process sequencer + indexer + wallet) once for the whole run, +//! then drives the wallet through each requested scenario against that single +//! shared stack. Times each step and records borsh-serialized block + tx sizes +//! per scenario. //! -//! Required env vars (no defaults; see `tools/e2e_bench/README.md`): -//! `LEZ_BEDROCK_BIN` absolute path to logos-blockchain-node. -//! `LEZ_BEDROCK_CONFIG_DIR` directory with node-config.yaml + deployment template. +//! Prerequisite: a working local Docker daemon. The Bedrock service is brought +//! up via the same `bedrock/docker-compose.yml` the integration tests use, so +//! no host-side binary or env vars are required. //! //! Run examples: -//! `RISC0_DEV_MODE=1` `cargo run --release -p e2e_bench -- --scenario all`. -//! `cargo run --release -p e2e_bench -- --scenario amm`. +//! `RISC0_DEV_MODE=1 cargo run --release -p integration_bench -- --scenario all`. +//! `cargo run --release -p integration_bench -- --scenario amm`. //! //! `RISC0_DEV_MODE=1` skips proving and produces latency-only numbers in //! ~minutes; omitting it produces realistic proving-inclusive numbers but @@ -31,14 +31,11 @@ use std::{path::PathBuf, time::Duration}; use anyhow::{Context as _, Result}; -use bedrock_handle::BedrockHandle; -use bench_context::BenchContext; use clap::{Parser, ValueEnum}; use harness::ScenarioOutput; use serde::Serialize; +use test_fixtures::TestContext; -mod bedrock_handle; -mod bench_context; mod harness; mod scenarios; @@ -59,7 +56,7 @@ struct Cli { #[arg(long, value_enum, default_value_t = ScenarioName::All)] scenario: ScenarioName, - /// Optional JSON output path. Defaults to `/target/e2e_bench.json`. + /// Optional JSON output path. Defaults to `/target/integration_bench.json`. #[arg(long)] json_out: Option, } @@ -67,20 +64,24 @@ struct Cli { #[derive(Debug, Serialize)] struct BenchRunReport { risc0_dev_mode: bool, + /// Time to bring up the shared `TestContext` (docker-compose Bedrock + + /// sequencer + indexer + wallet). Paid once per run regardless of how many + /// scenarios are exercised. + shared_setup_s: f64, scenarios: Vec, total_wall_s: f64, } #[tokio::main(flavor = "multi_thread")] async fn main() -> Result<()> { - // integration_tests initializes env_logger via a LazyLock, so we leave logger + // test_fixtures initializes env_logger via a LazyLock, so we leave logger // setup to it. Set RUST_LOG=info before running to see logs. let cli = Cli::parse(); let risc0_dev_mode = std::env::var("RISC0_DEV_MODE").is_ok_and(|v| !v.is_empty() && v != "0"); eprintln!( - "e2e_bench: scenario={:?}, RISC0_DEV_MODE={}", + "integration_bench: scenario={:?}, RISC0_DEV_MODE={}", cli.scenario, if risc0_dev_mode { "1" } else { "unset/0" } ); @@ -97,43 +98,28 @@ async fn main() -> Result<()> { }; let overall_started = std::time::Instant::now(); + + // One shared stack for the entire run: docker-compose Bedrock + sequencer + + // indexer + wallet. Scenarios share chain state, which matches how the node + // runs in production (long-lived, accumulating). + let setup_started = std::time::Instant::now(); + let mut ctx = TestContext::new() + .await + .context("failed to setup TestContext")?; + let shared_setup = setup_started.elapsed(); + eprintln!("setup: {:.2}s", shared_setup.as_secs_f64()); + let mut all_outputs = Vec::with_capacity(to_run.len()); for name in to_run { eprintln!("\n=== running scenario: {name:?} ==="); - { - let setup_started = std::time::Instant::now(); - // Spawn a fresh Bedrock node for this scenario. Each scenario therefore - // starts with an empty chain so the indexer never has a backlog from a - // prior scenario. - let bedrock = BedrockHandle::launch_fresh() - .await - .with_context(|| format!("failed to spawn Bedrock for scenario {name:?}"))?; - let bedrock_addr_string = format!("{}", bedrock.addr()); - // SAFETY: env::set_var happens before any threaded setup that reads env. - unsafe { - std::env::set_var("LEZ_BEDROCK_ADDR", &bedrock_addr_string); - } - - let mut ctx = BenchContext::new() - .await - .with_context(|| format!("failed to setup BenchContext for scenario {name:?}"))?; - let setup = setup_started.elapsed(); - eprintln!("setup: {:.2}s", setup.as_secs_f64()); - - let disk_before = ctx.disk_sizes(); - let mut output = run_scenario(name, setup, &mut ctx).await?; - output.disk_before = Some(disk_before); - output.disk_after = Some(ctx.disk_sizes()); - output.bedrock_finality = Some(measure_bedrock_finality(&ctx).await?); - harness::print_table(&output); - all_outputs.push(output); - - // ctx and bedrock drop here at end of scope, killing the bedrock child - // before we sleep so the next iteration can rebind the port. - } - // Give Bedrock a moment to shut down before the next scenario. - tokio::time::sleep(Duration::from_secs(2)).await; + let disk_before = ctx.disk_sizes(); + let mut output = run_scenario(name, &mut ctx).await?; + output.disk_before = Some(disk_before); + output.disk_after = Some(ctx.disk_sizes()); + output.bedrock_finality = Some(measure_bedrock_finality(&ctx).await?); + harness::print_table(&output); + all_outputs.push(output); } let total_wall_s = overall_started.elapsed().as_secs_f64(); @@ -141,6 +127,7 @@ async fn main() -> Result<()> { let report = BenchRunReport { risc0_dev_mode, + shared_setup_s: shared_setup.as_secs_f64(), scenarios: all_outputs, total_wall_s, }; @@ -155,7 +142,7 @@ async fn main() -> Result<()> { let suffix = if risc0_dev_mode { "dev" } else { "prove" }; workspace_root .join("target") - .join(format!("e2e_bench_{suffix}.json")) + .join(format!("integration_bench_{suffix}.json")) }; if let Some(parent) = out_path.parent() { std::fs::create_dir_all(parent)?; @@ -166,26 +153,21 @@ async fn main() -> Result<()> { Ok(()) } -async fn run_scenario( - name: ScenarioName, - setup: Duration, - ctx: &mut BenchContext, -) -> Result { - let output = match name { - ScenarioName::Token => scenarios::token::run(ctx).await?, - ScenarioName::Amm => scenarios::amm::run(ctx).await?, - ScenarioName::Fanout => scenarios::fanout::run(ctx).await?, - ScenarioName::Private => scenarios::private::run(ctx).await?, - ScenarioName::Parallel => scenarios::parallel::run(ctx).await?, +async fn run_scenario(name: ScenarioName, ctx: &mut TestContext) -> Result { + match name { + ScenarioName::Token => scenarios::token::run(ctx).await, + ScenarioName::Amm => scenarios::amm::run(ctx).await, + ScenarioName::Fanout => scenarios::fanout::run(ctx).await, + ScenarioName::Private => scenarios::private::run(ctx).await, + ScenarioName::Parallel => scenarios::parallel::run(ctx).await, ScenarioName::All => unreachable!("dispatched above"), - }; - Ok(ScenarioOutput { setup, ..output }) + } } /// Poll the indexer's L1-finalised block id until it catches up with the /// sequencer's last block id. This is effectively the sequencer→Bedrock posting /// plus Bedrock finalisation plus indexer ingest latency. -async fn measure_bedrock_finality(ctx: &BenchContext) -> Result { +async fn measure_bedrock_finality(ctx: &TestContext) -> Result { use indexer_service_rpc::RpcClient as _; use jsonrpsee::ws_client::WsClientBuilder; use sequencer_service_rpc::RpcClient as _; diff --git a/tools/e2e_bench/src/scenarios/amm.rs b/tools/integration_bench/src/scenarios/amm.rs similarity index 96% rename from tools/e2e_bench/src/scenarios/amm.rs rename to tools/integration_bench/src/scenarios/amm.rs index f295a4aa..d0ddd6f0 100644 --- a/tools/e2e_bench/src/scenarios/amm.rs +++ b/tools/integration_bench/src/scenarios/amm.rs @@ -12,7 +12,7 @@ use wallet::cli::{ use crate::harness::{ScenarioOutput, finalize_step}; -pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { +pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result { let mut output = ScenarioOutput::new("amm_swap_flow"); let def_a = new_public_account(ctx, &mut output, "create_acc_def_a").await?; @@ -125,7 +125,7 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result Result { @@ -148,7 +148,7 @@ async fn new_public_account( } async fn timed_token_new( - ctx: &mut crate::bench_context::BenchContext, + ctx: &mut test_fixtures::TestContext, output: &mut ScenarioOutput, label: &str, def_id: nssa::AccountId, @@ -173,7 +173,7 @@ async fn timed_token_new( } async fn timed_token_send( - ctx: &mut crate::bench_context::BenchContext, + ctx: &mut test_fixtures::TestContext, output: &mut ScenarioOutput, label: &str, from_id: nssa::AccountId, diff --git a/tools/e2e_bench/src/scenarios/fanout.rs b/tools/integration_bench/src/scenarios/fanout.rs similarity index 95% rename from tools/e2e_bench/src/scenarios/fanout.rs rename to tools/integration_bench/src/scenarios/fanout.rs index 6f85a974..fc5235b5 100644 --- a/tools/e2e_bench/src/scenarios/fanout.rs +++ b/tools/integration_bench/src/scenarios/fanout.rs @@ -15,7 +15,7 @@ use crate::harness::{ScenarioOutput, finalize_step}; const FANOUT_COUNT: usize = 10; const AMOUNT_PER_TRANSFER: u128 = 100; -pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { +pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result { let mut output = ScenarioOutput::new("multi_recipient_fanout"); let def_id = new_public_account(ctx, &mut output, "create_acc_def").await?; @@ -67,7 +67,7 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result Result { diff --git a/tools/e2e_bench/src/scenarios/mod.rs b/tools/integration_bench/src/scenarios/mod.rs similarity index 100% rename from tools/e2e_bench/src/scenarios/mod.rs rename to tools/integration_bench/src/scenarios/mod.rs diff --git a/tools/e2e_bench/src/scenarios/parallel.rs b/tools/integration_bench/src/scenarios/parallel.rs similarity index 96% rename from tools/e2e_bench/src/scenarios/parallel.rs rename to tools/integration_bench/src/scenarios/parallel.rs index 29c3a72f..7ae03a09 100644 --- a/tools/e2e_bench/src/scenarios/parallel.rs +++ b/tools/integration_bench/src/scenarios/parallel.rs @@ -7,23 +7,20 @@ use std::time::Instant; use anyhow::{Result, bail}; use common::transaction::NSSATransaction; -use test_fixtures::public_mention; use sequencer_service_rpc::RpcClient as _; +use test_fixtures::{TestContext, public_mention}; use wallet::cli::{ Command, SubcommandReturnValue, account::{AccountSubcommand, NewSubcommand}, programs::token::TokenProgramAgnosticSubcommand, }; -use crate::{ - bench_context::BenchContext, - harness::{BlockSize, ScenarioOutput, StepResult, finalize_step}, -}; +use crate::harness::{BlockSize, ScenarioOutput, StepResult, finalize_step}; const PARALLEL_FANOUT_N: usize = 10; const AMOUNT_PER_TRANSFER: u128 = 100; -pub async fn run(ctx: &mut BenchContext) -> Result { +pub async fn run(ctx: &mut TestContext) -> Result { let mut output = ScenarioOutput::new("parallel_fanout"); // Setup: definition, master supply, N parallel supplies, N recipients. @@ -168,7 +165,7 @@ pub async fn run(ctx: &mut BenchContext) -> Result { } async fn new_public_account( - ctx: &mut BenchContext, + ctx: &mut TestContext, output: &mut ScenarioOutput, label: &str, ) -> Result { diff --git a/tools/e2e_bench/src/scenarios/private.rs b/tools/integration_bench/src/scenarios/private.rs similarity index 96% rename from tools/e2e_bench/src/scenarios/private.rs rename to tools/integration_bench/src/scenarios/private.rs index f0b4745b..54dcab2b 100644 --- a/tools/e2e_bench/src/scenarios/private.rs +++ b/tools/integration_bench/src/scenarios/private.rs @@ -12,7 +12,7 @@ use wallet::cli::{ use crate::harness::{ScenarioOutput, finalize_step}; -pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { +pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result { let mut output = ScenarioOutput::new("private_chained_flow"); let def_id = new_public_account(ctx, &mut output, "create_acc_def").await?; @@ -104,7 +104,7 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result Result { @@ -127,7 +127,7 @@ async fn new_public_account( } async fn new_private_account( - ctx: &mut crate::bench_context::BenchContext, + ctx: &mut test_fixtures::TestContext, output: &mut ScenarioOutput, label: &str, ) -> Result { diff --git a/tools/e2e_bench/src/scenarios/token.rs b/tools/integration_bench/src/scenarios/token.rs similarity index 95% rename from tools/e2e_bench/src/scenarios/token.rs rename to tools/integration_bench/src/scenarios/token.rs index 4e63da32..235394e0 100644 --- a/tools/e2e_bench/src/scenarios/token.rs +++ b/tools/integration_bench/src/scenarios/token.rs @@ -12,7 +12,7 @@ use wallet::cli::{ use crate::harness::{ScenarioOutput, finalize_step}; -pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result { +pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result { let mut output = ScenarioOutput::new("token_onboarding"); let definition_id = new_public_account(ctx, &mut output, "create_pub_definition").await?; @@ -81,7 +81,7 @@ pub async fn run(ctx: &mut crate::bench_context::BenchContext) -> Result Result { @@ -104,7 +104,7 @@ async fn new_public_account( } async fn new_private_account( - ctx: &mut crate::bench_context::BenchContext, + ctx: &mut test_fixtures::TestContext, output: &mut ScenarioOutput, label: &str, ) -> Result { From ab77c5d26a8115420a1fd678df8d814f4550a61b Mon Sep 17 00:00:00 2001 From: moudyellaz Date: Wed, 20 May 2026 12:19:43 +0200 Subject: [PATCH 30/33] refactor(integration_bench): ScenarioOutput::step closure helper --- tools/integration_bench/src/harness.rs | 28 +- tools/integration_bench/src/main.rs | 4 +- tools/integration_bench/src/scenarios/amm.rs | 243 ++++++++---------- .../integration_bench/src/scenarios/fanout.rs | 96 ++++--- .../src/scenarios/parallel.rs | 94 +++---- .../src/scenarios/private.rs | 184 +++++++------ .../integration_bench/src/scenarios/token.rs | 152 ++++++----- 7 files changed, 383 insertions(+), 418 deletions(-) diff --git a/tools/integration_bench/src/harness.rs b/tools/integration_bench/src/harness.rs index b00351b9..9337f3ed 100644 --- a/tools/integration_bench/src/harness.rs +++ b/tools/integration_bench/src/harness.rs @@ -77,12 +77,29 @@ impl ScenarioOutput { self.total = self.total.saturating_add(step.total); self.steps.push(step); } + + /// Run a single timed step against `ctx`: capture pre-block, run `submit`, + /// finalize timings, push a `StepResult` onto `self.steps`. Returns the + /// `SubcommandReturnValue` from `submit` so the caller can match on it. + pub async fn step( + &mut self, + ctx: &mut TestContext, + label: impl Into, + submit: impl AsyncFnOnce(&mut TestContext) -> Result, + ) -> Result { + let pre_block = begin_step(ctx).await?; + let started = Instant::now(); + let ret = submit(ctx).await?; + let step = finalize_step(label, started, pre_block, &ret, ctx).await?; + self.push(step); + Ok(ret) + } } /// Begin a timed step. Capture this *before* submitting the wallet operation /// so we can later subtract it from the post-submit block height to detect /// when the chain has advanced past the tx's block. -pub async fn begin_step(ctx: &TestContext) -> Result { +async fn begin_step(ctx: &TestContext) -> Result { Ok(ctx.sequencer_client().get_last_block_id().await?) } @@ -90,14 +107,7 @@ pub async fn begin_step(ctx: &TestContext) -> Result { /// being captured and `ret` being received) and, if `ret` is a /// [`SubcommandReturnValue::PrivacyPreservingTransfer`], polls the sequencer /// for inclusion and records the inclusion latency. Returns a [`StepResult`]. -/// -/// Usage: -/// ```ignore -/// let started = Instant::now(); -/// let ret = wallet::cli::execute_subcommand(ctx.wallet_mut(), cmd).await?; -/// let step = finalize_step("label", started, pre_block_id, &ret, ctx).await?; -/// ``` -pub async fn finalize_step( +async fn finalize_step( label: impl Into, started: Instant, pre_block_id: u64, diff --git a/tools/integration_bench/src/main.rs b/tools/integration_bench/src/main.rs index b218a087..ccf7058e 100644 --- a/tools/integration_bench/src/main.rs +++ b/tools/integration_bench/src/main.rs @@ -22,10 +22,12 @@ clippy::arithmetic_side_effects, clippy::print_stderr, clippy::print_stdout, + clippy::shadow_unrelated, clippy::wildcard_enum_match_arm, reason = "Bench tool: stderr/stdout output is the deliverable; small Duration / iterator-sum \ arithmetic is safe at bench scale; bench scenarios bail loudly on any unexpected \ - return variant, which is preferable to maintaining an exhaustive list in five files." + return variant, which is preferable to maintaining an exhaustive list in five files; \ + the step() closure helper canonically rebinds `ctx` inside the closure body." )] use std::{path::PathBuf, time::Duration}; diff --git a/tools/integration_bench/src/scenarios/amm.rs b/tools/integration_bench/src/scenarios/amm.rs index d0ddd6f0..f05eed1a 100644 --- a/tools/integration_bench/src/scenarios/amm.rs +++ b/tools/integration_bench/src/scenarios/amm.rs @@ -1,18 +1,16 @@ //! AMM swap flow: setup two tokens, create pool, swap, add liquidity, remove liquidity. -use std::time::Instant; - use anyhow::{Result, bail}; -use test_fixtures::public_mention; +use test_fixtures::{TestContext, public_mention}; use wallet::cli::{ Command, SubcommandReturnValue, account::{AccountSubcommand, NewSubcommand}, programs::{amm::AmmProgramAgnosticSubcommand, token::TokenProgramAgnosticSubcommand}, }; -use crate::harness::{ScenarioOutput, finalize_step}; +use crate::harness::ScenarioOutput; -pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result { +pub async fn run(ctx: &mut TestContext) -> Result { let mut output = ScenarioOutput::new("amm_swap_flow"); let def_a = new_public_account(ctx, &mut output, "create_acc_def_a").await?; @@ -26,121 +24,97 @@ pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result let user_lp = new_public_account(ctx, &mut output, "create_acc_user_lp").await?; timed_token_new(ctx, &mut output, "token_a_new", def_a, supply_a, "TokA").await?; - timed_token_send( - ctx, - &mut output, - "token_a_fund_user", - supply_a, - user_a, - 1_000, - ) - .await?; + timed_token_send(ctx, &mut output, "token_a_fund_user", supply_a, user_a, 1_000).await?; timed_token_new(ctx, &mut output, "token_b_new", def_b, supply_b, "TokB").await?; - timed_token_send( - ctx, - &mut output, - "token_b_fund_user", - supply_b, - user_b, - 1_000, - ) - .await?; + timed_token_send(ctx, &mut output, "token_b_fund_user", supply_b, user_b, 1_000).await?; - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::AMM(AmmProgramAgnosticSubcommand::New { - user_holding_a: public_mention(user_a), - user_holding_b: public_mention(user_b), - user_holding_lp: public_mention(user_lp), - balance_a: 300, - balance_b: 300, - }), - ) + output + .step(ctx, "amm_new_pool", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::AMM(AmmProgramAgnosticSubcommand::New { + user_holding_a: public_mention(user_a), + user_holding_b: public_mention(user_b), + user_holding_lp: public_mention(user_lp), + balance_a: 300, + balance_b: 300, + }), + ) + .await + }) .await?; - let step = finalize_step("amm_new_pool", started, pre_block, &ret, ctx).await?; - output.push(step); - } - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::AMM(AmmProgramAgnosticSubcommand::SwapExactInput { - user_holding_a: public_mention(user_a), - user_holding_b: public_mention(user_b), - amount_in: 50, - min_amount_out: 1, - token_definition: def_a, - }), - ) + output + .step(ctx, "amm_swap_exact_input", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::AMM(AmmProgramAgnosticSubcommand::SwapExactInput { + user_holding_a: public_mention(user_a), + user_holding_b: public_mention(user_b), + amount_in: 50, + min_amount_out: 1, + token_definition: def_a, + }), + ) + .await + }) .await?; - let step = finalize_step("amm_swap_exact_input", started, pre_block, &ret, ctx).await?; - output.push(step); - } - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::AMM(AmmProgramAgnosticSubcommand::AddLiquidity { - user_holding_a: public_mention(user_a), - user_holding_b: public_mention(user_b), - user_holding_lp: public_mention(user_lp), - min_amount_lp: 1, - max_amount_a: 100, - max_amount_b: 100, - }), - ) + output + .step(ctx, "amm_add_liquidity", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::AMM(AmmProgramAgnosticSubcommand::AddLiquidity { + user_holding_a: public_mention(user_a), + user_holding_b: public_mention(user_b), + user_holding_lp: public_mention(user_lp), + min_amount_lp: 1, + max_amount_a: 100, + max_amount_b: 100, + }), + ) + .await + }) .await?; - let step = finalize_step("amm_add_liquidity", started, pre_block, &ret, ctx).await?; - output.push(step); - } - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::AMM(AmmProgramAgnosticSubcommand::RemoveLiquidity { - user_holding_a: public_mention(user_a), - user_holding_b: public_mention(user_b), - user_holding_lp: public_mention(user_lp), - balance_lp: 50, - min_amount_a: 1, - min_amount_b: 1, - }), - ) + output + .step(ctx, "amm_remove_liquidity", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::AMM(AmmProgramAgnosticSubcommand::RemoveLiquidity { + user_holding_a: public_mention(user_a), + user_holding_b: public_mention(user_b), + user_holding_lp: public_mention(user_lp), + balance_lp: 50, + min_amount_a: 1, + min_amount_b: 1, + }), + ) + .await + }) .await?; - let step = finalize_step("amm_remove_liquidity", started, pre_block, &ret, ctx).await?; - output.push(step); - } Ok(output) } async fn new_public_account( - ctx: &mut test_fixtures::TestContext, + ctx: &mut TestContext, output: &mut ScenarioOutput, label: &str, ) -> Result { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Account(AccountSubcommand::New(NewSubcommand::Public { - cci: None, - label: None, - })), - ) - .await?; - let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - output.push(step); + let ret = output + .step(ctx, label, async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await + }) + .await?; match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), @@ -148,53 +122,54 @@ async fn new_public_account( } async fn timed_token_new( - ctx: &mut test_fixtures::TestContext, + ctx: &mut TestContext, output: &mut ScenarioOutput, label: &str, def_id: nssa::AccountId, supply_id: nssa::AccountId, name: &str, ) -> Result<()> { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::New { - definition_account_id: public_mention(def_id), - supply_account_id: public_mention(supply_id), - name: name.to_owned(), - total_supply: 10_000, - }), - ) - .await?; - let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - output.push(step); + let name = name.to_owned(); + output + .step(ctx, label, async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(def_id), + supply_account_id: public_mention(supply_id), + name, + total_supply: 10_000, + }), + ) + .await + }) + .await?; Ok(()) } async fn timed_token_send( - ctx: &mut test_fixtures::TestContext, + ctx: &mut TestContext, output: &mut ScenarioOutput, label: &str, from_id: nssa::AccountId, to_id: nssa::AccountId, amount: u128, ) -> Result<()> { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::Send { - from: public_mention(from_id), - to: Some(public_mention(to_id)), - to_npk: None, - to_vpk: None, - to_identifier: Some(0), - amount, - }), - ) - .await?; - let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - output.push(step); + output + .step(ctx, label, async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(from_id), + to: Some(public_mention(to_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount, + }), + ) + .await + }) + .await?; Ok(()) } diff --git a/tools/integration_bench/src/scenarios/fanout.rs b/tools/integration_bench/src/scenarios/fanout.rs index fc5235b5..d03adf83 100644 --- a/tools/integration_bench/src/scenarios/fanout.rs +++ b/tools/integration_bench/src/scenarios/fanout.rs @@ -1,42 +1,38 @@ //! Multi-recipient fanout: one funded supply pays 10 distinct recipients. -use std::time::Instant; - use anyhow::{Result, bail}; -use test_fixtures::public_mention; +use test_fixtures::{TestContext, public_mention}; use wallet::cli::{ Command, SubcommandReturnValue, account::{AccountSubcommand, NewSubcommand}, programs::token::TokenProgramAgnosticSubcommand, }; -use crate::harness::{ScenarioOutput, finalize_step}; +use crate::harness::ScenarioOutput; const FANOUT_COUNT: usize = 10; const AMOUNT_PER_TRANSFER: u128 = 100; -pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result { +pub async fn run(ctx: &mut TestContext) -> Result { let mut output = ScenarioOutput::new("multi_recipient_fanout"); let def_id = new_public_account(ctx, &mut output, "create_acc_def").await?; let supply_id = new_public_account(ctx, &mut output, "create_acc_supply").await?; - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::New { - definition_account_id: public_mention(def_id), - supply_account_id: public_mention(supply_id), - name: "FanoutToken".to_owned(), - total_supply: 10_000_000, - }), - ) + output + .step(ctx, "token_new_fungible", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(def_id), + supply_account_id: public_mention(supply_id), + name: "FanoutToken".to_owned(), + total_supply: 10_000_000, + }), + ) + .await + }) .await?; - let step = finalize_step("token_new_fungible", started, pre_block, &ret, ctx).await?; - output.push(step); - } let mut recipients = Vec::with_capacity(FANOUT_COUNT); for i in 0..FANOUT_COUNT { @@ -44,45 +40,45 @@ pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result recipients.push(id); } - for (i, recipient_id) in recipients.iter().enumerate() { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::Send { - from: public_mention(supply_id), - to: Some(public_mention(*recipient_id)), - to_npk: None, - to_vpk: None, - to_identifier: Some(0), - amount: AMOUNT_PER_TRANSFER, - }), - ) - .await?; - let step = finalize_step(format!("transfer_{i:02}"), started, pre_block, &ret, ctx).await?; - output.push(step); + for (i, recipient_id) in recipients.iter().copied().enumerate() { + output + .step(ctx, format!("transfer_{i:02}"), async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(supply_id), + to: Some(public_mention(recipient_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: AMOUNT_PER_TRANSFER, + }), + ) + .await + }) + .await?; } Ok(output) } async fn new_public_account( - ctx: &mut test_fixtures::TestContext, + ctx: &mut TestContext, output: &mut ScenarioOutput, label: &str, ) -> Result { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Account(AccountSubcommand::New(NewSubcommand::Public { - cci: None, - label: None, - })), - ) - .await?; - let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - output.push(step); + let ret = output + .step(ctx, label, async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await + }) + .await?; match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), diff --git a/tools/integration_bench/src/scenarios/parallel.rs b/tools/integration_bench/src/scenarios/parallel.rs index 7ae03a09..c6a265b9 100644 --- a/tools/integration_bench/src/scenarios/parallel.rs +++ b/tools/integration_bench/src/scenarios/parallel.rs @@ -15,7 +15,7 @@ use wallet::cli::{ programs::token::TokenProgramAgnosticSubcommand, }; -use crate::harness::{BlockSize, ScenarioOutput, StepResult, finalize_step}; +use crate::harness::{BlockSize, ScenarioOutput, StepResult}; const PARALLEL_FANOUT_N: usize = 10; const AMOUNT_PER_TRANSFER: u128 = 100; @@ -43,47 +43,47 @@ pub async fn run(ctx: &mut TestContext) -> Result { .expect("usize fits u128") .saturating_mul(AMOUNT_PER_TRANSFER) .saturating_mul(10); - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::New { - definition_account_id: public_mention(def_id), - supply_account_id: public_mention(master_id), - name: "ParToken".to_owned(), - total_supply: total_mint, - }), - ) + output + .step(ctx, "token_new_fungible", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(def_id), + supply_account_id: public_mention(master_id), + name: "ParToken".to_owned(), + total_supply: total_mint, + }), + ) + .await + }) .await?; - let step = finalize_step("token_new_fungible", started, pre_block, &ret, ctx).await?; - output.push(step); - } // Fund each sender from master. Serial; this is setup, not measured throughput. - for (i, sender_id) in senders.iter().enumerate() { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::Send { - from: public_mention(master_id), - to: Some(public_mention(*sender_id)), - to_npk: None, - to_vpk: None, - to_identifier: Some(0), - amount: AMOUNT_PER_TRANSFER * 5, - }), - ) - .await?; - let step = - finalize_step(format!("fund_sender_{i:02}"), started, pre_block, &ret, ctx).await?; - output.push(step); + for (i, sender_id) in senders.iter().copied().enumerate() { + output + .step(ctx, format!("fund_sender_{i:02}"), async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(master_id), + to: Some(public_mention(sender_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: AMOUNT_PER_TRANSFER * 5, + }), + ) + .await + }) + .await?; } // The measured phase: submit N transfers as fast as possible, do not wait // for chain advance between submits. The sequencer batches whatever lands in - // its mempool before block_create_timeout. + // its mempool before block_create_timeout. The burst step is captured + // manually rather than via the `step()` helper because we need to time + // submit-and-inclusion as two separate intervals over a synthesised batch + // rather than per-tx. let pre_block_burst = ctx.sequencer_client().get_last_block_id().await?; let burst_started = Instant::now(); @@ -169,18 +169,18 @@ async fn new_public_account( output: &mut ScenarioOutput, label: &str, ) -> Result { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Account(AccountSubcommand::New(NewSubcommand::Public { - cci: None, - label: None, - })), - ) - .await?; - let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - output.push(step); + let ret = output + .step(ctx, label, async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await + }) + .await?; match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), diff --git a/tools/integration_bench/src/scenarios/private.rs b/tools/integration_bench/src/scenarios/private.rs index 54dcab2b..2be8c43c 100644 --- a/tools/integration_bench/src/scenarios/private.rs +++ b/tools/integration_bench/src/scenarios/private.rs @@ -1,18 +1,16 @@ //! Private chained flow: shielded, deshielded, and private-to-private transfers. -use std::time::Instant; - use anyhow::{Result, bail}; -use test_fixtures::{private_mention, public_mention}; +use test_fixtures::{TestContext, private_mention, public_mention}; use wallet::cli::{ Command, SubcommandReturnValue, account::{AccountSubcommand, NewSubcommand}, programs::token::TokenProgramAgnosticSubcommand, }; -use crate::harness::{ScenarioOutput, finalize_step}; +use crate::harness::ScenarioOutput; -pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result { +pub async fn run(ctx: &mut TestContext) -> Result { let mut output = ScenarioOutput::new("private_chained_flow"); let def_id = new_public_account(ctx, &mut output, "create_acc_def").await?; @@ -23,103 +21,95 @@ pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result let private_b = new_private_account(ctx, &mut output, "create_acc_priv_b").await?; // Mint into public supply. - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::New { - definition_account_id: public_mention(def_id), - supply_account_id: public_mention(supply_id), - name: "PrivToken".to_owned(), - total_supply: 1_000_000, - }), - ) + output + .step(ctx, "token_new_fungible", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(def_id), + supply_account_id: public_mention(supply_id), + name: "PrivToken".to_owned(), + total_supply: 1_000_000, + }), + ) + .await + }) .await?; - let step = finalize_step("token_new_fungible", started, pre_block, &ret, ctx).await?; - output.push(step); - } // Shielded transfer: public supply -> private_a. - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::Send { - from: public_mention(supply_id), - to: Some(private_mention(private_a)), - to_npk: None, - to_vpk: None, - to_identifier: Some(0), - amount: 1_000, - }), - ) + output + .step(ctx, "shielded_transfer", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(supply_id), + to: Some(private_mention(private_a)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 1_000, + }), + ) + .await + }) .await?; - let step = finalize_step("shielded_transfer", started, pre_block, &ret, ctx).await?; - output.push(step); - } // Deshielded transfer: private_a -> public_recipient. - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::Send { - from: private_mention(private_a), - to: Some(public_mention(public_recipient_id)), - to_npk: None, - to_vpk: None, - to_identifier: Some(0), - amount: 100, - }), - ) + output + .step(ctx, "deshielded_transfer", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: private_mention(private_a), + to: Some(public_mention(public_recipient_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 100, + }), + ) + .await + }) .await?; - let step = finalize_step("deshielded_transfer", started, pre_block, &ret, ctx).await?; - output.push(step); - } // Private-to-private transfer: private_a -> private_b. - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::Send { - from: private_mention(private_a), - to: Some(private_mention(private_b)), - to_npk: None, - to_vpk: None, - to_identifier: Some(0), - amount: 200, - }), - ) + output + .step(ctx, "private_to_private", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: private_mention(private_a), + to: Some(private_mention(private_b)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 200, + }), + ) + .await + }) .await?; - let step = finalize_step("private_to_private", started, pre_block, &ret, ctx).await?; - output.push(step); - } Ok(output) } async fn new_public_account( - ctx: &mut test_fixtures::TestContext, + ctx: &mut TestContext, output: &mut ScenarioOutput, label: &str, ) -> Result { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Account(AccountSubcommand::New(NewSubcommand::Public { - cci: None, - label: None, - })), - ) - .await?; - let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - output.push(step); + let ret = output + .step(ctx, label, async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await + }) + .await?; match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), @@ -127,22 +117,22 @@ async fn new_public_account( } async fn new_private_account( - ctx: &mut test_fixtures::TestContext, + ctx: &mut TestContext, output: &mut ScenarioOutput, label: &str, ) -> Result { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Account(AccountSubcommand::New(NewSubcommand::Private { - cci: None, - label: None, - })), - ) - .await?; - let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - output.push(step); + let ret = output + .step(ctx, label, async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Private { + cci: None, + label: None, + })), + ) + .await + }) + .await?; match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), diff --git a/tools/integration_bench/src/scenarios/token.rs b/tools/integration_bench/src/scenarios/token.rs index 235394e0..d1dfdef3 100644 --- a/tools/integration_bench/src/scenarios/token.rs +++ b/tools/integration_bench/src/scenarios/token.rs @@ -1,102 +1,94 @@ //! Token onboarding scenario: create accounts, mint, public transfer, private transfer. -use std::time::Instant; - use anyhow::{Result, bail}; -use test_fixtures::{private_mention, public_mention}; +use test_fixtures::{TestContext, private_mention, public_mention}; use wallet::cli::{ Command, SubcommandReturnValue, account::{AccountSubcommand, NewSubcommand}, programs::token::TokenProgramAgnosticSubcommand, }; -use crate::harness::{ScenarioOutput, finalize_step}; +use crate::harness::ScenarioOutput; -pub async fn run(ctx: &mut test_fixtures::TestContext) -> Result { +pub async fn run(ctx: &mut TestContext) -> Result { let mut output = ScenarioOutput::new("token_onboarding"); let definition_id = new_public_account(ctx, &mut output, "create_pub_definition").await?; let supply_id = new_public_account(ctx, &mut output, "create_pub_supply").await?; let recipient_id = new_public_account(ctx, &mut output, "create_pub_recipient").await?; - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::New { - definition_account_id: public_mention(definition_id), - supply_account_id: public_mention(supply_id), - name: "BenchToken".to_owned(), - total_supply: 1_000_000, - }), - ) + output + .step(ctx, "token_new_fungible", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::New { + definition_account_id: public_mention(definition_id), + supply_account_id: public_mention(supply_id), + name: "BenchToken".to_owned(), + total_supply: 1_000_000, + }), + ) + .await + }) .await?; - let step = finalize_step("token_new_fungible", started, pre_block, &ret, ctx).await?; - output.push(step); - } - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::Send { - from: public_mention(supply_id), - to: Some(public_mention(recipient_id)), - to_npk: None, - to_vpk: None, - to_identifier: Some(0), - amount: 1_000, - }), - ) + output + .step(ctx, "token_public_transfer", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(supply_id), + to: Some(public_mention(recipient_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 1_000, + }), + ) + .await + }) .await?; - let step = finalize_step("token_public_transfer", started, pre_block, &ret, ctx).await?; - output.push(step); - } let private_recipient_id = new_private_account(ctx, &mut output, "create_priv_recipient").await?; - { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Token(TokenProgramAgnosticSubcommand::Send { - from: public_mention(supply_id), - to: Some(private_mention(private_recipient_id)), - to_npk: None, - to_vpk: None, - to_identifier: Some(0), - amount: 500, - }), - ) + output + .step(ctx, "token_shielded_transfer", async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Token(TokenProgramAgnosticSubcommand::Send { + from: public_mention(supply_id), + to: Some(private_mention(private_recipient_id)), + to_npk: None, + to_vpk: None, + to_identifier: Some(0), + amount: 500, + }), + ) + .await + }) .await?; - let step = finalize_step("token_shielded_transfer", started, pre_block, &ret, ctx).await?; - output.push(step); - } Ok(output) } async fn new_public_account( - ctx: &mut test_fixtures::TestContext, + ctx: &mut TestContext, output: &mut ScenarioOutput, label: &str, ) -> Result { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Account(AccountSubcommand::New(NewSubcommand::Public { - cci: None, - label: None, - })), - ) - .await?; - let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - output.push(step); + let ret = output + .step(ctx, label, async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Public { + cci: None, + label: None, + })), + ) + .await + }) + .await?; match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), @@ -104,22 +96,22 @@ async fn new_public_account( } async fn new_private_account( - ctx: &mut test_fixtures::TestContext, + ctx: &mut TestContext, output: &mut ScenarioOutput, label: &str, ) -> Result { - let pre_block = crate::harness::begin_step(ctx).await?; - let started = Instant::now(); - let ret = wallet::cli::execute_subcommand( - ctx.wallet_mut(), - Command::Account(AccountSubcommand::New(NewSubcommand::Private { - cci: None, - label: None, - })), - ) - .await?; - let step = finalize_step(label, started, pre_block, &ret, ctx).await?; - output.push(step); + let ret = output + .step(ctx, label, async |ctx| { + wallet::cli::execute_subcommand( + ctx.wallet_mut(), + Command::Account(AccountSubcommand::New(NewSubcommand::Private { + cci: None, + label: None, + })), + ) + .await + }) + .await?; match ret { SubcommandReturnValue::RegisterAccount { account_id } => Ok(account_id), other => bail!("expected RegisterAccount, got {other:?}"), From b0a5b3478b9c635f76b77446f09454e9e8bac406 Mon Sep 17 00:00:00 2001 From: moudyellaz Date: Wed, 20 May 2026 12:58:25 +0200 Subject: [PATCH 31/33] docs(integration_bench): add canonical run numbers from docker-compose sweep --- docs/benchmarks/integration_bench.md | 65 +++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/docs/benchmarks/integration_bench.md b/docs/benchmarks/integration_bench.md index a1295dec..dd7bfe6e 100644 --- a/docs/benchmarks/integration_bench.md +++ b/docs/benchmarks/integration_bench.md @@ -2,7 +2,7 @@ End-to-end LEZ scenarios driven through the wallet against a docker-compose Bedrock node + in-process sequencer + indexer (via `test_fixtures::TestContext`). Times each step and records borsh sizes per block, split by tx variant. -No numeric tables here yet. Absolute wall time and block sizes depend heavily on the bedrock config (block cadence and confirmation depth) and on dev-mode vs real proving; re-run the bench locally to get numbers for your own setup. Canonical numbers will be added once the bench runs against the standard configuration. +Numbers below are from a single-host docker-compose run on an Apple M2 Pro (CPU only, no GPU acceleration). Absolute wall time and block sizes depend heavily on the bedrock config (block cadence and confirmation depth) and on dev-mode vs real proving; re-run the bench locally to characterise your own setup. ## Scenarios @@ -27,12 +27,73 @@ No numeric tables here yet. Absolute wall time and block sizes depend heavily on | `bedrock_finality_s` | same in both modes | same in both modes (L1 cadence, not LEZ prover) | | Blocks captured | similar in both modes | real captures more empty clock-only ticks that fill prove wall-time | -Numbers are intentionally omitted in this document until the canonical run lands. Public-only scenarios converge between modes within run-to-run jitter; the qualitative differences are captured by the table above. +Tables below report dev-mode for all five scenarios. Real-proving numbers are included for `amm_swap_flow` (representative all-public) and `private_chained_flow` (representative chained-private flow); public-only scenarios converge between modes within run-to-run jitter, so a full real-proving sweep is not run here. ## Methodology Per scenario, every produced block is fetched via `getBlock(BlockId)` and serialized with `borsh::to_vec(&Block)`. Each transaction is serialized individually and counted by variant. Empty clock-only ticks give the per-block fixed-cost baseline. Wall time is captured per step (submit + inclusion + wallet sync) and aggregated to the per-scenario `total_s`. The one-time stack-setup cost (`shared_setup_s` at the run level) and the closing bedrock finality wait (`bedrock_finality_s` per scenario) are reported separately, not folded into `total_s`. +## Step latencies — dev mode (`RISC0_DEV_MODE=1`) + +Per-scenario wall time and Bedrock L1-finality latency for the closing tip. + +| Scenario | total_s | bedrock_finality_s | +|---|---:|---:| +| token_onboarding | 61.36 | 5.88 | +| amm_swap_flow | 156.50 | 27.99 | +| multi_recipient_fanout | 214.40 | 31.71 | +| private_chained_flow | 109.31 | 8.73 | +| parallel_fanout | 234.42 | 20.29 | + +Shared TestContext setup: 139.80 s (paid once per run). Total dev-mode wall time across all five scenarios: 1010.4 s. + +## Step latencies — real proving (selected scenarios) + +| Scenario | total_s | bedrock_finality_s | Δ vs dev | +|---|---:|---:|---:| +| amm_swap_flow | 156.20 | 26.95 | ~0 (all-public) | +| private_chained_flow | 391.74 | 9.40 | +282.4 s (≈ 94 s per PPE step × 3) | + +Per-step breakdown for `private_chained_flow` in real proving: + +| Step | submit_s | inclusion_s | total_s | +|---|---:|---:|---:| +| token_new_fungible (public) | 0.003 | 10.857 | 11.006 | +| shielded_transfer (PPE) | 125.416 | 0.001 | 125.469 | +| deshielded_transfer (PPE) | 126.261 | 0.001 | 126.311 | +| private_to_private (PPE) | 128.875 | 0.001 | 128.934 | + +PPE steps move the cost from `inclusion_s` (waiting for the next sealed block) to `submit_s` (the wallet itself proving the PPE circuit before sending). Each PPE prove is ≈ 127 s on this CPU. + +## Block + tx sizes (borsh) — dev mode + +Per scenario, every produced block is fetched via `getBlock(BlockId)` and serialized with `borsh::to_vec(&Block)`. Each transaction is serialized individually and counted by variant. The empty clock-only ticks at `min` give the per-block fixed-cost baseline (≈ 334 bytes across all scenarios). + +| Scenario | blocks | block_bytes (mean) | block_bytes (min..max) | public_tx (mean / n) | ppe_tx (mean / n) | +|---|---:|---:|---|---:|---:| +| token_onboarding | 6 | 881 | 334..2,890 | 206 / 8 | 2,556 / 1 | +| amm_swap_flow | 16 | 553 | 334..1,011 | 248 / 24 | n/a | +| multi_recipient_fanout | 22 | 513 | 334..707 | 221 / 33 | n/a | +| private_chained_flow | 10 | 1,186 | 334..3,565 | 173 / 11 | 2,715 / 3 | +| parallel_fanout | 24 | 646 | 334..3,904 | 248 / 45 | n/a | + +## Block + tx sizes (borsh) — real proving + +| Scenario | blocks | block_bytes (mean) | block_bytes (min..max) | public_tx (mean / n) | ppe_tx (mean / n) | +|---|---:|---:|---|---:|---:| +| amm_swap_flow | 16 | 553 | 334..1,011 | 248 / 24 | n/a | +| private_chained_flow | 39 | 17,707 | 334..226,578 | 158 / 40 | 225,728 / 3 | + +`amm_swap_flow` is byte-identical between dev and real (no proof payload). `private_chained_flow`'s `ppe_tx_bytes` matches the cycle_bench `S_agg` measurement (≈ 225 KB borsh InnerReceipt). The `block_bytes` max (226,578) is the block containing the largest PPE transaction. + +## Findings + +- Public-only scenarios converge between dev mode and real proving in both latency and byte counts. Either mode is suitable to characterize them. +- PPE transactions are ≈ 225 KB on the wire in real proving, dominated by the outer succinct proof. Dev mode emits a ≈ 2.7 KB stub that does not represent the L1 payload; fee-model storage gas inputs must come from a real-proving run. +- Per-PPE-step prove cost on this CPU is ≈ 127 s, paid on the wallet side at submit time, not on the sequencer. For a single-program chained flow the cost stacks linearly. +- Empty clock-only ticks set the per-block fixed-cost baseline at ≈ 334 bytes across all scenarios and both modes. +- Bedrock L1 finality varies in the 6 to 32 s range across scenarios, driven by L1 cadence and which tick the closing wait happens to land on, not by the LEZ prover. + ## Reproduce Prerequisite: a running local Docker daemon (the `bedrock/docker-compose.yml` is brought up by the bench). From 33b20bb480ff20a93fb2dfbdf773dd1bfa4a5d8d Mon Sep 17 00:00:00 2001 From: moudyellaz Date: Wed, 20 May 2026 13:08:48 +0200 Subject: [PATCH 32/33] ci(integration_bench): apply nightly rustfmt and drop integration_tests unused deps --- Cargo.lock | 7 ------- integration_tests/Cargo.toml | 7 ------- tools/integration_bench/src/harness.rs | 5 ++++- tools/integration_bench/src/scenarios/amm.rs | 20 ++++++++++++++++++-- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7efb7761..109676ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3994,29 +3994,22 @@ dependencies = [ "authenticated_transfer_core", "bytesize", "common", - "env_logger", "faucet_core", - "futures", "hex", "indexer_ffi", - "indexer_service", "indexer_service_protocol", "indexer_service_rpc", - "jsonrpsee", "key_protocol", "log", "nssa", "nssa_core", "sequencer_core", - "sequencer_service", "sequencer_service_rpc", "serde_json", "tempfile", "test_fixtures", - "testcontainers", "token_core", "tokio", - "url", "vault_core", "wallet", "wallet-ffi", diff --git a/integration_tests/Cargo.toml b/integration_tests/Cargo.toml index 04cd8f8c..82d8ebd1 100644 --- a/integration_tests/Cargo.toml +++ b/integration_tests/Cargo.toml @@ -14,11 +14,9 @@ nssa_core = { workspace = true, features = ["host"] } nssa.workspace = true authenticated_transfer_core.workspace = true sequencer_core = { workspace = true, features = ["default", "testnet"] } -sequencer_service.workspace = true wallet.workspace = true common.workspace = true key_protocol.workspace = true -indexer_service.workspace = true serde_json.workspace = true token_core.workspace = true ata_core.workspace = true @@ -26,18 +24,13 @@ vault_core.workspace = true faucet_core.workspace = true indexer_service_rpc = { workspace = true, features = ["client"] } sequencer_service_rpc = { workspace = true, features = ["client"] } -jsonrpsee = { workspace = true, features = ["ws-client"] } wallet-ffi.workspace = true indexer_ffi.workspace = true indexer_service_protocol.workspace = true -url.workspace = true anyhow.workspace = true -env_logger.workspace = true log.workspace = true tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } hex.workspace = true tempfile.workspace = true bytesize.workspace = true -futures.workspace = true -testcontainers = { version = "0.27.3", features = ["docker-compose"] } diff --git a/tools/integration_bench/src/harness.rs b/tools/integration_bench/src/harness.rs index 9337f3ed..fb9d4d5c 100644 --- a/tools/integration_bench/src/harness.rs +++ b/tools/integration_bench/src/harness.rs @@ -61,7 +61,10 @@ pub struct ScenarioOutput { /// reporting the sequencer tip as L1-finalised. Effectively measures the /// sequencer→Bedrock posting + Bedrock finalisation + indexer L1 ingest path. /// A value at the timeout (60s) means finalisation did not happen within the bench window. - #[serde(serialize_with = "ser_opt_duration_secs", rename = "bedrock_finality_s")] + #[serde( + serialize_with = "ser_opt_duration_secs", + rename = "bedrock_finality_s" + )] pub bedrock_finality: Option, } diff --git a/tools/integration_bench/src/scenarios/amm.rs b/tools/integration_bench/src/scenarios/amm.rs index f05eed1a..79100c42 100644 --- a/tools/integration_bench/src/scenarios/amm.rs +++ b/tools/integration_bench/src/scenarios/amm.rs @@ -24,10 +24,26 @@ pub async fn run(ctx: &mut TestContext) -> Result { let user_lp = new_public_account(ctx, &mut output, "create_acc_user_lp").await?; timed_token_new(ctx, &mut output, "token_a_new", def_a, supply_a, "TokA").await?; - timed_token_send(ctx, &mut output, "token_a_fund_user", supply_a, user_a, 1_000).await?; + timed_token_send( + ctx, + &mut output, + "token_a_fund_user", + supply_a, + user_a, + 1_000, + ) + .await?; timed_token_new(ctx, &mut output, "token_b_new", def_b, supply_b, "TokB").await?; - timed_token_send(ctx, &mut output, "token_b_fund_user", supply_b, user_b, 1_000).await?; + timed_token_send( + ctx, + &mut output, + "token_b_fund_user", + supply_b, + user_b, + 1_000, + ) + .await?; output .step(ctx, "amm_new_pool", async |ctx| { From 715d52f605e25e4dc1ed774b70ef272c8800837a Mon Sep 17 00:00:00 2001 From: Moudy Date: Wed, 20 May 2026 16:04:53 +0200 Subject: [PATCH 33/33] chore(workspace): drop integration_tests workspace dep and clean test_fixtures docstring --- Cargo.toml | 1 - test_fixtures/src/lib.rs | 4 ---- 2 files changed, 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ce67c92a..b3dd2f2b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,7 +77,6 @@ faucet_core = { path = "programs/faucet/core" } vault_core = { path = "programs/vault/core" } test_program_methods = { path = "test_program_methods" } testnet_initial_state = { path = "testnet_initial_state" } -integration_tests = { path = "integration_tests" } test_fixtures = { path = "test_fixtures" } tokio = { version = "1.50", features = [ diff --git a/test_fixtures/src/lib.rs b/test_fixtures/src/lib.rs index da2b7be2..2c9dfb3a 100644 --- a/test_fixtures/src/lib.rs +++ b/test_fixtures/src/lib.rs @@ -1,9 +1,5 @@ //! Shared test/bench fixtures: spins up bedrock + sequencer + indexer + wallet //! end-to-end against docker-compose, exposes a `TestContext` callers can drive. -//! -//! Originally lived under `integration_tests`; split out so non-test consumers -//! (e.g. `integration_bench`) can depend on the fixtures without pulling in the -//! `integration_tests` test files. use std::{net::SocketAddr, path::Path, sync::LazyLock};