From 8ececc23d6e55308e8d558104fc37cbaa5d9a821 Mon Sep 17 00:00:00 2001 From: Tijesunimi004 Date: Mon, 23 Feb 2026 04:21:09 +0100 Subject: [PATCH 1/4] Create Test Fixture Library of Pre-compiled WASM Contracts #215 --- .gitignore | 1 + ...fixture_registration_and_invocation.1.json | 135 ++++++++++++++++++ tests/fixture_tests.rs | 31 +++- tests/fixtures/build_fixtures.sh | 11 ++ tests/fixtures/contracts/Cargo.toml | 2 +- .../{panic => always_panic}/Cargo.toml | 6 +- .../contracts/always_panic/src/lib.rs | 10 ++ .../{panic => always_panic}/src/test.rs | 0 .../contracts/budget_heavy/src/lib.rs | 40 +----- tests/fixtures/contracts/counter/src/lib.rs | 40 +----- .../contracts/cross_contract/src/lib.rs | 53 +------ tests/fixtures/contracts/echo/src/lib.rs | 24 +--- tests/fixtures/contracts/panic/src/lib.rs | 29 ---- tests/fixtures/wasm/always_panic.wasm | Bin 0 -> 885 bytes tests/fixtures/wasm/budget_heavy.wasm | Bin 0 -> 2194 bytes tests/fixtures/wasm/counter.wasm | Bin 0 -> 2825 bytes tests/fixtures/wasm/cross_contract.wasm | Bin 0 -> 1098 bytes tests/fixtures/wasm/echo.wasm | Bin 0 -> 619 bytes 18 files changed, 204 insertions(+), 178 deletions(-) create mode 100644 test_snapshots/test_fixture_registration_and_invocation.1.json create mode 100644 tests/fixtures/build_fixtures.sh rename tests/fixtures/contracts/{panic => always_panic}/Cargo.toml (71%) create mode 100644 tests/fixtures/contracts/always_panic/src/lib.rs rename tests/fixtures/contracts/{panic => always_panic}/src/test.rs (100%) delete mode 100644 tests/fixtures/contracts/panic/src/lib.rs create mode 100644 tests/fixtures/wasm/always_panic.wasm create mode 100644 tests/fixtures/wasm/budget_heavy.wasm create mode 100644 tests/fixtures/wasm/counter.wasm create mode 100644 tests/fixtures/wasm/cross_contract.wasm create mode 100644 tests/fixtures/wasm/echo.wasm diff --git a/.gitignore b/.gitignore index b4a04b9..a10fce2 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ Cargo.lock # Test outputs /tests/outputs/ *.wasm +!tests/fixtures/wasm/*.wasm # Logs *.log diff --git a/test_snapshots/test_fixture_registration_and_invocation.1.json b/test_snapshots/test_fixture_registration_and_invocation.1.json new file mode 100644 index 0000000..7dc2b31 --- /dev/null +++ b/test_snapshots/test_fixture_registration_and_invocation.1.json @@ -0,0 +1,135 @@ +{ + "generators": { + "address": 1, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBKMUZNFQIAL775XBB2W2GP5CNHBM5YGH6C3XB7AY6SUVO2IBU3VYK2V", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBKMUZNFQIAL775XBB2W2GP5CNHBM5YGH6C3XB7AY6SUVO2IBU3VYK2V", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "626e043a6d5a8dcf3478766a72fcf3a01b5ec28abebdade8759dbc23cd1aacab" + }, + "storage": [ + { + "key": { + "symbol": "c" + }, + "val": { + "i64": 2 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "626e043a6d5a8dcf3478766a72fcf3a01b5ec28abebdade8759dbc23cd1aacab" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": { + "v1": { + "ext": "v0", + "cost_inputs": { + "ext": "v0", + "n_instructions": 243, + "n_functions": 13, + "n_globals": 3, + "n_table_entries": 1, + "n_types": 9, + "n_data_segments": 0, + "n_elem_segments": 0, + "n_imports": 5, + "n_exports": 6, + "n_data_segment_bytes": 0 + } + } + }, + "hash": "626e043a6d5a8dcf3478766a72fcf3a01b5ec28abebdade8759dbc23cd1aacab", + "code": "0061736d0100000001360960017e017e60027e7e017e60037e7e7e017e6000017e60037f7e7e017e60037f7e7e017f60000060027f7e017e60047f7e7e7e017e021f05016901320000016901310000016c01310001016c01300001016c015f0002030e0d030304050607070807070404080405017001010105030100100619037f01418080c0000b7f00418080c0000b7f00418080c0000b073b06066d656d6f7279020003676574000509696e6372656d656e740006015f00090a5f5f646174615f656e6403010b5f5f686561705f6261736503020af3040dc60103017f017e017f23808080800041106b22002480808080000240024002402000410f6a428ed00042021088808080000d00420021010c010b024002402000410f6a428ed00042021087808080002201a741ff0171220241c100460d00024020024107470d00200142088721010c020b000b2000410f6a2001108a8080800021010b20014280808080808080c0007c42808080808080808001540d002000410f6a2001108b8080800021010c010b200142088642078421010b200041106a24808080800020010b9a0204017f017e017f017e23808080800041106b220024808080800042012101024002402000410f6a428ed0004202108880808000450d00024002402000410f6a428ed00042021087808080002201a741ff0171220241c100460d00024020024107470d00200142088721030c020b000b2000410f6a2001108a8080800021030b200342017c210120034281808080808080c0007c42808080808080808001540d002000410f6a2001108b8080800021030c010b200142088642078421030b2000410f6a428ed00020034202108c808080001a0240024020014280808080808080c0007c42808080808080808001540d002000410f6a2001108b8080800021010c010b200142088642078421010b200041106a24808080800020010b0e00200020012002108f808080000b11002000200120021090808080004201510b02000b0c0020002001108d808080000b0c0020002001108e808080000b100020002001200220031091808080000b0a0020011080808080000b0a0020011081808080000b0c00200120021082808080000b0c00200120021083808080000b0e002001200220031084808080000b004f0e636f6e747261637473706563763000000000000000000000000367657400000000000000000100000007000000000000000000000009696e6372656d656e74000000000000000000000100000007001e11636f6e7472616374656e766d6574617630000000000000001600000000006f0e636f6e74726163746d65746176300000000000000005727376657200000000000006312e39332e3100000000000000000008727373646b7665720000003032322e302e3130233961316237356235303961353035336236373662303966646264323234666538633566326663643500f30b046e616d65001514636f756e7465725f666978747572652e7761736d01c00b1200405f5a4e3137736f726f62616e5f656e765f677565737435677565737433696e7431306f626a5f746f5f693634313768383665316531663538643834346237384501425f5a4e3137736f726f62616e5f656e765f677565737435677565737433696e7431326f626a5f66726f6d5f6936343137683064393630393634626533373839396445024a5f5a4e3137736f726f62616e5f656e765f6775657374356775657374366c656467657231376765745f636f6e74726163745f646174613137686234663737313039666434663062323645034a5f5a4e3137736f726f62616e5f656e765f6775657374356775657374366c656467657231376861735f636f6e74726163745f646174613137686334656531343033306334333337326245044a5f5a4e3137736f726f62616e5f656e765f6775657374356775657374366c656467657231377075745f636f6e74726163745f64617461313768363336343339613761316530393536304505036765740609696e6372656d656e7407425f5a4e3131736f726f62616e5f73646b3773746f726167653753746f7261676531326765745f696e7465726e616c313768643563613862346130383965333833304508425f5a4e3131736f726f62616e5f73646b3773746f726167653753746f7261676531326861735f696e7465726e616c313768313362656564633430666162613463634509015f0a6b5f5a4e37305f244c5424736f726f62616e5f73646b2e2e656e762e2e456e76247532302461732475323024736f726f62616e5f656e765f636f6d6d6f6e2e2e656e762e2e456e762447542431306f626a5f746f5f69363431376834623166313764363834313362623632450b6d5f5a4e37305f244c5424736f726f62616e5f73646b2e2e656e762e2e456e76247532302461732475323024736f726f62616e5f656e765f636f6d6d6f6e2e2e656e762e2e456e762447542431326f626a5f66726f6d5f69363431376833333434353331636234616663323339450c725f5a4e37305f244c5424736f726f62616e5f73646b2e2e656e762e2e456e76247532302461732475323024736f726f62616e5f656e765f636f6d6d6f6e2e2e656e762e2e456e762447542431377075745f636f6e74726163745f6461746131376836386261636563393935663364323039450d755f5a4e38305f244c5424736f726f62616e5f656e765f67756573742e2e67756573742e2e4775657374247532302461732475323024736f726f62616e5f656e765f636f6d6d6f6e2e2e656e762e2e456e762447542431306f626a5f746f5f69363431376838633334663161646233373437336437450e775f5a4e38305f244c5424736f726f62616e5f656e765f67756573742e2e67756573742e2e4775657374247532302461732475323024736f726f62616e5f656e765f636f6d6d6f6e2e2e656e762e2e456e762447542431326f626a5f66726f6d5f69363431376866393633376331653333303261316262450f7c5f5a4e38305f244c5424736f726f62616e5f656e765f67756573742e2e67756573742e2e4775657374247532302461732475323024736f726f62616e5f656e765f636f6d6d6f6e2e2e656e762e2e456e762447542431376765745f636f6e74726163745f646174613137686538666538653935646334666661373945107c5f5a4e38305f244c5424736f726f62616e5f656e765f67756573742e2e67756573742e2e4775657374247532302461732475323024736f726f62616e5f656e765f636f6d6d6f6e2e2e656e762e2e456e762447542431376861735f636f6e74726163745f646174613137686639386664623934303931656665663045117c5f5a4e38305f244c5424736f726f62616e5f656e765f67756573742e2e67756573742e2e4775657374247532302461732475323024736f726f62616e5f656e765f636f6d6d6f6e2e2e656e762e2e456e762447542431377075745f636f6e74726163745f646174613137686362373061366564353466663364343745071201000f5f5f737461636b5f706f696e746572004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e39332e31202830316636646466373520323032362d30322d3131290094010f7461726765745f6665617475726573082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e63652d74797065732b087369676e2d657874" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/tests/fixture_tests.rs b/tests/fixture_tests.rs index c5d2f0d..697c944 100644 --- a/tests/fixture_tests.rs +++ b/tests/fixture_tests.rs @@ -126,5 +126,34 @@ fn test_fixture_inspect_command() { // Should succeed and show functions cmd.assert() .success() - .stdout(predicates::str::contains("Exported Functions")); + .stderr(predicates::str::contains("Exported Functions")); +} + +#[test] +fn test_fixture_registration_and_invocation() { + use soroban_sdk::{Env, Symbol}; + + let fixture_path = get_fixture_path("counter"); + if !fixture_path.exists() { + return; + } + + let wasm_bytes = fs::read(fixture_path).unwrap(); + let env = Env::default(); + let contract_id = env.register_contract_wasm(None, soroban_sdk::Bytes::from_slice(&env, &wasm_bytes)); + + // Call increment + let first: i64 = env.invoke_contract( + &contract_id, + &Symbol::new(&env, "increment"), + soroban_sdk::vec![&env], + ); + assert_eq!(first, 1); + + let second: i64 = env.invoke_contract( + &contract_id, + &Symbol::new(&env, "increment"), + soroban_sdk::vec![&env], + ); + assert_eq!(second, 2); } diff --git a/tests/fixtures/build_fixtures.sh b/tests/fixtures/build_fixtures.sh new file mode 100644 index 0000000..46f25d8 --- /dev/null +++ b/tests/fixtures/build_fixtures.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e +WASM_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/wasm" +mkdir -p "$WASM_DIR" +for dir in "$(dirname "${BASH_SOURCE[0]}")"/contracts/*/; do + if [ -f "${dir}Cargo.toml" ]; then + name=$(basename "$dir") + (cd "$dir" && cargo build --release --target wasm32-unknown-unknown) + cp "${dir}target/wasm32-unknown-unknown/release/${name//-/_}.wasm" "$WASM_DIR/${name}.wasm" + fi +done diff --git a/tests/fixtures/contracts/Cargo.toml b/tests/fixtures/contracts/Cargo.toml index a9ccd75..b08d6e6 100644 --- a/tests/fixtures/contracts/Cargo.toml +++ b/tests/fixtures/contracts/Cargo.toml @@ -2,7 +2,7 @@ members = [ "counter", "echo", - "panic", + "always_panic", "budget_heavy", "cross_contract", ] diff --git a/tests/fixtures/contracts/panic/Cargo.toml b/tests/fixtures/contracts/always_panic/Cargo.toml similarity index 71% rename from tests/fixtures/contracts/panic/Cargo.toml rename to tests/fixtures/contracts/always_panic/Cargo.toml index 945ae78..47277bc 100644 --- a/tests/fixtures/contracts/panic/Cargo.toml +++ b/tests/fixtures/contracts/always_panic/Cargo.toml @@ -1,19 +1,15 @@ [package] -name = "panic-fixture" +name = "always-panic-fixture" version = "0.1.0" edition = "2021" publish = false [lib] crate-type = ["cdylib"] -doctest = false [dependencies] soroban-sdk = { version = "22.0.0" } -[dev-dependencies] -soroban-sdk = { version = "22.0.0", features = ["testutils"] } - [profile.release] opt-level = "z" overflow-checks = true diff --git a/tests/fixtures/contracts/always_panic/src/lib.rs b/tests/fixtures/contracts/always_panic/src/lib.rs new file mode 100644 index 0000000..78dfc50 --- /dev/null +++ b/tests/fixtures/contracts/always_panic/src/lib.rs @@ -0,0 +1,10 @@ +#![no_std] +use soroban_sdk::{contract, contractimpl, Env}; + +#[contract] +pub struct AlwaysPanic; + +#[contractimpl] +impl AlwaysPanic { + pub fn panic(_env: Env) { panic!("p") } +} diff --git a/tests/fixtures/contracts/panic/src/test.rs b/tests/fixtures/contracts/always_panic/src/test.rs similarity index 100% rename from tests/fixtures/contracts/panic/src/test.rs rename to tests/fixtures/contracts/always_panic/src/test.rs diff --git a/tests/fixtures/contracts/budget_heavy/src/lib.rs b/tests/fixtures/contracts/budget_heavy/src/lib.rs index 1184736..85d57ea 100644 --- a/tests/fixtures/contracts/budget_heavy/src/lib.rs +++ b/tests/fixtures/contracts/budget_heavy/src/lib.rs @@ -1,5 +1,4 @@ #![no_std] - use soroban_sdk::{contract, contractimpl, symbol_short, Env, Vec}; #[contract] @@ -7,41 +6,12 @@ pub struct BudgetHeavy; #[contractimpl] impl BudgetHeavy { - /// Perform a budget-heavy operation with many iterations - pub fn heavy_computation(env: Env, iterations: u32) -> u32 { - let mut result = 0u32; - for i in 0..iterations { - // Perform some computation - result = result.wrapping_add(i); - - // Store intermediate results (costs budget) - env.storage() - .instance() - .set(&symbol_short!("iter"), &i); - } - result - } - - /// Allocate and manipulate large vectors - pub fn heavy_memory(env: Env, size: u32) -> u32 { - let mut vec = Vec::::new(&env); - for i in 0..size { - vec.push_back(i); - } - vec.len() - } - - /// Nested loops for CPU-intensive operations - pub fn nested_loops(env: Env, n: u32) -> u32 { - let mut sum = 0u32; + pub fn heavy(env: Env, n: u32) -> u32 { + let mut v = Vec::::new(&env); for i in 0..n { - for j in 0..n { - sum = sum.wrapping_add(i.wrapping_mul(j)); - } + v.push_back(i); + env.storage().instance().set(&symbol_short!("i"), &i); } - sum + v.len() } } - -#[cfg(test)] -mod test; diff --git a/tests/fixtures/contracts/counter/src/lib.rs b/tests/fixtures/contracts/counter/src/lib.rs index a29b7f3..6dd98ff 100644 --- a/tests/fixtures/contracts/counter/src/lib.rs +++ b/tests/fixtures/contracts/counter/src/lib.rs @@ -1,5 +1,4 @@ #![no_std] - use soroban_sdk::{contract, contractimpl, symbol_short, Env}; #[contract] @@ -7,43 +6,12 @@ pub struct Counter; #[contractimpl] impl Counter { - /// Initialize the counter with a starting value - pub fn init(env: Env, value: i64) { - env.storage().instance().set(&symbol_short!("count"), &value); - } - - /// Increment the counter by 1 pub fn increment(env: Env) -> i64 { - let current: i64 = env - .storage() - .instance() - .get(&symbol_short!("count")) - .unwrap_or(0); - let new_value = current + 1; - env.storage().instance().set(&symbol_short!("count"), &new_value); - new_value + let val: i64 = env.storage().instance().get(&symbol_short!("c")).unwrap_or(0) + 1; + env.storage().instance().set(&symbol_short!("c"), &val); + val } - - /// Decrement the counter by 1 - pub fn decrement(env: Env) -> i64 { - let current: i64 = env - .storage() - .instance() - .get(&symbol_short!("count")) - .unwrap_or(0); - let new_value = current - 1; - env.storage().instance().set(&symbol_short!("count"), &new_value); - new_value - } - - /// Get the current counter value pub fn get(env: Env) -> i64 { - env.storage() - .instance() - .get(&symbol_short!("count")) - .unwrap_or(0) + env.storage().instance().get(&symbol_short!("c")).unwrap_or(0) } } - -#[cfg(test)] -mod test; diff --git a/tests/fixtures/contracts/cross_contract/src/lib.rs b/tests/fixtures/contracts/cross_contract/src/lib.rs index 7ccd126..7896489 100644 --- a/tests/fixtures/contracts/cross_contract/src/lib.rs +++ b/tests/fixtures/contracts/cross_contract/src/lib.rs @@ -1,55 +1,12 @@ #![no_std] - -use soroban_sdk::{contract, contractimpl, symbol_short, Address, Env, Val}; +use soroban_sdk::{contract, contractimpl, Address, Env, Symbol, Val, Vec}; #[contract] -pub struct CrossContractCaller; +pub struct Caller; #[contractimpl] -impl CrossContractCaller { - /// Call another contract's function - /// - /// # Arguments - /// * `callee` - Address of the contract to call - /// * `function` - Function name to call (as symbol) - /// * `args` - Arguments to pass to the function - pub fn call_contract( - env: Env, - callee: Address, - function: soroban_sdk::Symbol, - args: Vec, - ) -> Val { - env.invoke_contract(&callee, &function, &args) - } - - /// Call another contract's echo function with a value - pub fn call_echo(env: Env, callee: Address, value: Val) -> Val { - let args = soroban_sdk::vec![&env, value]; - env.invoke_contract(&callee, &symbol_short!("echo"), &args) - } - - /// Chain call: call a contract that calls another contract - pub fn chain_call( - env: Env, - first: Address, - second: Address, - value: Val, - ) -> Val { - // Call first contract - let first_result = env.invoke_contract( - &first, - &symbol_short!("echo"), - &soroban_sdk::vec![&env, value], - ); - - // Call second contract with first result - env.invoke_contract( - &second, - &symbol_short!("echo"), - &soroban_sdk::vec![&env, first_result], - ) +impl Caller { + pub fn call(env: Env, c: Address, f: Symbol, a: Vec) -> Val { + env.invoke_contract(&c, &f, a) } } - -#[cfg(test)] -mod test; diff --git a/tests/fixtures/contracts/echo/src/lib.rs b/tests/fixtures/contracts/echo/src/lib.rs index 688e42f..f197494 100644 --- a/tests/fixtures/contracts/echo/src/lib.rs +++ b/tests/fixtures/contracts/echo/src/lib.rs @@ -1,5 +1,4 @@ #![no_std] - use soroban_sdk::{contract, contractimpl, Env, Val}; #[contract] @@ -7,26 +6,5 @@ pub struct Echo; #[contractimpl] impl Echo { - /// Echo function that returns its input unchanged - pub fn echo(_env: Env, value: Val) -> Val { - value - } - - /// Echo a string - pub fn echo_string(_env: Env, value: soroban_sdk::String) -> soroban_sdk::String { - value - } - - /// Echo an integer - pub fn echo_i64(_env: Env, value: i64) -> i64 { - value - } - - /// Echo a boolean - pub fn echo_bool(_env: Env, value: bool) -> bool { - value - } + pub fn echo(_env: Env, v: Val) -> Val { v } } - -#[cfg(test)] -mod test; diff --git a/tests/fixtures/contracts/panic/src/lib.rs b/tests/fixtures/contracts/panic/src/lib.rs deleted file mode 100644 index 42bbc25..0000000 --- a/tests/fixtures/contracts/panic/src/lib.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![no_std] - -use soroban_sdk::{contract, contractimpl, Env}; - -#[contract] -pub struct PanicContract; - -#[contractimpl] -impl PanicContract { - /// Always panics - useful for error testing - pub fn panic(_env: Env) { - panic!("This contract always panics"); - } - - /// Panics with a custom message - pub fn panic_with_message(_env: Env, message: soroban_sdk::String) { - panic!("{}", message); - } - - /// Panics when called with a specific value - pub fn panic_if_true(_env: Env, should_panic: bool) { - if should_panic { - panic!("Panic triggered by condition"); - } - } -} - -#[cfg(test)] -mod test; diff --git a/tests/fixtures/wasm/always_panic.wasm b/tests/fixtures/wasm/always_panic.wasm new file mode 100644 index 0000000000000000000000000000000000000000..3346bb77fc3cae382e3f503f134248b33e98030a GIT binary patch literal 885 zcmY*X%TC)s6uo07BqXQ_6hW!_h)Nf&TwAumHc?mULtT{x%L-{Sw#UZAFU^b-!lH@V zU+A)*&;_5+PwO}VL`NE(`_h>?_g)}8LjZtw8e>4;#{grrfU&w*EI@5G04ZvtiAsb} zQ$?`7aiA{HXu13g-35&P+~Q4*Evvba(X3!|1)3$vlR&a!Kpl)jA_%5=sG=^$7nGFP zC!DHE=c2I>HQN$K>gack{h!O_5}>OMifOwBrWd+s#e`2a7r?}}+Y&8Q&v^?R$L;-2ikWRvkJWow!Z z%NQOR);(vNaUM?AY16h1)3D6LA+dbV@f~wW9Md`SUC;H+VHEnIZ68PUByb`-3PJ~N zP$MT9g{KD(HRC9`5*4Gyte$<=xSbY4STXR~>GUHHKhW#zPqU0T7WOd4tl}cDyc)1i z<0QvbK1<|0P5kZjI4Bq$uDUr%@_23GC=-@GE=VxJ zWs&59vds>Hmcfd8OW^BfDXl7?j4SPwQ~R#4I8{M zt;h|-$a4m^X}h{<>z4HvexaTqET#fSl+>bmTkHB&I?>mws`VZ?dQl2(FCb~EOK}OK zfzS)t`?Sbot&>%$NTwvMsMgCWLHv~Jaa#B!<=W$XwIyXK8=yy}sD)`gMkC5-9#CD( OOUku2PvTssSK=R@lI}kM literal 0 HcmV?d00001 diff --git a/tests/fixtures/wasm/budget_heavy.wasm b/tests/fixtures/wasm/budget_heavy.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9d729d1e902b0a9f5f7009d966d2d1f5e2a13cdc GIT binary patch literal 2194 zcmcIlTW{k;6rQo2Hci^bfV5Iq0;SzPfTCEwWb9Z%VjEMG`~<}B;F13UXPl<#88{{=zRt+S4u6#a(>RIo4lFqdmn_QLUDS z`XQ*%sQYqP1)Jvat~Szkk@^^1w64-c`q$S!HOAa^Os(LNJS7Mwl z2@NhO)6hF_tN=thpNf)RV?3x$XV(F4DI0k)7x@xw%`$w)u$By*&Acf1$x?0FwqY8U z`N*eMx(~o(?ZF>-lAtSLJGfvQ-8(K=I0zKS`Dn1saoRIlh7*9^i zDi_9cIpn`=Y@-ju&px%hVwTS$n!-5E!*L~wlGLX&7tE4Jm{r9Q%ojVcydy6r)Nz<; z5qroZn*{iy*MYc+fCO^O%c?S5RjHm{z;YdT;P}*|mN0$dnt}5E>#$@lp3El^smvtu zg<~_~Sdl}hX9eni^G?Nc@bJyIX0V4XXy>QCx`q0E+3;27q0KbK8f5YCc#>Mm+@X*<{|V>FyAM! z!)?y|LdR6;q4^Mx8J$O4veSHk+g+Y|c+MvV6uX zCh|gQCNv#abS$v;v?@xp2`VOvLhycch8sD^*xSn`+kMxxVi(?gk92L*cKfE?x2*Tj z&$v_4T&_!)U%4oYX0IJp$w`0t5$<(vF#TCp_8u^rB>hRsC%Ir{e+K(HnWf`iYg#4c zWKNSx^g7e3q){UJ;{>*BQuN+R>#t3gP112c&Pw@bdYxRvA{QwW{qigmMXy;*#%W)i GmVW~=7Kc*+ literal 0 HcmV?d00001 diff --git a/tests/fixtures/wasm/counter.wasm b/tests/fixtures/wasm/counter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..85553596921e9aba523358ce76fd84bd44b870df GIT binary patch literal 2825 zcmcImTW{P%6rQp7mN?073seFL*tB^7t=1afZSm5qWGW#p0`kO*Gaiq(+j#B8m$a3t zY=DX)E(Ii>_yhcn^1?I!r9S}9c(ZAeMl=%5tTZ!c&YADbcYNl|B3eu_LI~R{yZ8Vf z>`Dismk;UziRpZ?B8K@cLc7vjSTsO}QF^fZ>-C5quFY= zJMDI((P=dC3}f7sG3vEmm*;r<@bC#z=IHd;ey`P<@@baemykT>C2ForQkL^6PfOIo z0a{rNf{2zh;AtddB?xYFItxNta9LV?+F1V!%Xkiq<~I(Zq3zz@b+lDarJLf{N88;y zqsM=vk<|N6SgfNF+Qe&EIjemnwAb+;+yCG%uS?s1qW9Mk?3cFNx7JY~k2;TFo1`G6 zhV0|s_hQ2)RzN2lLVJQ9ET@Nf2X+bPVEF^+7ET4ux1;t$u?-G;XK~a%R(_Wn3m*93 zIVK~#iO-(4=HiPJp5}M~7Vnc$-a>Juq=vbje zJZcfk2yMp>i5EvN)EjMyaGjv=Zk6wtN z3xqh&rbieg@@(SSX2=c4^}NWJKKL&TJK@oo=b8g`C0ItdE+%lE(2N~N6YR~Hgu3m^ z7sI+ui|4SI$+>0{gD}%D96j_K7sHxW&!5XSY}4?lLp4r3%O-wPWN+(;isE4J2NEMb%r&)T!?$*xMnS3!rE!LdK zc1`dc+PbeyU#7FOsbv_ZX&D-WD8)=SJbx{JneLo(KeZcD#+m0?u@ULS^Vciz>7I_~ z@y$}z`f91_EpgBOM`T@Qn6XBq&~Qx0h#Y_8?&Y{W8{^os4TovmFo+J7DD=AzF30h? z7oNLN;kai(4#zQdJim8Y-p?x$vFAda^-SVvJmxX+uUwY*^D>Qv4xu)WETC>grsKD- zV$=M2*Yev4z4kp zB*RG>O>)l4VFu4vlBMIp>a4Xq3dU{1$_@iE&5-!7L3` zq+@){NR9)-nW}7lMA`x=s|V+D!L+y7Q~R~6JTc(uZ*=kW2fW$>8KE!J-{|e0Hr;-< z1%@{L28UZnHp(Pjibi7(Z-~9)L(5}+j}=!0hTTkCdj46 zZk^9A3%HW(6nx2whH1^QCPT~lOAD}3a2_t2wC%cL(a?jRik6au!JXT*$T-Jsc{rNC7iGb$ch#_bRyyz)zj^75cvfTq zNo7Nqcvdnlyn5fST3&C?=s0A|Cyp%zooG0r&H<_)PYET%$j1HWulp^HtlY9Bmt`HK z%YNzFeZp(g0xBJvB}tb4gFAfPZ?(u|=sTY8(cv%}kD~E`no5=NRh7$PEvv59vJR`# z|3}YvgJ6Gu9#W+o>j&eGXnGbv*+Uy`_FgKkm^62#1$#j>k0 nAMB*{{O9>RotaTCs>=+z1&dh0Qp!wmnlnDw;PY8(viIT-2tX!P literal 0 HcmV?d00001 diff --git a/tests/fixtures/wasm/echo.wasm b/tests/fixtures/wasm/echo.wasm new file mode 100644 index 0000000000000000000000000000000000000000..b371af8223f7ce1e3ffd91f6c4a673e88de4a1ec GIT binary patch literal 619 zcmY*WL2lbH5L`;KV_QYtq(FckS{Uf1g+PN+D!WEceLye$07H>0MX*E(B;~}HB#-EW z`m{<`5;S|@?sBk$*;x>_CICR@-Zi-=_tyZv?*R!Wq$Pw*d;;&LAN&XM^YQU7gb(mK zpRvib#=0>_4+4}oP0z%EEI3!f365I%B;@=CMawf`(f1Z}FMt(<9)$4Yt!%V2LOR=` zJg{EJb3Bp3plt|p81tzy(yMH<-DGT+t4t-yw;aFAG*5D=QrHDr)Cd>ngAY6} z?_6haeLEPucyfmjes)1%$+>kx?s?mk+VyIF&0Eu`PNK2itP;BDM1dsu-B|~3dPt(R zsAzU16Vw06kE8I_7Z&FmrSfgMN?5X?ETM7y75~mRgktrK3&nLDlFYTGU Date: Mon, 23 Feb 2026 04:31:42 +0100 Subject: [PATCH 2/4] Fix CI formatting and clippy (PR #238) --- tests/fixture_tests.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/fixture_tests.rs b/tests/fixture_tests.rs index 697c944..aeab6e4 100644 --- a/tests/fixture_tests.rs +++ b/tests/fixture_tests.rs @@ -140,7 +140,8 @@ fn test_fixture_registration_and_invocation() { let wasm_bytes = fs::read(fixture_path).unwrap(); let env = Env::default(); - let contract_id = env.register_contract_wasm(None, soroban_sdk::Bytes::from_slice(&env, &wasm_bytes)); + let contract_id = + env.register_contract_wasm(None, soroban_sdk::Bytes::from_slice(&env, &wasm_bytes)); // Call increment let first: i64 = env.invoke_contract( From ae2b4cfdf4d228fcc911674299e9e307ce5d1ce5 Mon Sep 17 00:00:00 2001 From: Tijesunimi004 Date: Mon, 23 Feb 2026 04:44:19 +0100 Subject: [PATCH 3/4] Fix clippy deprecation warning in fixture_tests (PR #238) --- tests/fixture_tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixture_tests.rs b/tests/fixture_tests.rs index aeab6e4..f012b2b 100644 --- a/tests/fixture_tests.rs +++ b/tests/fixture_tests.rs @@ -141,7 +141,7 @@ fn test_fixture_registration_and_invocation() { let wasm_bytes = fs::read(fixture_path).unwrap(); let env = Env::default(); let contract_id = - env.register_contract_wasm(None, soroban_sdk::Bytes::from_slice(&env, &wasm_bytes)); + env.register(&*wasm_bytes, ()); // Call increment let first: i64 = env.invoke_contract( From 1c460d3f63125cacc876d2faa7278028f04f1e91 Mon Sep 17 00:00:00 2001 From: Tijesunimi004 Date: Mon, 23 Feb 2026 04:47:49 +0100 Subject: [PATCH 4/4] Fix final CI formatting issues (PR #238) --- tests/fixture_tests.rs | 3 +-- tests/fixtures/contracts/always_panic/src/lib.rs | 4 +++- tests/fixtures/contracts/counter/src/lib.rs | 12 ++++++++++-- tests/fixtures/contracts/echo/src/lib.rs | 4 +++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/tests/fixture_tests.rs b/tests/fixture_tests.rs index f012b2b..6cacdf5 100644 --- a/tests/fixture_tests.rs +++ b/tests/fixture_tests.rs @@ -140,8 +140,7 @@ fn test_fixture_registration_and_invocation() { let wasm_bytes = fs::read(fixture_path).unwrap(); let env = Env::default(); - let contract_id = - env.register(&*wasm_bytes, ()); + let contract_id = env.register(&*wasm_bytes, ()); // Call increment let first: i64 = env.invoke_contract( diff --git a/tests/fixtures/contracts/always_panic/src/lib.rs b/tests/fixtures/contracts/always_panic/src/lib.rs index 78dfc50..060dd66 100644 --- a/tests/fixtures/contracts/always_panic/src/lib.rs +++ b/tests/fixtures/contracts/always_panic/src/lib.rs @@ -6,5 +6,7 @@ pub struct AlwaysPanic; #[contractimpl] impl AlwaysPanic { - pub fn panic(_env: Env) { panic!("p") } + pub fn panic(_env: Env) { + panic!("p") + } } diff --git a/tests/fixtures/contracts/counter/src/lib.rs b/tests/fixtures/contracts/counter/src/lib.rs index 6dd98ff..9e5bce2 100644 --- a/tests/fixtures/contracts/counter/src/lib.rs +++ b/tests/fixtures/contracts/counter/src/lib.rs @@ -7,11 +7,19 @@ pub struct Counter; #[contractimpl] impl Counter { pub fn increment(env: Env) -> i64 { - let val: i64 = env.storage().instance().get(&symbol_short!("c")).unwrap_or(0) + 1; + let val: i64 = env + .storage() + .instance() + .get(&symbol_short!("c")) + .unwrap_or(0) + + 1; env.storage().instance().set(&symbol_short!("c"), &val); val } pub fn get(env: Env) -> i64 { - env.storage().instance().get(&symbol_short!("c")).unwrap_or(0) + env.storage() + .instance() + .get(&symbol_short!("c")) + .unwrap_or(0) } } diff --git a/tests/fixtures/contracts/echo/src/lib.rs b/tests/fixtures/contracts/echo/src/lib.rs index f197494..9ac0073 100644 --- a/tests/fixtures/contracts/echo/src/lib.rs +++ b/tests/fixtures/contracts/echo/src/lib.rs @@ -6,5 +6,7 @@ pub struct Echo; #[contractimpl] impl Echo { - pub fn echo(_env: Env, v: Val) -> Val { v } + pub fn echo(_env: Env, v: Val) -> Val { + v + } }