From 83343c88ddf8a31b80d5fd761c77d53cb37398c7 Mon Sep 17 00:00:00 2001 From: Samuel Dahunsi Date: Sat, 27 Jun 2026 23:28:58 +0100 Subject: [PATCH 1/4] impl protocol level fee logic --- Cargo.lock | 1 - engine-core/src/audit.rs | 37 +- engine-core/src/burn.rs | 21 +- engine-core/src/circuit_breaker.rs | 57 +- engine-core/src/event_struct.rs | 49 +- engine-core/src/event_utils.rs | 20 +- engine-core/src/governance.rs | 266 +--- engine-core/src/governance_tests.rs | 29 +- engine-core/src/lib.rs | 2 + engine-core/src/protocol_fee.rs | 396 ++++- engine-core/src/treasury.rs | 2 +- .../audit/tests/replay_is_rejected.1.json | 28 +- .../audit/tests/valid_first_commitment.1.json | 28 +- .../tests/trip_and_reset.1.json | 68 +- .../test_duplicate_approval_detection.1.json | 134 +- .../tests/test_full_proposal_lifecycle.1.json | 93 +- ...test_proposal_initial_state_pending.1.json | 31 +- ...eject_approval_of_executed_proposal.1.json | 93 +- ...eject_approval_on_approved_proposal.1.json | 62 +- .../tests/test_reject_double_execution.1.json | 93 +- ...eject_execution_of_pending_proposal.1.json | 108 +- ...ate_transition_approved_to_executed.1.json | 93 +- ...tate_transition_pending_to_approved.1.json | 62 +- .../fee_at_full_bps_is_full_amount.1.json | 93 ++ .../tests/fee_calculation_rounds_down.1.json | 93 ++ .../tests/fee_calculation_standard.1.json | 93 ++ .../tests/fee_calculation_zero_bps.1.json | 93 ++ ...fee_on_transfer_circuit_open_panics.1.json | 231 +++ ...ansfer_exempt_token_no_fee_deducted.1.json | 1026 +++++++++++++ ...sfer_full_bps_all_goes_to_recipient.1.json | 1005 +++++++++++++ ...nsfer_standard_fee_splits_correctly.1.json | 1282 +++++++++++++++++ ...ransfer_zero_bps_passes_full_amount.1.json | 1005 +++++++++++++ ...et_fee_config_returns_stored_values.1.json | 93 ++ .../tests/init_rejects_bps_over_max.1.json | 131 ++ ...ultiple_tokens_exempt_independently.1.json | 108 ++ .../tests/set_fee_bps_updates_rate.1.json | 93 ++ .../set_fee_recipient_updates_address.1.json | 93 ++ .../tests/token_exempt_cleared.1.json | 93 ++ .../token_exempt_false_by_default.1.json | 93 ++ .../tests/token_exempt_set_and_check.1.json | 108 ++ .../tests/zero_amount_no_fee.1.json | 93 ++ .../snapshot_creation_and_retrieval.1.json | 242 ++-- .../tests/snapshot_hash_verification.1.json | 242 ++-- ...al_blocked_before_time_lock_expires.1.json | 179 +++ ...al_executes_after_time_lock_expires.1.json | 250 ++++ 45 files changed, 7755 insertions(+), 757 deletions(-) create mode 100644 engine-core/test_snapshots/protocol_fee/tests/fee_at_full_bps_is_full_amount.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/fee_calculation_rounds_down.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/fee_calculation_standard.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/fee_calculation_zero_bps.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_circuit_open_panics.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_exempt_token_no_fee_deducted.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_full_bps_all_goes_to_recipient.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_standard_fee_splits_correctly.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_zero_bps_passes_full_amount.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/get_fee_config_returns_stored_values.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/init_rejects_bps_over_max.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/multiple_tokens_exempt_independently.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/set_fee_bps_updates_rate.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/set_fee_recipient_updates_address.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/token_exempt_cleared.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/token_exempt_false_by_default.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/token_exempt_set_and_check.1.json create mode 100644 engine-core/test_snapshots/protocol_fee/tests/zero_amount_no_fee.1.json create mode 100644 engine-core/test_snapshots/treasury/tests/withdrawal_blocked_before_time_lock_expires.1.json create mode 100644 engine-core/test_snapshots/treasury/tests/withdrawal_executes_after_time_lock_expires.1.json diff --git a/Cargo.lock b/Cargo.lock index 0293dc9..57a45e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -430,7 +430,6 @@ dependencies = [ name = "engine-core" version = "0.1.0" dependencies = [ - "hex", "sha2", "soroban-sdk", ] diff --git a/engine-core/src/audit.rs b/engine-core/src/audit.rs index 8e37215..f27039e 100644 --- a/engine-core/src/audit.rs +++ b/engine-core/src/audit.rs @@ -7,17 +7,18 @@ use sha2::{Digest, Sha256}; use soroban_sdk::{contracterror, panic_with_error, symbol_short, Env, Symbol}; +use crate::event_struct::{ACT_COMMIT, MOD_AUDIT}; +use crate::event_utils::publish_event; use crate::types::StateCommitment; -use crate::circuit_breaker::assert_closed; -const KEY_SEQ: Symbol = symbol_short!("SEQ"); +const KEY_SEQ: Symbol = symbol_short!("SEQ"); const KEY_PREV: Symbol = symbol_short!("PREV_H"); #[contracterror] #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] pub enum AuditError { - ReplayedSequence = 1, - HashMismatch = 2, + ReplayedSequence = 1, + HashMismatch = 2, AuthorUnauthorised = 3, } @@ -57,35 +58,13 @@ pub fn validate_transition(env: &Env, commitment: &StateCommitment, payload: &[u env.storage().instance().set(&KEY_SEQ, &commitment.sequence); env.storage().instance().set(&KEY_PREV, &actual); - // Single compact event — replaces the previous double-emit pattern. - publish_event( - env, - MOD_AUDIT | ACT_COMMIT, - commitment.sequence, - commitment.state_hash.clone(), - ); - // Emit structured Event for audit logs - let mut payload = Map::new(env); - payload.set(symbol_short!("seq"), commitment.sequence.into_val(env)); - payload.set(symbol_short!("hash"), commitment.state_hash.clone().into_val(env)); - publish_event(env, BytesN::from_array(env, &[0u8; 32]), BytesN::from_array(env, &[0u8; 32]), payload); + publish_event(env, MOD_AUDIT | ACT_COMMIT, commitment.sequence, commitment.state_hash.clone()); } #[cfg(test)] mod tests { - use soroban_sdk::contract; - - #[contract] - struct TestContract; - use super::*; - use soroban_sdk::{testutils::Address as _, contract, contractimpl, Address, BytesN, Env}; - - #[contract] - pub struct TestContract; - - #[contractimpl] - impl TestContract {} + use soroban_sdk::{testutils::Address as _, Address, BytesN, Env}; #[soroban_sdk::contract] pub struct TestContract; @@ -107,7 +86,7 @@ mod tests { ledger: 100, author: Address::generate(&env), }; - validate_transition(&env, &c, payload); // must not panic + validate_transition(&env, &c, payload); }); } diff --git a/engine-core/src/burn.rs b/engine-core/src/burn.rs index ad6749f..51992c7 100644 --- a/engine-core/src/burn.rs +++ b/engine-core/src/burn.rs @@ -1,11 +1,11 @@ -use soroban_sdk::{contracterror, panic_with_error, symbol_short, Address, Env, IntoVal, String, BytesN, Map}; //! Burn module — zero-address rejection guard. //! //! Prevents burning/transferring funds to the zero address. //! Wire `reject_zero_address` into any burn or irreversible-transfer entrypoint. use soroban_sdk::{contracterror, panic_with_error, Address, BytesN, Env, String}; -use crate::event_struct::{MOD_BURN, ACT_BURN_SAFE}; + +use crate::event_struct::{ACT_BURN_SAFE, MOD_BURN}; use crate::event_utils::publish_event; #[contracterror] @@ -16,6 +16,7 @@ pub enum BurnError { const ZERO_ADDRESS: &str = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; +/// Panics with [`BurnError::ZeroAddress`] if `to` is the Stellar zero address. pub fn reject_zero_address(env: &Env, to: &Address) { let zero = String::from_str(env, ZERO_ADDRESS); if to.to_string() == zero { @@ -23,23 +24,9 @@ pub fn reject_zero_address(env: &Env, to: &Address) { } } +/// Burn-safe transfer wrapper. Validates recipient then emits a compact event. pub fn burn_to(env: &Env, to: &Address, amount: i128) { reject_zero_address(env, to); - if amount <= 0 { - panic_with_error!(env, BurnError::ZeroAddress); - } - env.events().publish( - (symbol_short!("TRE"), symbol_short!("burn_safe")), - (to.clone(), amount), - ); - let mut payload = Map::new(env); - payload.set(symbol_short!("to"), to.clone().into_val(env)); - payload.set(symbol_short!("amount"), amount.into_val(env)); - publish_event(env, BytesN::from_array(env, & [0u8; 32]), BytesN::from_array(env, & [0u8; 32]), payload); -/// Burn-safe transfer wrapper. Validates recipient before emitting a single compact event. -pub fn burn_to(env: &Env, _to: &Address, amount: i128) { - reject_zero_address(env, _to); - // Single compact event — module=BURN, action=BURN_SAFE, value=amount as u64 (safe for normal amounts). publish_event( env, MOD_BURN | ACT_BURN_SAFE, diff --git a/engine-core/src/circuit_breaker.rs b/engine-core/src/circuit_breaker.rs index 300b37b..59bbd3d 100644 --- a/engine-core/src/circuit_breaker.rs +++ b/engine-core/src/circuit_breaker.rs @@ -1,33 +1,31 @@ -use soroban_sdk::{contracterror, panic_with_error, symbol_short, vec, Address, Env, IntoVal, Symbol, Vec, BytesN, Map}; //! Emergency circuit-breaker — halts all state transitions when tripped. //! //! Only authorised guardians may open or close the breaker. //! All stateful entry-points must call `assert_closed` before proceeding. -use soroban_sdk::{contracterror, panic_with_error, symbol_short, vec, Address, Env, Symbol, Vec}; +use soroban_sdk::{contracterror, panic_with_error, symbol_short, vec, Address, BytesN, Env, Symbol, Vec}; -use crate::event_struct::{MOD_CB, ACT_TRIP, ACT_RESET}; +use crate::event_struct::{ACT_RESET, ACT_TRIP, MOD_CB}; use crate::event_utils::publish_event; use crate::types::BreakerState; -const KEY_STATE: Symbol = symbol_short!("CB_STATE"); +const KEY_STATE: Symbol = symbol_short!("CB_STATE"); const KEY_GUARDIAN: Symbol = symbol_short!("CB_GUARD"); #[contracterror] #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] pub enum BreakerError { - CircuitOpen = 1, - NotGuardian = 2, + CircuitOpen = 1, + NotGuardian = 2, AlreadyInState = 3, } pub fn init(env: &Env, guardians: Vec
) { - env.storage() - .instance() - .set(&KEY_STATE, &BreakerState::Closed); + env.storage().instance().set(&KEY_STATE, &BreakerState::Closed); env.storage().instance().set(&KEY_GUARDIAN, &guardians); } +/// Panics with [`BreakerError::CircuitOpen`] when the breaker is open. pub fn assert_closed(env: &Env) { let state: BreakerState = env .storage() @@ -44,16 +42,7 @@ pub fn trip(env: &Env, guardian: &Address) { guardian.require_auth(); require_guardian(env, guardian); set_state(env, BreakerState::Open); - // Single compact event — replaces previous double-emit. - publish_event( - env, - MOD_CB | ACT_TRIP, - 0, - BytesN::from_array(env, &[0u8; 32]), - ); - let mut payload = Map::new(env); - payload.set(symbol_short!("guardian"), guardian.clone().into_val(env)); - publish_event(env, BytesN::from_array(env, & [0u8; 32]), BytesN::from_array(env, & [0u8; 32]), payload); + publish_event(env, MOD_CB | ACT_TRIP, 0, BytesN::from_array(env, &[0u8; 32])); } pub fn reset(env: &Env, guardian: &Address) { @@ -61,16 +50,7 @@ pub fn reset(env: &Env, guardian: &Address) { guardian.require_auth(); require_guardian(env, guardian); set_state(env, BreakerState::Closed); - // Single compact event — replaces previous double-emit. - publish_event( - env, - MOD_CB | ACT_RESET, - 0, - BytesN::from_array(env, &[0u8; 32]), - ); - let mut payload = Map::new(env); - payload.set(symbol_short!("guardian"), guardian.clone().into_val(env)); - publish_event(env, BytesN::from_array(env, & [0u8; 32]), BytesN::from_array(env, & [0u8; 32]), payload); + publish_event(env, MOD_CB | ACT_RESET, 0, BytesN::from_array(env, &[0u8; 32])); } fn set_state(env: &Env, state: BreakerState) { @@ -98,19 +78,8 @@ fn require_guardian(env: &Env, caller: &Address) { #[cfg(test)] mod tests { - use soroban_sdk::contract; - - #[contract] - struct TestContract; - use super::*; - use soroban_sdk::{testutils::Address as _, contract, contractimpl, vec, Env}; - - #[contract] - pub struct TestContract; - - #[contractimpl] - impl TestContract {} + use soroban_sdk::{testutils::Address as _, vec, Env}; #[soroban_sdk::contract] pub struct TestContract; @@ -126,19 +95,19 @@ mod tests { env.as_contract(&contract_id, || { init(&env, vec![&env, g.clone()]); - assert_closed(&env); // should not panic + assert_closed(&env); }); env.mock_all_auths(); env.as_contract(&contract_id, || { trip(&env, &g); - let state: BreakerState = env.storage().instance().get(&KEY_STATE).unwrap(); assert_eq!(state, BreakerState::Open); }); + env.as_contract(&contract_id, || { reset(&env, &g); - assert_closed(&env); // back to closed — no panic + assert_closed(&env); }); } diff --git a/engine-core/src/event_struct.rs b/engine-core/src/event_struct.rs index 2f7d0a6..ef3134e 100644 --- a/engine-core/src/event_struct.rs +++ b/engine-core/src/event_struct.rs @@ -1,22 +1,15 @@ -use soroban_sdk::{contracttype, BytesN, Map, Symbol, Val}; - //! Compact event encoding — bitmask-based event struct. //! -//! Replaces the previous fat `Event { event_type: BytesN<32>, action: BytesN<32>, payload: Map }` -//! which wasted 64 bytes of zeroed data and allocated an expensive `Map` on every call. -//! -//! ## Encoding -//! -//! `flags` packs module id (bits 0–7) and action id (bits 8–15) into a single `u32`: +//! `flags` packs module id (bits 0–7) and action id (bits 8–15) into a `u32`: //! //! ```text //! bits 0– 7 : module id (MOD_*) //! bits 8–15 : action id (ACT_*) -//! bits 16–31 : reserved for future use / version +//! bits 16–31 : reserved //! ``` //! //! `value` carries a u64 primary value (sequence, proposal id, amount, …). -//! `hash` carries an optional 32-byte hash (state_hash, action_hash). Zero if unused. +//! `hash` carries an optional 32-byte hash. All-zero when unused. use soroban_sdk::contracttype; @@ -32,29 +25,27 @@ pub const MOD_FEE: u32 = 0x07; // ── action ids ──────────────────────────────────────────────────────────────── -pub const ACT_COMMIT: u32 = 0x01 << 8; -pub const ACT_SNAPSHOT: u32 = 0x02 << 8; -pub const ACT_PROPOSE: u32 = 0x03 << 8; -pub const ACT_APPROVE: u32 = 0x04 << 8; -pub const ACT_EXECUTE: u32 = 0x05 << 8; -pub const ACT_TRIP: u32 = 0x06 << 8; -pub const ACT_RESET: u32 = 0x07 << 8; -pub const ACT_BURN_SAFE: u32 = 0x08 << 8; -pub const ACT_REQUEST: u32 = 0x09 << 8; -pub const ACT_TRIGGERED: u32 = 0x0A << 8; -pub const ACT_FEE: u32 = 0x0B << 8; +pub const ACT_COMMIT: u32 = 0x01 << 8; +pub const ACT_SNAPSHOT: u32 = 0x02 << 8; +pub const ACT_PROPOSE: u32 = 0x03 << 8; +pub const ACT_APPROVE: u32 = 0x04 << 8; +pub const ACT_EXECUTE: u32 = 0x05 << 8; +pub const ACT_TRIP: u32 = 0x06 << 8; +pub const ACT_RESET: u32 = 0x07 << 8; +pub const ACT_BURN_SAFE: u32 = 0x08 << 8; +pub const ACT_REQUEST: u32 = 0x09 << 8; +pub const ACT_TRIGGERED: u32 = 0x0A << 8; +pub const ACT_FEE: u32 = 0x0B << 8; +pub const ACT_FEE_TRANSFER: u32 = 0x0C << 8; -/// Compact event struct — 44 bytes flat, zero heap allocation. -/// -/// Replaces `Event { event_type: BytesN<32>, action: BytesN<32>, payload: Map }`. +/// Compact event struct — flat, zero heap allocation. #[contracttype] #[derive(Clone, Debug)] pub struct CompactEvent { - /// Packed module + action bitmask. Use `MOD_*` and `ACT_*` constants. + /// Packed module + action bitmask. pub flags: u32, - /// Primary numeric value — sequence number, proposal id, amount, etc. - /// Zero when unused. + /// Primary numeric value — sequence, proposal id, amount, etc. Zero when unused. pub value: u64, - /// Optional 32-byte hash (state_hash, action_hash). All-zero when unused. - pub hash: soroban_sdk::BytesN<32>, + /// Optional 32-byte hash. All-zero when unused. + pub hash: soroban_sdk::BytesN<32>, } diff --git a/engine-core/src/event_utils.rs b/engine-core/src/event_utils.rs index 760152e..11e45aa 100644 --- a/engine-core/src/event_utils.rs +++ b/engine-core/src/event_utils.rs @@ -1,24 +1,16 @@ -use soroban_sdk::{Env, symbol_short, BytesN, Map, Symbol, Val}; -use crate::event_struct::Event; - -pub fn publish_event(env: &Env, event_type: BytesN<32>, action: BytesN<32>, payload: Map) { - let ev = Event { - event_type, - action, - payload, - }; - // Emit the event with a generic identifier. //! Event publishing helpers — emit a `CompactEvent` via the Soroban event log. use soroban_sdk::{symbol_short, BytesN, Env}; + use crate::event_struct::CompactEvent; /// Publish a compact event. /// -/// `flags` should be built by OR-ing `MOD_*` and `ACT_*` constants from -/// `event_struct`. `value` is a primary numeric datum (0 = unused). -/// `hash` is a 32-byte hash (all-zero = unused). +/// `flags` — OR of `MOD_*` and `ACT_*` constants from `event_struct`. +/// `value` — primary numeric datum; 0 when unused. +/// `hash` — 32-byte hash; all-zero when unused. pub fn publish_event(env: &Env, flags: u32, value: u64, hash: BytesN<32>) { let ev = CompactEvent { flags, value, hash }; - env.events().publish((symbol_short!("EVENT"), symbol_short!("LOG")), ev); + env.events() + .publish((symbol_short!("EVENT"), symbol_short!("LOG")), ev); } diff --git a/engine-core/src/governance.rs b/engine-core/src/governance.rs index e1f4879..af43d97 100644 --- a/engine-core/src/governance.rs +++ b/engine-core/src/governance.rs @@ -1,79 +1,57 @@ //! Multi-sig governance with timelock. //! -//! ## Storage layout (optimised) -//! -//! ## Proposal State Machine -//! ```text -//! Pending ─ (on approve, threshold met) → Approved ─ (on execute, timelock elapsed) → Executed -//! ``` -//! Invalid transitions trigger contract panics. +//! Typical lifecycle: `init` → `propose` → `approve` (≥ threshold) → `execute`. +//! Execution is blocked until `TIMELOCK_LEDGERS` ledgers have passed since +//! the proposal was submitted. + +use soroban_sdk::{contracterror, panic_with_error, symbol_short, vec, Address, BytesN, Env, Map, Symbol, Vec}; -use crate::event_struct::{MOD_GOV, ACT_PROPOSE, ACT_APPROVE, ACT_EXECUTE}; +use crate::event_struct::{ACT_APPROVE, ACT_EXECUTE, ACT_PROPOSE, MOD_GOV}; use crate::event_utils::publish_event; use crate::types::{Proposal, ProposalState}; -use soroban_sdk::{ - contracterror, panic_with_error, symbol_short, vec, Address, Env, Map, Symbol, Vec, -}; - -const KEY_PROPOSALS: Symbol = symbol_short!("PROPS"); -const KEY_SIGNERS: Symbol = symbol_short!("SIGNERS"); -const KEY_THRESH: Symbol = symbol_short!("THRESH"); -const KEY_MIN_STAKE: Symbol = symbol_short!("MINSTAKE"); -const KEY_STAKE_TOK: Symbol = symbol_short!("STKTOK"); - Symbol, Val, Vec, -}; const KEY_PROPOSALS: Symbol = symbol_short!("PROPS"); -const KEY_SIGNERS: Symbol = symbol_short!("SIGNERS"); -const KEY_THRESH: Symbol = symbol_short!("THRESH"); -/// Ledgers to wait after full approval before execution (~1 hour on Stellar). +const KEY_SIGNERS: Symbol = symbol_short!("SIGNERS"); +const KEY_THRESH: Symbol = symbol_short!("THRESH"); + +/// Ledgers to wait before an approved proposal may be executed (~1 hour on Stellar). const TIMELOCK_LEDGERS: u32 = 720; -const MAX_THRESHOLD: u32 = 100; -const MAX_DURATION_LEDGERS: u32 = 5256000; -const MIN_DURATION_LEDGERS: u32 = 1; #[contracterror] #[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum GovError { - NotASigner = 1, - AlreadyApproved = 2, - ProposalNotFound = 3, - InvalidStateTransition = 4, - TimelockActive = 5, - InsufficientStake = 6, - InvalidThreshold = 7, - InvalidStake = 8, -} - -#[contracterror] -#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -pub enum GovError { - NotASigner = 1, - AlreadyApproved = 2, - ThresholdNotMet = 3, - TimelockActive = 4, + NotASigner = 1, + AlreadyApproved = 2, + ThresholdNotMet = 3, + TimelockActive = 4, InvalidStateTransition = 5, - ProposalNotFound = 6, + ProposalNotFound = 6, + InsufficientStake = 7, + InvalidThreshold = 8, } -/// Initialise governance with an ordered signer set and approval threshold. +/// Initialise governance with `signers` and a minimum-approval `threshold`. pub fn init(env: &Env, signers: Vec
, threshold: u32) { - assert!(threshold <= (signers.len() as u32), "threshold > signer count"); + if threshold == 0 { + panic_with_error!(env, GovError::InvalidThreshold); + } env.storage().instance().set(&KEY_SIGNERS, &signers); env.storage().instance().set(&KEY_THRESH, &threshold); let empty: Map = Map::new(env); env.storage().instance().set(&KEY_PROPOSALS, &empty); } -fn load_proposals(env: &Env) -> Map { +/// Returns all proposals as `Map`. +pub fn load_proposals(env: &Env) -> Map { env.storage() .instance() .get(&KEY_PROPOSALS) .unwrap_or(Map::new(env)) } -/// Submit a new proposal. Returns the assigned proposal id. -pub fn propose(env: &Env, mut proposal: Proposal) -> u64 { +/// Submit a new proposal. `proposal.proposer` must be an authorised signer. +/// Returns the proposal id. +pub fn propose(env: &Env, proposal: Proposal) -> u64 { let signers: Vec
= env .storage() .instance() @@ -82,133 +60,71 @@ pub fn propose(env: &Env, mut proposal: Proposal) -> u64 { if !signers.contains(&proposal.proposer) { panic_with_error!(env, GovError::NotASigner); } - proposal.proposer.require_auth(); - // Initialize state to Pending - proposal.state = ProposalState::Pending; - - let mut props = load_proposals(env); - let unlock_ledger = env.ledger().sequence() + TIMELOCK_LEDGERS; - props.set(proposal.id, (proposal.clone(), unlock_ledger)); - env.storage().instance().set(&KEY_PROPOSALS, &props); - - env.events().publish( - (symbol_short!("GOV"), symbol_short!("propose")), - proposal.id, - ); - let mut payload = Map::new(env); - payload.set(Symbol::new(env, "proposal_id"), proposal.id.into_val(env)); - publish_event( - env, - BytesN::from_array(env, &[0u8; 32]), - BytesN::from_array(env, &[0u8; 32]), - payload, - ); - proposal.id -pub fn propose(env: &Env, proposal: Proposal) -> u64 { - let unlock_ledger = env.ledger().sequence() + TIMELOCK_LEDGERS; - let id = proposal.id; let mut prop = proposal; prop.state = ProposalState::Pending; + let id = prop.id; + let unlock_ledger = env.ledger().sequence() + TIMELOCK_LEDGERS; - let key = proposal_key(env, id); - env.storage().persistent().set(&key, &(prop, unlock_ledger)); - extend_proposal_ttl(env, &key); + let mut props = load_proposals(env); + props.set(id, (prop, unlock_ledger)); + env.storage().instance().set(&KEY_PROPOSALS, &props); - // Single compact event. - publish_event( - env, - MOD_GOV | ACT_PROPOSE, - id, - BytesN::from_array(env, &[0u8; 32]), - ); + publish_event(env, MOD_GOV | ACT_PROPOSE, id, BytesN::from_array(env, &[0u8; 32])); id } -/// Record a signer's approval for `proposal_id`. -/// Transitions state from Pending → Approved when threshold is met. +/// Record `signer`'s approval. Transitions Pending → Approved when threshold is met. pub fn approve(env: &Env, signer: &Address, proposal_id: u64) { - crate::non_reentrant!(env); + let _guard = crate::guards::ReentrancyGuard::enter(env); signer.require_auth(); - let signers: Vec
= env.storage().instance().get(&KEY_SIGNERS).unwrap_or(vec![env]); + + let signers: Vec
= env + .storage() + .instance() + .get(&KEY_SIGNERS) + .unwrap_or(vec![env]); if !signers.contains(signer) { panic_with_error!(env, GovError::NotASigner); } - let threshold: u32 = env.storage().instance().get(&KEY_THRESH).unwrap_or(1); - let min_stake: i128 = env.storage().instance().get(&KEY_MIN_STAKE).unwrap_or(0); - let stake_token: Address = env.storage().instance().get(&KEY_STAKE_TOK).unwrap(); + let threshold: u32 = env.storage().instance().get(&KEY_THRESH).unwrap_or(1); let mut props = load_proposals(env); let (mut prop, unlock) = props .get(proposal_id) .unwrap_or_else(|| panic_with_error!(env, GovError::ProposalNotFound)); - // Only pending proposals can receive approvals if prop.state != ProposalState::Pending { panic_with_error!(env, GovError::InvalidStateTransition); } - if prop.approved_by.contains(signer) { panic_with_error!(env, GovError::AlreadyApproved); } - prop.approved_by.push_back(signer.clone()); - if min_stake > 0 { - let balance = token::Client::new(env, &stake_token).balance(voter); - if balance < min_stake { - panic_with_error!(env, GovError::InsufficientStake); - } - // Initialize state to Pending - proposal.state = ProposalState::Pending; + prop.approved_by.push_back(signer.clone()); - let mut props = load_proposals(env); - let unlock_ledger = env.ledger().sequence() + TIMELOCK_LEDGERS; - props.set(proposal.id, (proposal.clone(), unlock_ledger)); - env.storage().instance().set(&KEY_PROPOSALS, &props); - env.events().publish( - (symbol_short!("GOV"), symbol_short!("propose")), - proposal.id, - ); - proposal.id - }) + if prop.approved_by.len() as u32 >= threshold { + prop.state = ProposalState::Approved; + publish_event(env, MOD_GOV | ACT_APPROVE, proposal_id, BytesN::from_array(env, &[0u8; 32])); } props.set(proposal_id, (prop, unlock)); env.storage().instance().set(&KEY_PROPOSALS, &props); - - } - - env.storage().persistent().set(&key, &(prop.clone(), unlock)); - extend_proposal_ttl(env, &key); - - if prop.state == ProposalState::Approved && env.ledger().sequence() >= unlock { - execute(env, proposal_id); - } } +/// Execute an approved proposal after the timelock. Returns the executed `Proposal`. pub fn execute(env: &Env, proposal_id: u64) -> Proposal { - crate::non_reentrant!(env); - let mut props = load_proposals(env); - let (mut prop, unlock) = props.get(proposal_id).unwrap_or_else(|| { - panic_with_error!(env, GovError::ProposalNotFound) - }); + let _guard = crate::guards::ReentrancyGuard::enter(env); - if prop.state != ProposalState::Approved { - panic_with_error!(env, GovError::InvalidStateTransition); - } - let key = proposal_key(env, proposal_id); - let (mut prop, unlock): (Proposal, u32) = env - .storage() - .persistent() - .get(&key) + let mut props = load_proposals(env); + let (mut prop, unlock) = props + .get(proposal_id) .unwrap_or_else(|| panic_with_error!(env, GovError::ProposalNotFound)); - // Only approved proposals can be executed if prop.state != ProposalState::Approved { panic_with_error!(env, GovError::InvalidStateTransition); } - if env.ledger().sequence() < unlock { panic_with_error!(env, GovError::TimelockActive); } @@ -216,88 +132,8 @@ pub fn execute(env: &Env, proposal_id: u64) -> Proposal { prop.state = ProposalState::Executed; props.set(proposal_id, (prop.clone(), unlock)); env.storage().instance().set(&KEY_PROPOSALS, &props); - env.storage().persistent().set(&key, &(prop.clone(), unlock)); - // Extend TTL so the executed record remains accessible for the audit window. - extend_proposal_ttl(env, &key); - // Single compact event. - publish_event( - env, - MOD_GOV | ACT_EXECUTE, - proposal_id, - prop.action_hash.clone(), - ); + publish_event(env, MOD_GOV | ACT_EXECUTE, proposal_id, prop.action_hash.clone()); prop } - -/// Record a signer's approval for `proposal_id`. -/// Transitions state from Pending → Approved when threshold is met. -pub fn approve(env: &Env, signer: &Address, proposal_id: u64) { - crate::non_reentrant!(env, { - signer.require_auth(); - let signers: Vec
= env - .storage() - .instance() - .get(&KEY_SIGNERS) - .unwrap_or(vec![env]); - if !signers.contains(signer) { - panic_with_error!(env, GovError::NotASigner); - } - let threshold: u32 = env.storage().instance().get(&KEY_THRESH).unwrap_or(1); - - let mut props = load_proposals(env); - let (mut prop, unlock) = props - .get(proposal_id) - .unwrap_or_else(|| panic_with_error!(env, GovError::ProposalNotFound)); - - // Only pending proposals can receive approvals - if prop.state != ProposalState::Pending { - panic_with_error!(env, GovError::InvalidStateTransition); - } - - if prop.approved_by.contains(signer) { - panic_with_error!(env, GovError::AlreadyApproved); - } - prop.approved_by.push_back(signer.clone()); - - // Transition to Approved when threshold is met - if (prop.approved_by.len() as u32) >= threshold { - prop.state = ProposalState::Approved; - env.events().publish( - (symbol_short!("GOV"), symbol_short!("approved")), - proposal_id, - ); - } - - props.set(proposal_id, (prop, unlock)); - env.storage().instance().set(&KEY_PROPOSALS, &props); - }); -} - -pub fn execute(env: &Env, proposal_id: u64) -> Proposal { - crate::non_reentrant!(env, { - let mut props = load_proposals(env); - let (mut prop, unlock) = props - .get(proposal_id) - .unwrap_or_else(|| panic_with_error!(env, GovError::ProposalNotFound)); - - // Only approved proposals can be executed - if prop.state != ProposalState::Approved { - panic_with_error!(env, GovError::InvalidStateTransition); - } - - if env.ledger().sequence() < unlock { - panic_with_error!(env, GovError::TimelockActive); - } - - prop.state = ProposalState::Executed; - props.set(proposal_id, (prop.clone(), unlock)); - env.storage().instance().set(&KEY_PROPOSALS, &props); - env.events().publish( - (symbol_short!("GOV"), symbol_short!("execute")), - proposal_id, - ); - prop - }) -} diff --git a/engine-core/src/governance_tests.rs b/engine-core/src/governance_tests.rs index 3bc932c..076cc8c 100644 --- a/engine-core/src/governance_tests.rs +++ b/engine-core/src/governance_tests.rs @@ -1,6 +1,6 @@ #[cfg(test)] mod tests { - use crate::governance; + use crate::governance::{self, GovError}; use crate::types::{Proposal, ProposalState}; use soroban_sdk::{testutils::Address as _, testutils::Ledger as _, vec, Address, BytesN, Env, contract, contractimpl}; @@ -215,16 +215,17 @@ mod tests { }); } -/// State Transition Matrix (for documentation) -/// -/// | Current State | Operation | Target State | Allowed | Error | -/// |---|---|---|---|---| -/// | Pending | approve (< threshold) | Pending | Yes | — | -/// | Pending | approve (>= threshold) | Approved | Yes | — | -/// | Pending | execute | — | No | InvalidStateTransition | -/// | Approved | approve | — | No | InvalidStateTransition | -/// | Approved | execute (timelock OK) | Executed | Yes | — | -/// | Approved | execute (timelock active) | — | No | TimelockActive | -/// | Executed | approve | — | No | InvalidStateTransition | -/// | Executed | execute | — | No | InvalidStateTransition | -pub struct StateTransitionMatrix; + /// State Transition Matrix (for documentation) + /// + /// | Current State | Operation | Target State | Allowed | Error | + /// |---|---|---|---|---| + /// | Pending | approve (< threshold) | Pending | Yes | — | + /// | Pending | approve (>= threshold) | Approved | Yes | — | + /// | Pending | execute | — | No | InvalidStateTransition | + /// | Approved | approve | — | No | InvalidStateTransition | + /// | Approved | execute (timelock OK) | Executed | Yes | — | + /// | Approved | execute (timelock active) | — | No | TimelockActive | + /// | Executed | approve | — | No | InvalidStateTransition | + /// | Executed | execute | — | No | InvalidStateTransition | + pub struct StateTransitionMatrix; +} diff --git a/engine-core/src/lib.rs b/engine-core/src/lib.rs index 33a23c3..ec65dc3 100644 --- a/engine-core/src/lib.rs +++ b/engine-core/src/lib.rs @@ -1,11 +1,13 @@ #![no_std] extern crate alloc; pub mod audit; +pub mod burn; pub mod circuit_breaker; pub mod event_struct; pub mod event_utils; pub mod governance; pub mod guards; +pub mod protocol_fee; pub mod treasury; pub mod types; diff --git a/engine-core/src/protocol_fee.rs b/engine-core/src/protocol_fee.rs index 8517e92..be9f01c 100644 --- a/engine-core/src/protocol_fee.rs +++ b/engine-core/src/protocol_fee.rs @@ -1,32 +1,114 @@ +//! Protocol-level fee-on-transfer logic. +//! +//! Every token transfer that flows through the Vero engine passes through +//! [`fee_on_transfer`], which splits the gross amount into a protocol fee +//! (routed to the configured recipient) and the net amount (forwarded to +//! the intended recipient). +//! +//! ## Storage keys +//! | key | type | meaning | +//! |-------------|-----------|--------------------------------| +//! | `FEE_BPS` | `u32` | fee in basis points (0–10 000) | +//! | `FEE_RCP` | `Address` | fee recipient | +//! | `(TOK_EX, token)` | `bool` | per-token fee exemption | +//! +//! ## Guards +//! * Circuit breaker — all stateful paths call [`assert_closed`]. +//! * Reentrancy guard — [`fee_on_transfer`] holds the re-entrancy lock for +//! its entire execution. + use soroban_sdk::{ contracterror, panic_with_error, symbol_short, token, Address, BytesN, Env, Symbol, }; -use crate::event_struct::{MOD_FEE, ACT_FEE}; -use crate::event_utils::publish_event; + +use crate::burn::reject_zero_address; use crate::circuit_breaker::assert_closed; +use crate::event_struct::{ACT_FEE, ACT_FEE_TRANSFER, MOD_FEE}; +use crate::event_utils::publish_event; +use crate::guards::ReentrancyGuard; + +// ── Storage keys ────────────────────────────────────────────────────────────── -const KEY_FEE_BPS: Symbol = symbol_short!("FEE_BPS"); -const KEY_FEE_RECIPIENT: Symbol = symbol_short!("FEE_RCP"); +const KEY_FEE_BPS: Symbol = symbol_short!("FEE_BPS"); +const KEY_FEE_RCP: Symbol = symbol_short!("FEE_RCP"); +// Per-token exemption keys are (KEY_TOK_EX, token_address) tuples. +const KEY_TOK_EX: Symbol = symbol_short!("TOK_EX"); + +// ── Errors ──────────────────────────────────────────────────────────────────── #[contracterror] #[derive(Copy, Clone)] pub enum FeeError { - InvalidBasisPoints = 1, - InvalidRecipient = 2, - FeeCalculationOverflow = 3, + InvalidBasisPoints = 1, + InvalidRecipient = 2, + FeeCalculationOverflow = 3, } -const MAX_BPS: u32 = 10000; +const MAX_BPS: u32 = 10_000; + +// ── Configuration ───────────────────────────────────────────────────────────── +/// Initialise fee configuration. Must be called once during contract setup. +/// +/// Panics with [`FeeError::InvalidBasisPoints`] if `fee_bps > 10 000`. pub fn init(env: &Env, fee_bps: u32, recipient: &Address) { if fee_bps > MAX_BPS { panic_with_error!(env, FeeError::InvalidBasisPoints); } - validate_address(env, recipient); - env.storage().instance().set(&KEY_FEE_BPS, &fee_bps); - env.storage().instance().set(&KEY_FEE_RECIPIENT, recipient); + env.storage().instance().set(&KEY_FEE_BPS, &fee_bps); + env.storage().instance().set(&KEY_FEE_RCP, recipient); +} + +/// Update the fee rate. Panics if `fee_bps > 10 000`. +pub fn set_fee_bps(env: &Env, fee_bps: u32) { + if fee_bps > MAX_BPS { + panic_with_error!(env, FeeError::InvalidBasisPoints); + } + env.storage().instance().set(&KEY_FEE_BPS, &fee_bps); } +/// Update the fee recipient address. +pub fn set_fee_recipient(env: &Env, recipient: &Address) { + env.storage().instance().set(&KEY_FEE_RCP, recipient); +} + +/// Returns `(fee_bps, recipient)` from storage. +pub fn get_fee_config(env: &Env) -> (u32, Option
) { + let fee_bps: u32 = env.storage().instance().get(&KEY_FEE_BPS).unwrap_or(0); + let recipient: Option
= env.storage().instance().get(&KEY_FEE_RCP); + (fee_bps, recipient) +} + +// ── Token exemption ─────────────────────────────────────────────────────────── + +fn exempt_key(token: &Address) -> (Symbol, Address) { + (KEY_TOK_EX, token.clone()) +} + +/// Mark or unmark `token` as exempt from protocol fees. +/// +/// Exempt tokens are forwarded in full during [`fee_on_transfer`] with no +/// fee deducted and no fee-recipient transfer. +pub fn set_token_exempt(env: &Env, token: &Address, exempt: bool) { + let k = exempt_key(token); + if exempt { + env.storage().instance().set(&k, &true); + } else { + env.storage().instance().remove(&k); + } +} + +/// Returns `true` if `token` is currently exempt from protocol fees. +pub fn is_token_exempt(env: &Env, token: &Address) -> bool { + env.storage().instance().has(&exempt_key(token)) +} + +// ── Fee arithmetic ──────────────────────────────────────────────────────────── + +/// Compute `(fee, net)` for a gross `amount` using the stored `fee_bps`. +/// +/// Returns `(0, amount)` when `fee_bps` is 0 or `amount` is 0. +/// Fee is rounded down (floor division). pub fn calculate_fee(env: &Env, amount: i128) -> (i128, i128) { let fee_bps: u32 = env.storage().instance().get(&KEY_FEE_BPS).unwrap_or(0); if fee_bps == 0 || amount == 0 { @@ -34,7 +116,7 @@ pub fn calculate_fee(env: &Env, amount: i128) -> (i128, i128) { } let fee = amount .checked_mul(fee_bps as i128) - .and_then(|v| v.checked_div(10000)) + .and_then(|v| v.checked_div(10_000)) .unwrap_or_else(|| panic_with_error!(env, FeeError::FeeCalculationOverflow)); let net = amount .checked_sub(fee) @@ -42,23 +124,86 @@ pub fn calculate_fee(env: &Env, amount: i128) -> (i128, i128) { (fee, net) } -pub fn deduct_fee(env: &Env, token: &Address, amount: i128) -> i128 { +// ── Transfer hooks ──────────────────────────────────────────────────────────── + +/// Protocol-level fee-on-transfer hook. +/// +/// Intercepts a transfer of `amount` tokens from `from` to `to` and: +/// +/// 1. Asserts the circuit breaker is `Closed`. +/// 2. Acquires the reentrancy guard. +/// 3. Rejects `to` = zero address ([`BurnError::ZeroAddress`]). +/// 4. If `token` is fee-exempt, transfers `amount` from `from` → `to` unchanged. +/// 5. Otherwise: +/// - Computes `(fee, net) = amount * fee_bps / 10 000`. +/// - Transfers `fee` from `from` → fee recipient (skipped when fee is 0). +/// - Transfers `net` from `from` → `to`. +/// - Emits `MOD_FEE | ACT_FEE_TRANSFER` event carrying the fee amount. +/// +/// Returns the net amount delivered to `to`. +pub fn fee_on_transfer( + env: &Env, + token: &Address, + from: &Address, + to: &Address, + amount: i128, +) -> i128 { assert_closed(env); + let _guard = ReentrancyGuard::enter(env); + reject_zero_address(env, to); + + let tkn = token::Client::new(env, token); + + if is_token_exempt(env, token) { + tkn.transfer(from, to, &amount); + return amount; + } + let (fee, net) = calculate_fee(env, amount); + if fee > 0 { let recipient: Address = env .storage() .instance() - .get(&KEY_FEE_RECIPIENT) + .get(&KEY_FEE_RCP) .unwrap_or_else(|| panic_with_error!(env, FeeError::InvalidRecipient)); + tkn.transfer(from, &recipient, &fee); + } + + if net > 0 { + tkn.transfer(from, to, &net); + } + + publish_event( + env, + MOD_FEE | ACT_FEE_TRANSFER, + fee as u64, + BytesN::from_array(env, &[0u8; 32]), + ); + + net +} +/// Low-level fee deduction from the contract's own token balance. +/// +/// Transfers the fee portion from `current_contract_address()` to the +/// configured recipient. Returns the net amount. +/// +/// Use [`fee_on_transfer`] when intercepting a third-party transfer end-to-end. +pub fn deduct_fee(env: &Env, token: &Address, amount: i128) -> i128 { + assert_closed(env); + let (fee, net) = calculate_fee(env, amount); + if fee > 0 { + let recipient: Address = env + .storage() + .instance() + .get(&KEY_FEE_RCP) + .unwrap_or_else(|| panic_with_error!(env, FeeError::InvalidRecipient)); token::Client::new(env, token).transfer( &env.current_contract_address(), &recipient, &fee, ); - - // Single compact event — fee amount in value field. publish_event( env, MOD_FEE | ACT_FEE, @@ -69,35 +214,14 @@ pub fn deduct_fee(env: &Env, token: &Address, amount: i128) -> i128 { net } -pub fn get_fee_config(env: &Env) -> (u32, Option
) { - let fee_bps: u32 = env.storage().instance().get(&KEY_FEE_BPS).unwrap_or(0); - let recipient: Option
= env.storage().instance().get(&KEY_FEE_RECIPIENT); - (fee_bps, recipient) -} - -pub fn set_fee_bps(env: &Env, fee_bps: u32) { - if fee_bps > MAX_BPS { - panic_with_error!(env, FeeError::InvalidBasisPoints); - } - env.storage().instance().set(&KEY_FEE_BPS, &fee_bps); -} - -pub fn set_fee_recipient(env: &Env, recipient: &Address) { - validate_address(env, recipient); - env.storage().instance().set(&KEY_FEE_RECIPIENT, recipient); -} - -fn validate_address(env: &Env, addr: &Address) { - let s = addr.to_string(); - if s.is_empty() { - panic_with_error!(env, FeeError::InvalidRecipient); - } -} +// ── Tests ───────────────────────────────────────────────────────────────────── #[cfg(test)] mod tests { use super::*; - use soroban_sdk::{testutils::Address as _, Env}; + use soroban_sdk::{testutils::Address as _, token, vec, Env}; + + use crate::circuit_breaker; #[soroban_sdk::contract] pub struct TestContract; @@ -105,7 +229,7 @@ mod tests { #[soroban_sdk::contractimpl] impl TestContract {} - fn setup(env: &Env, fee_bps: u32) -> (soroban_sdk::Address, Address) { + fn setup(env: &Env, fee_bps: u32) -> (Address, Address) { let contract_id = env.register_contract(None, TestContract); let recipient = Address::generate(env); env.as_contract(&contract_id, || { @@ -114,14 +238,23 @@ mod tests { (contract_id, recipient) } + fn make_token(env: &Env) -> (Address, token::StellarAssetClient) { + let admin = Address::generate(env); + let addr = env.register_stellar_asset_contract_v2(admin).address(); + let client = token::StellarAssetClient::new(env, &addr); + (addr, client) + } + + // ── calculate_fee ───────────────────────────────────────────────────────── + #[test] fn fee_calculation_zero_bps() { let env = Env::default(); let (contract_id, _) = setup(&env, 0); env.as_contract(&contract_id, || { - let (fee, net) = calculate_fee(&env, 1000); + let (fee, net) = calculate_fee(&env, 1_000); assert_eq!(fee, 0); - assert_eq!(net, 1000); + assert_eq!(net, 1_000); }); } @@ -130,7 +263,7 @@ mod tests { let env = Env::default(); let (contract_id, _) = setup(&env, 500); env.as_contract(&contract_id, || { - let (fee, net) = calculate_fee(&env, 1000); + let (fee, net) = calculate_fee(&env, 1_000); assert_eq!(fee, 50); assert_eq!(net, 950); }); @@ -161,14 +294,16 @@ mod tests { #[test] fn fee_at_full_bps_is_full_amount() { let env = Env::default(); - let (contract_id, _) = setup(&env, 10000); + let (contract_id, _) = setup(&env, 10_000); env.as_contract(&contract_id, || { - let (fee, net) = calculate_fee(&env, 1000); - assert_eq!(fee, 1000); + let (fee, net) = calculate_fee(&env, 1_000); + assert_eq!(fee, 1_000); assert_eq!(net, 0); }); } + // ── get/set config ──────────────────────────────────────────────────────── + #[test] fn get_fee_config_returns_stored_values() { let env = Env::default(); @@ -210,7 +345,170 @@ mod tests { let contract_id = env.register_contract(None, TestContract); let recipient = Address::generate(&env); env.as_contract(&contract_id, || { - init(&env, 10001, &recipient); + init(&env, 10_001, &recipient); + }); + } + + // ── token exemption ─────────────────────────────────────────────────────── + + #[test] + fn token_exempt_false_by_default() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 500); + let token = Address::generate(&env); + env.as_contract(&contract_id, || { + assert!(!is_token_exempt(&env, &token)); + }); + } + + #[test] + fn token_exempt_set_and_check() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 500); + let token = Address::generate(&env); + env.as_contract(&contract_id, || { + set_token_exempt(&env, &token, true); + assert!(is_token_exempt(&env, &token)); + }); + } + + #[test] + fn token_exempt_cleared() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 500); + let token = Address::generate(&env); + env.as_contract(&contract_id, || { + set_token_exempt(&env, &token, true); + set_token_exempt(&env, &token, false); + assert!(!is_token_exempt(&env, &token)); + }); + } + + #[test] + fn multiple_tokens_exempt_independently() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 500); + let token_a = Address::generate(&env); + let token_b = Address::generate(&env); + env.as_contract(&contract_id, || { + set_token_exempt(&env, &token_a, true); + assert!(is_token_exempt(&env, &token_a)); + assert!(!is_token_exempt(&env, &token_b)); + }); + } + + // ── fee_on_transfer ─────────────────────────────────────────────────────── + + #[test] + #[should_panic] + fn fee_on_transfer_circuit_open_panics() { + let env = Env::default(); + env.mock_all_auths(); + let (contract_id, _) = setup(&env, 500); + let token = Address::generate(&env); + let from = Address::generate(&env); + let to = Address::generate(&env); + let guardian = Address::generate(&env); + + env.as_contract(&contract_id, || { + circuit_breaker::init(&env, vec![&env, guardian.clone()]); + circuit_breaker::trip(&env, &guardian); + // Circuit is now open — fee_on_transfer must panic. + fee_on_transfer(&env, &token, &from, &to, 1_000); + }); + } + + #[test] + fn fee_on_transfer_standard_fee_splits_correctly() { + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (token_addr, stellar) = make_token(&env); + let (contract_id, fee_recipient) = setup(&env, 500); // 5 % + + let from = Address::generate(&env); + let to = Address::generate(&env); + stellar.mint(&from, &1_000i128); + + let net = env.as_contract(&contract_id, || { + fee_on_transfer(&env, &token_addr, &from, &to, 1_000) + }); + + let tkn = token::Client::new(&env, &token_addr); + assert_eq!(net, 950); + assert_eq!(tkn.balance(&to), 950); + assert_eq!(tkn.balance(&fee_recipient), 50); + assert_eq!(tkn.balance(&from), 0); + } + + #[test] + fn fee_on_transfer_zero_bps_passes_full_amount() { + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (token_addr, stellar) = make_token(&env); + let (contract_id, _) = setup(&env, 0); + + let from = Address::generate(&env); + let to = Address::generate(&env); + stellar.mint(&from, &500i128); + + let net = env.as_contract(&contract_id, || { + fee_on_transfer(&env, &token_addr, &from, &to, 500) + }); + + let tkn = token::Client::new(&env, &token_addr); + assert_eq!(net, 500); + assert_eq!(tkn.balance(&to), 500); + assert_eq!(tkn.balance(&from), 0); + } + + #[test] + fn fee_on_transfer_exempt_token_no_fee_deducted() { + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (token_addr, stellar) = make_token(&env); + let (contract_id, fee_recipient) = setup(&env, 500); // 5 % — but token is exempt + + let from = Address::generate(&env); + let to = Address::generate(&env); + stellar.mint(&from, &1_000i128); + + env.as_contract(&contract_id, || { + set_token_exempt(&env, &token_addr, true); }); + + let net = env.as_contract(&contract_id, || { + fee_on_transfer(&env, &token_addr, &from, &to, 1_000) + }); + + let tkn = token::Client::new(&env, &token_addr); + assert_eq!(net, 1_000); + assert_eq!(tkn.balance(&to), 1_000); + assert_eq!(tkn.balance(&fee_recipient), 0); // no fee taken + assert_eq!(tkn.balance(&from), 0); + } + + #[test] + fn fee_on_transfer_full_bps_all_goes_to_recipient() { + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (token_addr, stellar) = make_token(&env); + let (contract_id, fee_recipient) = setup(&env, 10_000); // 100 % + + let from = Address::generate(&env); + let to = Address::generate(&env); + stellar.mint(&from, &200i128); + + let net = env.as_contract(&contract_id, || { + fee_on_transfer(&env, &token_addr, &from, &to, 200) + }); + + let tkn = token::Client::new(&env, &token_addr); + assert_eq!(net, 0); + assert_eq!(tkn.balance(&to), 0); + assert_eq!(tkn.balance(&fee_recipient), 200); } } diff --git a/engine-core/src/treasury.rs b/engine-core/src/treasury.rs index 9a0f423..5ac0da2 100644 --- a/engine-core/src/treasury.rs +++ b/engine-core/src/treasury.rs @@ -245,7 +245,7 @@ fn make_snap_key(env: &Env, id: u64) -> Symbol { #[cfg(test)] mod tests { use super::*; - use soroban_sdk::{Env, Map, Symbol}; + use soroban_sdk::{testutils::Ledger as _, Env, Map, Symbol}; #[soroban_sdk::contract] pub struct TestContract; diff --git a/engine-core/test_snapshots/audit/tests/replay_is_rejected.1.json b/engine-core/test_snapshots/audit/tests/replay_is_rejected.1.json index 811272c..3876e68 100644 --- a/engine-core/test_snapshots/audit/tests/replay_is_rejected.1.json +++ b/engine-core/test_snapshots/audit/tests/replay_is_rejected.1.json @@ -79,19 +79,37 @@ "v0": { "topics": [ { - "symbol": "AUDIT" + "symbol": "EVENT" }, { - "symbol": "commit" + "symbol": "LOG" } ], "data": { - "vec": [ + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 257 + } + }, { - "u64": 1 + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" + } }, { - "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } } ] } diff --git a/engine-core/test_snapshots/audit/tests/valid_first_commitment.1.json b/engine-core/test_snapshots/audit/tests/valid_first_commitment.1.json index be060c8..18b2d58 100644 --- a/engine-core/test_snapshots/audit/tests/valid_first_commitment.1.json +++ b/engine-core/test_snapshots/audit/tests/valid_first_commitment.1.json @@ -98,19 +98,37 @@ "v0": { "topics": [ { - "symbol": "AUDIT" + "symbol": "EVENT" }, { - "symbol": "commit" + "symbol": "LOG" } ], "data": { - "vec": [ + "map": [ { - "u64": 1 + "key": { + "symbol": "flags" + }, + "val": { + "u32": 257 + } }, { - "bytes": "31b5ccceb7b2eece59647ed1c647b5cd692422ef2e6043a4b514677cf35cfbb9" + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "31b5ccceb7b2eece59647ed1c647b5cd692422ef2e6043a4b514677cf35cfbb9" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } } ] } diff --git a/engine-core/test_snapshots/circuit_breaker/tests/trip_and_reset.1.json b/engine-core/test_snapshots/circuit_breaker/tests/trip_and_reset.1.json index fc08437..12928d3 100644 --- a/engine-core/test_snapshots/circuit_breaker/tests/trip_and_reset.1.json +++ b/engine-core/test_snapshots/circuit_breaker/tests/trip_and_reset.1.json @@ -86,11 +86,7 @@ "symbol": "CB_STATE" }, "val": { - "vec": [ - { - "symbol": "Closed" - } - ] + "u32": 0 } } ] @@ -202,14 +198,39 @@ "v0": { "topics": [ { - "symbol": "CB" + "symbol": "EVENT" }, { - "symbol": "tripped" + "symbol": "LOG" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1540 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 0 + } + } + ] } } } @@ -225,14 +246,39 @@ "v0": { "topics": [ { - "symbol": "CB" + "symbol": "EVENT" }, { - "symbol": "reset" + "symbol": "LOG" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1796 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 0 + } + } + ] } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_duplicate_approval_detection.1.json b/engine-core/test_snapshots/governance_tests/tests/test_duplicate_approval_detection.1.json index 0448f4f..5878ce9 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_duplicate_approval_detection.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_duplicate_approval_detection.1.json @@ -46,6 +46,39 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_code": { @@ -69,5 +102,104 @@ ] ] }, - "events": [] + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "auth": "existing_value" + } + } + ], + "data": { + "string": "frame is already authorized" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "auth": "existing_value" + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] } \ No newline at end of file diff --git a/engine-core/test_snapshots/governance_tests/tests/test_full_proposal_lifecycle.1.json b/engine-core/test_snapshots/governance_tests/tests/test_full_proposal_lifecycle.1.json index 7c46a75..cfff187 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_full_proposal_lifecycle.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_full_proposal_lifecycle.1.json @@ -218,14 +218,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "propose" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -241,14 +266,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "approved" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -264,14 +314,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "execute" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1282 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_proposal_initial_state_pending.1.json b/engine-core/test_snapshots/governance_tests/tests/test_proposal_initial_state_pending.1.json index 48346b2..5edbcee 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_proposal_initial_state_pending.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_proposal_initial_state_pending.1.json @@ -167,14 +167,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "propose" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_of_executed_proposal.1.json b/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_of_executed_proposal.1.json index d2b1a5c..42a425f 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_of_executed_proposal.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_of_executed_proposal.1.json @@ -145,14 +145,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "propose" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -168,14 +193,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "approved" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -191,14 +241,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "execute" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1282 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_on_approved_proposal.1.json b/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_on_approved_proposal.1.json index dd6812b..d084ebd 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_on_approved_proposal.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_on_approved_proposal.1.json @@ -145,14 +145,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "propose" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -168,14 +193,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "approved" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_reject_double_execution.1.json b/engine-core/test_snapshots/governance_tests/tests/test_reject_double_execution.1.json index 4eb4552..cbd0d1e 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_reject_double_execution.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_reject_double_execution.1.json @@ -112,14 +112,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "propose" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -135,14 +160,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "approved" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -158,14 +208,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "execute" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1282 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_reject_execution_of_pending_proposal.1.json b/engine-core/test_snapshots/governance_tests/tests/test_reject_execution_of_pending_proposal.1.json index 0448f4f..1600155 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_reject_execution_of_pending_proposal.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_reject_execution_of_pending_proposal.1.json @@ -69,5 +69,111 @@ ] ] }, - "events": [] + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 5 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 5 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 5 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] } \ No newline at end of file diff --git a/engine-core/test_snapshots/governance_tests/tests/test_state_transition_approved_to_executed.1.json b/engine-core/test_snapshots/governance_tests/tests/test_state_transition_approved_to_executed.1.json index 7c46a75..cfff187 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_state_transition_approved_to_executed.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_state_transition_approved_to_executed.1.json @@ -218,14 +218,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "propose" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -241,14 +266,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "approved" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -264,14 +314,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "execute" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1282 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_state_transition_pending_to_approved.1.json b/engine-core/test_snapshots/governance_tests/tests/test_state_transition_pending_to_approved.1.json index 01525a8..001cdbd 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_state_transition_pending_to_approved.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_state_transition_pending_to_approved.1.json @@ -218,14 +218,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "propose" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } @@ -241,14 +266,39 @@ "v0": { "topics": [ { - "symbol": "GOV" + "symbol": "EVENT" }, { - "symbol": "approved" + "symbol": "LOG" } ], "data": { - "u64": 1 + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_at_full_bps_is_full_amount.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_at_full_bps_is_full_amount.1.json new file mode 100644 index 0000000..caec516 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_at_full_bps_is_full_amount.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 10000 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_calculation_rounds_down.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_calculation_rounds_down.1.json new file mode 100644 index 0000000..6b2abfc --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_calculation_rounds_down.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 333 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_calculation_standard.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_calculation_standard.1.json new file mode 100644 index 0000000..e9eb5c1 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_calculation_standard.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_calculation_zero_bps.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_calculation_zero_bps.1.json new file mode 100644 index 0000000..cbecf3a --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_calculation_zero_bps.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_circuit_open_panics.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_circuit_open_panics.1.json new file mode 100644 index 0000000..2b8e2c9 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_circuit_open_panics.1.json @@ -0,0 +1,231 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1540 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_exempt_token_no_fee_deducted.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_exempt_token_no_fee_deducted.1.json new file mode 100644 index 0000000..43bdc44 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_exempt_token_no_fee_deducted.1.json @@ -0,0 +1,1026 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TOK_EX" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "val": { + "bool": true + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_full_bps_all_goes_to_recipient.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_full_bps_all_goes_to_recipient.1.json new file mode 100644 index 0000000..543c46f --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_full_bps_all_goes_to_recipient.1.json @@ -0,0 +1,1005 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 10000 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 200 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 200 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 3079 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 200 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 200 + } + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_standard_fee_splits_correctly.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_standard_fee_splits_correctly.1.json new file mode 100644 index 0000000..77b0704 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_standard_fee_splits_correctly.1.json @@ -0,0 +1,1282 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 50 + } + } + ] + } + }, + "sub_invocations": [] + } + ], + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 950 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 50 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 950 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 50 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 50 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 950 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 950 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 3079 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 50 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 950 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 50 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_zero_bps_passes_full_amount.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_zero_bps_passes_full_amount.1.json new file mode 100644 index 0000000..d8689e7 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_zero_bps_passes_full_amount.1.json @@ -0,0 +1,1005 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000002" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 3079 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "48f1b6b8bc0d60f7140dd49b6120fbaf3cdbab2adaeea631313d9f0bae9532f1", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/get_fee_config_returns_stored_values.1.json b/engine-core/test_snapshots/protocol_fee/tests/get_fee_config_returns_stored_values.1.json new file mode 100644 index 0000000..2bad0c5 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/get_fee_config_returns_stored_values.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 250 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/init_rejects_bps_over_max.1.json b/engine-core/test_snapshots/protocol_fee/tests/init_rejects_bps_over_max.1.json new file mode 100644 index 0000000..dc76d95 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/init_rejects_bps_over_max.1.json @@ -0,0 +1,131 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/multiple_tokens_exempt_independently.1.json b/engine-core/test_snapshots/protocol_fee/tests/multiple_tokens_exempt_independently.1.json new file mode 100644 index 0000000..fa3fd61 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/multiple_tokens_exempt_independently.1.json @@ -0,0 +1,108 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TOK_EX" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/set_fee_bps_updates_rate.1.json b/engine-core/test_snapshots/protocol_fee/tests/set_fee_bps_updates_rate.1.json new file mode 100644 index 0000000..2f58aa4 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/set_fee_bps_updates_rate.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 750 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/set_fee_recipient_updates_address.1.json b/engine-core/test_snapshots/protocol_fee/tests/set_fee_recipient_updates_address.1.json new file mode 100644 index 0000000..f33c007 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/set_fee_recipient_updates_address.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/token_exempt_cleared.1.json b/engine-core/test_snapshots/protocol_fee/tests/token_exempt_cleared.1.json new file mode 100644 index 0000000..822f98d --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/token_exempt_cleared.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/token_exempt_false_by_default.1.json b/engine-core/test_snapshots/protocol_fee/tests/token_exempt_false_by_default.1.json new file mode 100644 index 0000000..822f98d --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/token_exempt_false_by_default.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/token_exempt_set_and_check.1.json b/engine-core/test_snapshots/protocol_fee/tests/token_exempt_set_and_check.1.json new file mode 100644 index 0000000..072c0a3 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/token_exempt_set_and_check.1.json @@ -0,0 +1,108 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TOK_EX" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "bool": true + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/protocol_fee/tests/zero_amount_no_fee.1.json b/engine-core/test_snapshots/protocol_fee/tests/zero_amount_no_fee.1.json new file mode 100644 index 0000000..e9eb5c1 --- /dev/null +++ b/engine-core/test_snapshots/protocol_fee/tests/zero_amount_no_fee.1.json @@ -0,0 +1,93 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "FEE_BPS" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "FEE_RCP" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/treasury/tests/snapshot_creation_and_retrieval.1.json b/engine-core/test_snapshots/treasury/tests/snapshot_creation_and_retrieval.1.json index 9fa149d..927d25c 100644 --- a/engine-core/test_snapshots/treasury/tests/snapshot_creation_and_retrieval.1.json +++ b/engine-core/test_snapshots/treasury/tests/snapshot_creation_and_retrieval.1.json @@ -16,6 +16,105 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "symbol": "S1" + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "symbol": "S1" + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "account_count" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "context" + }, + "val": { + "map": [] + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "state_hash" + }, + "val": { + "bytes": "3f669395051abd97652a9c947139d6d477c996972caa38158decad5a49c70efb" + } + }, + { + "key": { + "symbol": "timestamp_unix" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "total_balance" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "trigger" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], [ { "contract_data": { @@ -41,78 +140,10 @@ "storage": [ { "key": { - "symbol": "S1" + "symbol": "OUTFLOWS" }, "val": { - "map": [ - { - "key": { - "symbol": "account_count" - }, - "val": { - "u32": 5 - } - }, - { - "key": { - "symbol": "context" - }, - "val": { - "map": [] - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "ledger" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "state_hash" - }, - "val": { - "bytes": "3f669395051abd97652a9c947139d6d477c996972caa38158decad5a49c70efb" - } - }, - { - "key": { - "symbol": "timestamp" - }, - "val": { - "string": "0" - } - }, - { - "key": { - "symbol": "total_balance" - }, - "val": { - "i128": { - "hi": 0, - "lo": 1000 - } - } - }, - { - "key": { - "symbol": "triggered_by" - }, - "val": { - "string": "deposit" - } - } - ] + "map": [] } }, { @@ -165,29 +196,6 @@ ] }, "events": [ - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "TRE" - }, - { - "symbol": "snapshot" - } - ], - "data": { - "u64": 1 - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -207,62 +215,26 @@ "map": [ { "key": { - "symbol": "action" + "symbol": "flags" }, "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + "u32": 515 } }, { "key": { - "symbol": "event_type" + "symbol": "hash" }, "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + "bytes": "3f669395051abd97652a9c947139d6d477c996972caa38158decad5a49c70efb" } }, { "key": { - "symbol": "payload" + "symbol": "value" }, "val": { - "map": [ - { - "key": { - "symbol": "accounts" - }, - "val": { - "u32": 5 - } - }, - { - "key": { - "symbol": "balance" - }, - "val": { - "i128": { - "hi": 0, - "lo": 1000 - } - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "ledger" - }, - "val": { - "u32": 0 - } - } - ] + "u64": 1 } } ] diff --git a/engine-core/test_snapshots/treasury/tests/snapshot_hash_verification.1.json b/engine-core/test_snapshots/treasury/tests/snapshot_hash_verification.1.json index a73b4fe..776fbad 100644 --- a/engine-core/test_snapshots/treasury/tests/snapshot_hash_verification.1.json +++ b/engine-core/test_snapshots/treasury/tests/snapshot_hash_verification.1.json @@ -16,6 +16,105 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "symbol": "S1" + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "symbol": "S1" + }, + "durability": "temporary", + "val": { + "map": [ + { + "key": { + "symbol": "account_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "context" + }, + "val": { + "map": [] + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "state_hash" + }, + "val": { + "bytes": "07586b978bc32ed5959e4cf607f6debcbd3a8cb8225357a37eff8e34668b29d6" + } + }, + { + "key": { + "symbol": "timestamp_unix" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "total_balance" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "trigger" + }, + "val": { + "u32": 1 + } + } + ] + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], [ { "contract_data": { @@ -41,78 +140,10 @@ "storage": [ { "key": { - "symbol": "S1" + "symbol": "OUTFLOWS" }, "val": { - "map": [ - { - "key": { - "symbol": "account_count" - }, - "val": { - "u32": 2 - } - }, - { - "key": { - "symbol": "context" - }, - "val": { - "map": [] - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "ledger" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "state_hash" - }, - "val": { - "bytes": "07586b978bc32ed5959e4cf607f6debcbd3a8cb8225357a37eff8e34668b29d6" - } - }, - { - "key": { - "symbol": "timestamp" - }, - "val": { - "string": "0" - } - }, - { - "key": { - "symbol": "total_balance" - }, - "val": { - "i128": { - "hi": 0, - "lo": 500 - } - } - }, - { - "key": { - "symbol": "triggered_by" - }, - "val": { - "string": "withdrawal" - } - } - ] + "map": [] } }, { @@ -165,29 +196,6 @@ ] }, "events": [ - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "TRE" - }, - { - "symbol": "snapshot" - } - ], - "data": { - "u64": 1 - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -207,62 +215,26 @@ "map": [ { "key": { - "symbol": "action" + "symbol": "flags" }, "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + "u32": 515 } }, { "key": { - "symbol": "event_type" + "symbol": "hash" }, "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + "bytes": "07586b978bc32ed5959e4cf607f6debcbd3a8cb8225357a37eff8e34668b29d6" } }, { "key": { - "symbol": "payload" + "symbol": "value" }, "val": { - "map": [ - { - "key": { - "symbol": "accounts" - }, - "val": { - "u32": 2 - } - }, - { - "key": { - "symbol": "balance" - }, - "val": { - "i128": { - "hi": 0, - "lo": 500 - } - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "ledger" - }, - "val": { - "u32": 0 - } - } - ] + "u64": 1 } } ] diff --git a/engine-core/test_snapshots/treasury/tests/withdrawal_blocked_before_time_lock_expires.1.json b/engine-core/test_snapshots/treasury/tests/withdrawal_blocked_before_time_lock_expires.1.json new file mode 100644 index 0000000..eecb34e --- /dev/null +++ b/engine-core/test_snapshots/treasury/tests/withdrawal_blocked_before_time_lock_expires.1.json @@ -0,0 +1,179 @@ +{ + "generators": { + "address": 1, + "nonce": 0 + }, + "auth": [], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 2307 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 7 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 7 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 7 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 7 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/treasury/tests/withdrawal_executes_after_time_lock_expires.1.json b/engine-core/test_snapshots/treasury/tests/withdrawal_executes_after_time_lock_expires.1.json new file mode 100644 index 0000000..8cfc662 --- /dev/null +++ b/engine-core/test_snapshots/treasury/tests/withdrawal_executes_after_time_lock_expires.1.json @@ -0,0 +1,250 @@ +{ + "generators": { + "address": 1, + "nonce": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 86400, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "OUTFLOWS" + }, + "val": { + "map": [ + { + "key": { + "u64": 7 + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "executable_at" + }, + "val": { + "u64": 86400 + } + }, + { + "key": { + "symbol": "executed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 7 + } + }, + { + "key": { + "symbol": "requested_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + ] + } + }, + { + "key": { + "symbol": "SNAPC" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "SNAPL" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 2307 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 7 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 2563 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 7 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file From 8f650263343e23dd9a6c86f3197080582c0c22a0 Mon Sep 17 00:00:00 2001 From: Samuel Dahunsi Date: Sun, 28 Jun 2026 01:21:58 +0100 Subject: [PATCH 2/4] update fixes --- engine-core/src/burn.rs | 2 +- engine-core/src/circuit_breaker.rs | 15 +- engine-core/src/event_struct.rs | 19 +- engine-core/src/event_utils.rs | 1 - engine-core/src/governance.rs | 26 +- engine-core/src/governance_tests.rs | 2 +- engine-core/src/protocol_fee.rs | 310 ++++++++++--- .../tests/hash_mismatch_is_rejected.1.json | 164 +++++++ .../audit/tests/replay_is_rejected.1.json | 46 +- .../audit/tests/valid_first_commitment.1.json | 49 +- .../burn/tests/invalid_amount_rejected.1.json | 131 ++++++ .../tests/non_admin_cannot_request.1.json | 10 +- .../same_admin_cannot_double_approve.1.json | 10 +- ...s_not_execute_when_threshold_is_two.1.json | 20 +- .../threshold_transition_sets_unlock.1.json | 424 ++++++++++++++++++ .../test_duplicate_approval_detection.1.json | 157 ++++++- .../tests/test_full_proposal_lifecycle.1.json | 210 ++++++--- ...test_proposal_initial_state_pending.1.json | 185 ++++---- ...eject_approval_of_executed_proposal.1.json | 116 +++-- ...eject_approval_on_approved_proposal.1.json | 113 ++--- .../tests/test_reject_double_execution.1.json | 163 +------ ...eject_execution_of_pending_proposal.1.json | 104 ++++- ...ate_transition_approved_to_executed.1.json | 189 +++++--- ...tate_transition_pending_to_approved.1.json | 197 +++++--- ...sfer_full_bps_all_goes_to_recipient.1.json | 8 +- .../snapshot_creation_and_retrieval.1.json | 18 +- .../tests/snapshot_hash_verification.1.json | 18 +- ...de_fails_when_hash_was_not_approved.1.json | 341 ++++++++++++++ .../tests/upgrade_fails_without_quorum.1.json | 260 +++++++++++ 29 files changed, 2621 insertions(+), 687 deletions(-) create mode 100644 engine-core/test_snapshots/audit/tests/hash_mismatch_is_rejected.1.json create mode 100644 engine-core/test_snapshots/burn/tests/invalid_amount_rejected.1.json create mode 100644 engine-core/test_snapshots/governance/tests/threshold_transition_sets_unlock.1.json create mode 100644 engine-core/test_snapshots/upgrade/tests/upgrade_fails_when_hash_was_not_approved.1.json create mode 100644 engine-core/test_snapshots/upgrade/tests/upgrade_fails_without_quorum.1.json diff --git a/engine-core/src/burn.rs b/engine-core/src/burn.rs index 4f7d830..5ba4be1 100644 --- a/engine-core/src/burn.rs +++ b/engine-core/src/burn.rs @@ -6,7 +6,7 @@ use soroban_sdk::{contracterror, panic_with_error, Address, BytesN, Env, String}; use crate::event_struct::{ACT_BURN_SAFE, MOD_BURN}; -use crate::event_utils::publish_event; +use crate::event_utils::{publish_event, zero_hash}; #[contracterror] #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] diff --git a/engine-core/src/circuit_breaker.rs b/engine-core/src/circuit_breaker.rs index cc8cbf1..47b4b55 100644 --- a/engine-core/src/circuit_breaker.rs +++ b/engine-core/src/circuit_breaker.rs @@ -8,7 +8,6 @@ use soroban_sdk::{contracterror, panic_with_error, symbol_short, vec, Address, B use crate::event_struct::{ACT_RESET, ACT_TRIP, MOD_CB}; use crate::event_utils::publish_event; use crate::types::BreakerState; -use soroban_sdk::{contracterror, panic_with_error, symbol_short, vec, Address, Env, Symbol, Vec}; const KEY_STATE: Symbol = symbol_short!("CB_STATE"); const KEY_GUARDIAN: Symbol = symbol_short!("CB_GUARD"); @@ -35,12 +34,8 @@ pub fn assert_closed(env: &Env) { .storage() .instance() .get(&KEY_STATE) - .unwrap_or(BreakerState::Closed) -} - -/// Panics with `CircuitOpen` when the breaker is tripped. -pub fn assert_closed(env: &Env) { - if state(env) == BreakerState::Open { + .unwrap_or(BreakerState::Closed); + if state == BreakerState::Open { panic_with_error!(env, BreakerError::CircuitOpen); } } @@ -64,7 +59,11 @@ pub fn reset(env: &Env, guardian: &Address) { } fn set_state(env: &Env, next: BreakerState) { - let current = state(env); + let current: BreakerState = env + .storage() + .instance() + .get(&KEY_STATE) + .unwrap_or(BreakerState::Closed); if current == next { panic_with_error!(env, BreakerError::AlreadyInState); } diff --git a/engine-core/src/event_struct.rs b/engine-core/src/event_struct.rs index 2408f09..355bac0 100644 --- a/engine-core/src/event_struct.rs +++ b/engine-core/src/event_struct.rs @@ -11,23 +11,7 @@ //! `value` carries a u64 primary value (sequence, proposal id, amount, …). //! `hash` carries an optional 32-byte hash. All-zero when unused. -// Compact event encoding — bitmask-based event struct. -// -// Replaces the previous fat `Event { event_type: BytesN<32>, action: BytesN<32>, payload: Map }` -// which wasted 64 bytes of zeroed data and allocated an expensive `Map` on every call. -// -// ## Encoding -// -// `flags` packs module id (bits 0–7) and action id (bits 8–15) into a single `u32`: -// -// ```text -// bits 0– 7 : module id (MOD_*) -// bits 8–15 : action id (ACT_*) -// bits 16–31 : reserved for future use / version -// ``` -// -// `value` carries a u64 primary value (sequence, proposal id, amount, …). -// `hash` carries an optional 32-byte hash (state_hash, action_hash). Zero if unused. +use soroban_sdk::contracttype; // ── module ids ──────────────────────────────────────────────────────────────── @@ -54,6 +38,7 @@ pub const ACT_REQUEST: u32 = 0x09 << 8; pub const ACT_TRIGGERED: u32 = 0x0A << 8; pub const ACT_FEE: u32 = 0x0B << 8; pub const ACT_FEE_TRANSFER: u32 = 0x0C << 8; +pub const ACT_UPGRADE: u32 = 0x0D << 8; /// Compact event struct — flat, zero heap allocation. #[contracttype] diff --git a/engine-core/src/event_utils.rs b/engine-core/src/event_utils.rs index 6a6d4c8..32353e6 100644 --- a/engine-core/src/event_utils.rs +++ b/engine-core/src/event_utils.rs @@ -3,7 +3,6 @@ use soroban_sdk::{symbol_short, BytesN, Env}; use crate::event_struct::CompactEvent; -use soroban_sdk::{symbol_short, BytesN, Env}; /// Publish a compact, structured event. /// diff --git a/engine-core/src/governance.rs b/engine-core/src/governance.rs index bba14df..ea3b3b5 100644 --- a/engine-core/src/governance.rs +++ b/engine-core/src/governance.rs @@ -144,13 +144,25 @@ fn require_stake(env: &Env, signer: &Address) { } } - publish_event( - env, - MOD_GOV | ACT_PROPOSE, - proposal.id, - BytesN::from_array(env, &[0u8; 32]), - ); - proposal.id +/// Submit a new proposal. `proposal.proposer` must be an authorised signer. +/// Returns the proposal id. +pub fn propose(env: &Env, proposal: Proposal) -> u64 { + crate::non_reentrant!(env); + require_signer(env, &proposal.proposer); + + let mut prop = proposal; + prop.state = ProposalState::Pending; + let id = prop.id; + + let mut proposals = load_proposals(env); + if proposals.contains_key(id) { + panic_with_error!(env, GovError::ProposalAlreadyExists); + } + proposals.set(id, (prop, 0u32)); + save_proposals(env, &proposals); + + publish_event(env, MOD_GOV | ACT_PROPOSE, id, zero_hash(env)); + id } pub fn approve(env: &Env, signer: &Address, proposal_id: u64) { diff --git a/engine-core/src/governance_tests.rs b/engine-core/src/governance_tests.rs index 747eb37..3beceb1 100644 --- a/engine-core/src/governance_tests.rs +++ b/engine-core/src/governance_tests.rs @@ -197,7 +197,7 @@ mod tests { #[test] fn test_invalid_transition_error_code() { - assert_eq!(GovError::InvalidStateTransition as u32, 4); + assert_eq!(GovError::InvalidStateTransition as u32, 5); } #[test] diff --git a/engine-core/src/protocol_fee.rs b/engine-core/src/protocol_fee.rs index 954a8d4..a185ec8 100644 --- a/engine-core/src/protocol_fee.rs +++ b/engine-core/src/protocol_fee.rs @@ -1,27 +1,30 @@ //! Protocol fee helpers with checked arithmetic. +use crate::burn::reject_zero_address; use crate::circuit_breaker::assert_closed; -use crate::event_struct::{ACT_FEE, MOD_FEE}; +use crate::event_struct::{ACT_FEE, ACT_FEE_TRANSFER, MOD_FEE}; use crate::event_utils::{publish_event, zero_hash}; +use crate::guards::ReentrancyGuard; use soroban_sdk::{ - contracterror, panic_with_error, symbol_short, token, Address, Env, String, Symbol, + contracterror, panic_with_error, symbol_short, token, Address, Env, Symbol, }; -use crate::event_struct::{MOD_FEE, ACT_FEE}; -use crate::event_utils::publish_event; -use crate::circuit_breaker::assert_closed; const KEY_FEE_BPS: Symbol = symbol_short!("FEE_BPS"); const KEY_FEE_RECIPIENT: Symbol = symbol_short!("FEE_RCP"); +const KEY_TOK_EX: Symbol = symbol_short!("TOK_EX"); #[contracterror] #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] pub enum FeeError { - InvalidBasisPoints = 1, - InvalidRecipient = 2, - FeeCalculationOverflow = 3, + InvalidBasisPoints = 1, + InvalidRecipient = 2, + FeeCalculationOverflow = 3, + InvalidAmount = 4, } -const MAX_BPS: u32 = 10000; +const MAX_BPS: u32 = 10_000; + +const ZERO_ADDRESS: &str = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; // ── Configuration ───────────────────────────────────────────────────────────── @@ -37,6 +40,45 @@ pub fn init(env: &Env, fee_bps: u32, recipient: &Address) { env.storage().instance().set(&KEY_FEE_RECIPIENT, recipient); } +pub fn get_fee_config(env: &Env) -> (u32, Option
) { + let fee_bps: u32 = env.storage().instance().get(&KEY_FEE_BPS).unwrap_or(0); + let recipient: Option
= env.storage().instance().get(&KEY_FEE_RECIPIENT); + (fee_bps, recipient) +} + +pub fn set_fee_bps(env: &Env, fee_bps: u32) { + if fee_bps > MAX_BPS { + panic_with_error!(env, FeeError::InvalidBasisPoints); + } + env.storage().instance().set(&KEY_FEE_BPS, &fee_bps); +} + +pub fn set_fee_recipient(env: &Env, recipient: &Address) { + validate_address(env, recipient); + env.storage().instance().set(&KEY_FEE_RECIPIENT, recipient); +} + +// ── Token exemption ─────────────────────────────────────────────────────────── + +fn exempt_key(token: &Address) -> (Symbol, Address) { + (KEY_TOK_EX, token.clone()) +} + +pub fn set_token_exempt(env: &Env, token: &Address, exempt: bool) { + let k = exempt_key(token); + if exempt { + env.storage().instance().set(&k, &true); + } else { + env.storage().instance().remove(&k); + } +} + +pub fn is_token_exempt(env: &Env, token: &Address) -> bool { + env.storage().instance().has(&exempt_key(token)) +} + +// ── Fee calculation ─────────────────────────────────────────────────────────── + pub fn calculate_fee(env: &Env, amount: i128) -> (i128, i128) { if amount < 0 { panic_with_error!(env, FeeError::InvalidAmount); @@ -47,7 +89,7 @@ pub fn calculate_fee(env: &Env, amount: i128) -> (i128, i128) { } let fee = amount .checked_mul(fee_bps as i128) - .and_then(|v| v.checked_div(10000)) + .and_then(|v| v.checked_div(10_000)) .unwrap_or_else(|| panic_with_error!(env, FeeError::FeeCalculationOverflow)); let net = amount .checked_sub(fee) @@ -63,13 +105,9 @@ pub fn calculate_fee(env: &Env, amount: i128) -> (i128, i128) { /// /// 1. Asserts the circuit breaker is `Closed`. /// 2. Acquires the reentrancy guard. -/// 3. Rejects `to` = zero address ([`BurnError::ZeroAddress`]). +/// 3. Rejects `to` = zero address. /// 4. If `token` is fee-exempt, transfers `amount` from `from` → `to` unchanged. -/// 5. Otherwise: -/// - Computes `(fee, net) = amount * fee_bps / 10 000`. -/// - Transfers `fee` from `from` → fee recipient (skipped when fee is 0). -/// - Transfers `net` from `from` → `to`. -/// - Emits `MOD_FEE | ACT_FEE_TRANSFER` event carrying the fee amount. +/// 5. Otherwise splits the transfer: `fee` → fee recipient, `net` → `to`. /// /// Returns the net amount delivered to `to`. pub fn fee_on_transfer( @@ -96,7 +134,7 @@ pub fn fee_on_transfer( let recipient: Address = env .storage() .instance() - .get(&KEY_FEE_RCP) + .get(&KEY_FEE_RECIPIENT) .unwrap_or_else(|| panic_with_error!(env, FeeError::InvalidRecipient)); tkn.transfer(from, &recipient, &fee); } @@ -105,12 +143,7 @@ pub fn fee_on_transfer( tkn.transfer(from, to, &net); } - publish_event( - env, - MOD_FEE | ACT_FEE_TRANSFER, - fee as u64, - BytesN::from_array(env, &[0u8; 32]), - ); + publish_event(env, MOD_FEE | ACT_FEE_TRANSFER, fee as u64, zero_hash(env)); net } @@ -119,8 +152,6 @@ pub fn fee_on_transfer( /// /// Transfers the fee portion from `current_contract_address()` to the /// configured recipient. Returns the net amount. -/// -/// Use [`fee_on_transfer`] when intercepting a third-party transfer end-to-end. pub fn deduct_fee(env: &Env, token: &Address, amount: i128) -> i128 { crate::non_reentrant!(env); assert_closed(env); @@ -130,55 +161,32 @@ pub fn deduct_fee(env: &Env, token: &Address, amount: i128) -> i128 { let recipient: Address = env .storage() .instance() - .get(&KEY_FEE_RCP) + .get(&KEY_FEE_RECIPIENT) .unwrap_or_else(|| panic_with_error!(env, FeeError::InvalidRecipient)); - token::Client::new(env, token).transfer( &env.current_contract_address(), &recipient, &fee, ); - - // Single compact event — fee amount in value field. - publish_event( - env, - MOD_FEE | ACT_FEE, - fee as u64, - BytesN::from_array(env, &[0u8; 32]), - ); + publish_event(env, MOD_FEE | ACT_FEE, fee as u64, zero_hash(env)); } net } -pub fn get_fee_config(env: &Env) -> (u32, Option
) { - let fee_bps: u32 = env.storage().instance().get(&KEY_FEE_BPS).unwrap_or(0); - let recipient: Option
= env.storage().instance().get(&KEY_FEE_RECIPIENT); - (fee_bps, recipient) -} - -pub fn set_fee_bps(env: &Env, fee_bps: u32) { - if fee_bps > MAX_BPS { - panic_with_error!(env, FeeError::InvalidBasisPoints); - } - env.storage().instance().set(&KEY_FEE_BPS, &fee_bps); -} - -pub fn set_fee_recipient(env: &Env, recipient: &Address) { - validate_address(env, recipient); - env.storage().instance().set(&KEY_FEE_RECIPIENT, recipient); -} - fn validate_address(env: &Env, addr: &Address) { - let s = addr.to_string(); - if s.is_empty() { + use soroban_sdk::String; + let zero = String::from_str(env, ZERO_ADDRESS); + if addr.to_string() == zero { panic_with_error!(env, FeeError::InvalidRecipient); } } +// ── Tests ───────────────────────────────────────────────────────────────────── + #[cfg(test)] mod tests { use super::*; - use soroban_sdk::{testutils::Address as _, token, vec, Env}; + use soroban_sdk::{testutils::Address as _, token, Env}; use crate::circuit_breaker; @@ -237,10 +245,21 @@ mod tests { }); } + #[test] + fn zero_amount_no_fee() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 500); + env.as_contract(&contract_id, || { + let (fee, net) = calculate_fee(&env, 0); + assert_eq!(fee, 0); + assert_eq!(net, 0); + }); + } + #[test] fn fee_at_full_bps_is_full_amount() { let env = Env::default(); - let (contract_id, _) = setup(&env, 10000); + let (contract_id, _) = setup(&env, 10_000); env.as_contract(&contract_id, || { let (fee, net) = calculate_fee(&env, 1_000); assert_eq!(fee, 1_000); @@ -272,6 +291,18 @@ mod tests { }); } + #[test] + fn set_fee_recipient_updates_address() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 100); + let new_recipient = Address::generate(&env); + env.as_contract(&contract_id, || { + set_fee_recipient(&env, &new_recipient); + let (_, rec) = get_fee_config(&env); + assert_eq!(rec.unwrap(), new_recipient); + }); + } + #[test] #[should_panic] fn init_rejects_bps_over_max() { @@ -279,7 +310,170 @@ mod tests { let contract_id = env.register_contract(None, TestContract); let recipient = Address::generate(&env); env.as_contract(&contract_id, || { - init(&env, 10001, &recipient); + init(&env, 10_001, &recipient); }); } + + // ── token exemption ─────────────────────────────────────────────────────── + + #[test] + fn token_exempt_false_by_default() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 500); + let token = Address::generate(&env); + env.as_contract(&contract_id, || { + assert!(!is_token_exempt(&env, &token)); + }); + } + + #[test] + fn token_exempt_set_and_check() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 500); + let token = Address::generate(&env); + env.as_contract(&contract_id, || { + set_token_exempt(&env, &token, true); + assert!(is_token_exempt(&env, &token)); + }); + } + + #[test] + fn token_exempt_cleared() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 500); + let token = Address::generate(&env); + env.as_contract(&contract_id, || { + set_token_exempt(&env, &token, true); + set_token_exempt(&env, &token, false); + assert!(!is_token_exempt(&env, &token)); + }); + } + + #[test] + fn multiple_tokens_exempt_independently() { + let env = Env::default(); + let (contract_id, _) = setup(&env, 500); + let token_a = Address::generate(&env); + let token_b = Address::generate(&env); + env.as_contract(&contract_id, || { + set_token_exempt(&env, &token_a, true); + assert!(is_token_exempt(&env, &token_a)); + assert!(!is_token_exempt(&env, &token_b)); + }); + } + + // ── fee_on_transfer ─────────────────────────────────────────────────────── + + #[test] + #[should_panic] + fn fee_on_transfer_circuit_open_panics() { + let env = Env::default(); + env.mock_all_auths(); + let (contract_id, _) = setup(&env, 500); + let token = Address::generate(&env); + let from = Address::generate(&env); + let to = Address::generate(&env); + let guardian = Address::generate(&env); + + env.as_contract(&contract_id, || { + use soroban_sdk::vec; + circuit_breaker::init(&env, vec![&env, guardian.clone()]); + circuit_breaker::trip(&env, &guardian); + fee_on_transfer(&env, &token, &from, &to, 1_000); + }); + } + + #[test] + fn fee_on_transfer_standard_fee_splits_correctly() { + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (token_addr, stellar) = make_token(&env); + let (contract_id, fee_recipient) = setup(&env, 500); // 5 % + + let from = Address::generate(&env); + let to = Address::generate(&env); + stellar.mint(&from, &1_000i128); + + let net = env.as_contract(&contract_id, || { + fee_on_transfer(&env, &token_addr, &from, &to, 1_000) + }); + + let tkn = token::Client::new(&env, &token_addr); + assert_eq!(net, 950); + assert_eq!(tkn.balance(&to), 950); + assert_eq!(tkn.balance(&fee_recipient), 50); + assert_eq!(tkn.balance(&from), 0); + } + + #[test] + fn fee_on_transfer_zero_bps_passes_full_amount() { + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (token_addr, stellar) = make_token(&env); + let (contract_id, _) = setup(&env, 0); + + let from = Address::generate(&env); + let to = Address::generate(&env); + stellar.mint(&from, &500i128); + + let net = env.as_contract(&contract_id, || { + fee_on_transfer(&env, &token_addr, &from, &to, 500) + }); + + let tkn = token::Client::new(&env, &token_addr); + assert_eq!(net, 500); + assert_eq!(tkn.balance(&to), 500); + assert_eq!(tkn.balance(&from), 0); + } + + #[test] + fn fee_on_transfer_exempt_token_no_fee_deducted() { + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (token_addr, stellar) = make_token(&env); + let (contract_id, fee_recipient) = setup(&env, 500); // 5 % — but token is exempt + + let from = Address::generate(&env); + let to = Address::generate(&env); + stellar.mint(&from, &1_000i128); + + env.as_contract(&contract_id, || { + set_token_exempt(&env, &token_addr, true); + }); + + let net = env.as_contract(&contract_id, || { + fee_on_transfer(&env, &token_addr, &from, &to, 1_000) + }); + + let tkn = token::Client::new(&env, &token_addr); + assert_eq!(net, 1_000); + assert_eq!(tkn.balance(&to), 1_000); + assert_eq!(tkn.balance(&fee_recipient), 0); + assert_eq!(tkn.balance(&from), 0); + } + + #[test] + fn fee_on_transfer_full_bps_all_goes_to_recipient() { + let env = Env::default(); + env.mock_all_auths_allowing_non_root_auth(); + + let (token_addr, stellar) = make_token(&env); + let (contract_id, fee_recipient) = setup(&env, 10_000); // 100 % + + let from = Address::generate(&env); + let to = Address::generate(&env); + stellar.mint(&from, &200i128); + + let net = env.as_contract(&contract_id, || { + fee_on_transfer(&env, &token_addr, &from, &to, 200) + }); + + let tkn = token::Client::new(&env, &token_addr); + assert_eq!(net, 0); + assert_eq!(tkn.balance(&fee_recipient), 200); + assert_eq!(tkn.balance(&from), 0); + } } diff --git a/engine-core/test_snapshots/audit/tests/hash_mismatch_is_rejected.1.json b/engine-core/test_snapshots/audit/tests/hash_mismatch_is_rejected.1.json new file mode 100644 index 0000000..d9a288a --- /dev/null +++ b/engine-core/test_snapshots/audit/tests/hash_mismatch_is_rejected.1.json @@ -0,0 +1,164 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 2 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 2 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/audit/tests/replay_is_rejected.1.json b/engine-core/test_snapshots/audit/tests/replay_is_rejected.1.json index 3876e68..926f7a2 100644 --- a/engine-core/test_snapshots/audit/tests/replay_is_rejected.1.json +++ b/engine-core/test_snapshots/audit/tests/replay_is_rejected.1.json @@ -46,6 +46,39 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_code": { @@ -131,19 +164,12 @@ }, { "error": { - "contract": 1 + "auth": "existing_value" } } ], "data": { - "vec": [ - { - "string": "failing with contract error" - }, - { - "u32": 1 - } - ] + "string": "frame is already authorized" } } } @@ -163,7 +189,7 @@ }, { "error": { - "contract": 1 + "auth": "existing_value" } } ], diff --git a/engine-core/test_snapshots/audit/tests/valid_first_commitment.1.json b/engine-core/test_snapshots/audit/tests/valid_first_commitment.1.json index 18b2d58..d2c5373 100644 --- a/engine-core/test_snapshots/audit/tests/valid_first_commitment.1.json +++ b/engine-core/test_snapshots/audit/tests/valid_first_commitment.1.json @@ -4,7 +4,21 @@ "nonce": 0 }, "auth": [ - [] + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ] ], "ledger": { "protocol_version": 21, @@ -65,6 +79,39 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_code": { diff --git a/engine-core/test_snapshots/burn/tests/invalid_amount_rejected.1.json b/engine-core/test_snapshots/burn/tests/invalid_amount_rejected.1.json new file mode 100644 index 0000000..93e1abe --- /dev/null +++ b/engine-core/test_snapshots/burn/tests/invalid_amount_rejected.1.json @@ -0,0 +1,131 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 2 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 2 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/emergency_recovery/tests/non_admin_cannot_request.1.json b/engine-core/test_snapshots/emergency_recovery/tests/non_admin_cannot_request.1.json index 2fef8f3..5179fe6 100644 --- a/engine-core/test_snapshots/emergency_recovery/tests/non_admin_cannot_request.1.json +++ b/engine-core/test_snapshots/emergency_recovery/tests/non_admin_cannot_request.1.json @@ -1,6 +1,6 @@ { "generators": { - "address": 8, + "address": 6, "nonce": 0 }, "auth": [ @@ -46,10 +46,10 @@ "val": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } ] } @@ -83,7 +83,7 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { "nonce": 801925984706572462 @@ -98,7 +98,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { "nonce": 801925984706572462 diff --git a/engine-core/test_snapshots/emergency_recovery/tests/same_admin_cannot_double_approve.1.json b/engine-core/test_snapshots/emergency_recovery/tests/same_admin_cannot_double_approve.1.json index b4ff2f2..e2d0f6e 100644 --- a/engine-core/test_snapshots/emergency_recovery/tests/same_admin_cannot_double_approve.1.json +++ b/engine-core/test_snapshots/emergency_recovery/tests/same_admin_cannot_double_approve.1.json @@ -1,6 +1,6 @@ { "generators": { - "address": 7, + "address": 5, "nonce": 0 }, "auth": [ @@ -46,10 +46,10 @@ "val": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } ] } @@ -83,7 +83,7 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", "key": { "ledger_key_nonce": { "nonce": 801925984706572462 @@ -98,7 +98,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", "key": { "ledger_key_nonce": { "nonce": 801925984706572462 diff --git a/engine-core/test_snapshots/emergency_recovery/tests/single_approval_does_not_execute_when_threshold_is_two.1.json b/engine-core/test_snapshots/emergency_recovery/tests/single_approval_does_not_execute_when_threshold_is_two.1.json index dc2c210..4c1a06b 100644 --- a/engine-core/test_snapshots/emergency_recovery/tests/single_approval_does_not_execute_when_threshold_is_two.1.json +++ b/engine-core/test_snapshots/emergency_recovery/tests/single_approval_does_not_execute_when_threshold_is_two.1.json @@ -1,13 +1,13 @@ { "generators": { - "address": 9, + "address": 6, "nonce": 0 }, "auth": [ [], [ [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", { "function": { "contract_fn": { @@ -61,13 +61,13 @@ "val": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } ] } @@ -90,7 +90,7 @@ "val": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] } @@ -100,7 +100,7 @@ "symbol": "ER_DEST" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" } }, { @@ -116,7 +116,7 @@ "symbol": "ER_TOKEN" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" } } ] @@ -132,7 +132,7 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", "key": { "ledger_key_nonce": { "nonce": 801925984706572462 @@ -147,7 +147,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", "key": { "ledger_key_nonce": { "nonce": 801925984706572462 diff --git a/engine-core/test_snapshots/governance/tests/threshold_transition_sets_unlock.1.json b/engine-core/test_snapshots/governance/tests/threshold_transition_sets_unlock.1.json new file mode 100644 index 0000000..e61fbf9 --- /dev/null +++ b/engine-core/test_snapshots/governance/tests/threshold_transition_sets_unlock.1.json @@ -0,0 +1,424 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 21, + "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_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [ + { + "key": { + "u64": 1 + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "action_hash" + }, + "val": { + "bytes": "0707070707070707070707070707070707070707070707070707070707070707" + } + }, + { + "key": { + "symbol": "approved_by" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "proposer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 1 + } + } + ] + }, + { + "u32": 720 + } + ] + } + } + ] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 2 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/governance_tests/tests/test_duplicate_approval_detection.1.json b/engine-core/test_snapshots/governance_tests/tests/test_duplicate_approval_detection.1.json index 5878ce9..b2d8cd6 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_duplicate_approval_detection.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_duplicate_approval_detection.1.json @@ -1,9 +1,12 @@ { "generators": { - "address": 2, + "address": 3, "nonce": 0 }, - "auth": [], + "auth": [ + [], + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -36,7 +39,107 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [ + { + "key": { + "u64": 1 + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "action_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "approved_by" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "proposer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 0 + } + } + ] + }, + { + "u32": 0 + } + ] + } + } + ] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 2 + } + } + ] } } } @@ -151,6 +254,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", diff --git a/engine-core/test_snapshots/governance_tests/tests/test_full_proposal_lifecycle.1.json b/engine-core/test_snapshots/governance_tests/tests/test_full_proposal_lifecycle.1.json index 414daaf..164c2f8 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_full_proposal_lifecycle.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_full_proposal_lifecycle.1.json @@ -3,10 +3,30 @@ "address": 2, "nonce": 0 }, - "auth": [], + "auth": [ + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], "ledger": { "protocol_version": 21, - "sequence_number": 0, + "sequence_number": 721, "timestamp": 0, "network_id": "0000000000000000000000000000000000000000000000000000000000000000", "base_reserve": 0, @@ -36,7 +56,108 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [ + { + "key": { + "u64": 1 + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "action_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "approved_by" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "proposer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 2 + } + } + ] + }, + { + "u32": 720 + } + ] + } + } + ] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] } } } @@ -79,39 +200,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_code": { @@ -188,12 +276,11 @@ "event": { "ext": "v0", "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", + "type_": "contract", "body": { "v0": { "topics": [ { -<<<<<<< HEAD "symbol": "EVENT" }, { @@ -227,18 +314,6 @@ } } ] -======= - "symbol": "error" - }, - { - "error": { - "auth": "existing_value" - } - } - ], - "data": { - "string": "frame is already authorized" ->>>>>>> 375ece821d49ac44b67ab6ee4eae55baf579e142 } } } @@ -249,21 +324,44 @@ "event": { "ext": "v0", "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", + "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "error" + "symbol": "EVENT" }, { - "error": { - "auth": "existing_value" - } + "symbol": "LOG" } ], "data": { - "string": "escalating error to panic" + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1282 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 1 + } + } + ] } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_proposal_initial_state_pending.1.json b/engine-core/test_snapshots/governance_tests/tests/test_proposal_initial_state_pending.1.json index f61eb9d..34b9659 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_proposal_initial_state_pending.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_proposal_initial_state_pending.1.json @@ -3,7 +3,11 @@ "address": 2, "nonce": 0 }, - "auth": [], + "auth": [ + [], + [], + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -36,7 +40,104 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [ + { + "key": { + "u64": 1 + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "action_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "approved_by" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "proposer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 0 + } + } + ] + }, + { + "u32": 0 + } + ] + } + } + ] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] } } } @@ -46,39 +147,6 @@ 4095 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 801925984706572462 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 801925984706572462 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_code": { @@ -107,12 +175,11 @@ "event": { "ext": "v0", "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", + "type_": "contract", "body": { "v0": { "topics": [ { -<<<<<<< HEAD "symbol": "EVENT" }, { @@ -146,50 +213,6 @@ } } ] -======= - "symbol": "error" - }, - { - "error": { - "auth": "invalid_action" - } - } - ], - "data": { - "vec": [ - { - "string": "Unauthorized function call for address" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "error" - }, - { - "error": { - "auth": "invalid_action" - } - } - ], - "data": { - "string": "escalating error to panic" ->>>>>>> 375ece821d49ac44b67ab6ee4eae55baf579e142 } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_of_executed_proposal.1.json b/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_of_executed_proposal.1.json index 3d59014..a8f3ade 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_of_executed_proposal.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_of_executed_proposal.1.json @@ -4,6 +4,8 @@ "nonce": 0 }, "auth": [ + [], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", @@ -19,25 +21,11 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "", - "args": [] - } - }, - "sub_invocations": [] - } - ] - ] + [] ], "ledger": { "protocol_version": 21, - "sequence_number": 0, + "sequence_number": 721, "timestamp": 0, "network_id": "0000000000000000000000000000000000000000000000000000000000000000", "base_reserve": 0, @@ -68,6 +56,17 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, { "key": { "symbol": "PROPS" @@ -203,6 +202,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6312720 + ] + ], [ { "contract_code": { @@ -244,7 +276,6 @@ ], "data": { "map": [ -<<<<<<< HEAD { "key": { "symbol": "flags" @@ -391,31 +422,11 @@ ], "data": { "vec": [ -======= ->>>>>>> 375ece821d49ac44b67ab6ee4eae55baf579e142 { - "key": { - "symbol": "flags" - }, - "val": { - "u32": 770 - } + "string": "failing with contract error" }, { - "key": { - "symbol": "hash" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - { - "key": { - "symbol": "value" - }, - "val": { - "u64": 1 - } + "u32": 5 } ] } @@ -437,32 +448,7 @@ }, { "error": { - "auth": "existing_value" - } - } - ], - "data": { - "string": "frame is already authorized" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "error" - }, - { - "error": { - "auth": "existing_value" + "contract": 5 } } ], diff --git a/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_on_approved_proposal.1.json b/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_on_approved_proposal.1.json index 7071334..f97e1e5 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_on_approved_proposal.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_reject_approval_on_approved_proposal.1.json @@ -4,21 +4,8 @@ "nonce": 0 }, "auth": [ - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "", - "args": [] - } - }, - "sub_invocations": [] - } - ] - ], + [], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", @@ -68,6 +55,17 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, { "key": { "symbol": "PROPS" @@ -203,6 +201,39 @@ 6311999 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], [ { "contract_code": { @@ -244,7 +275,6 @@ ], "data": { "map": [ -<<<<<<< HEAD { "key": { "symbol": "flags" @@ -343,31 +373,11 @@ ], "data": { "vec": [ -======= ->>>>>>> 375ece821d49ac44b67ab6ee4eae55baf579e142 { - "key": { - "symbol": "flags" - }, - "val": { - "u32": 770 - } + "string": "failing with contract error" }, { - "key": { - "symbol": "hash" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - { - "key": { - "symbol": "value" - }, - "val": { - "u64": 1 - } + "u32": 5 } ] } @@ -389,32 +399,7 @@ }, { "error": { - "auth": "existing_value" - } - } - ], - "data": { - "string": "frame is already authorized" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "error" - }, - { - "error": { - "auth": "existing_value" + "contract": 5 } } ], diff --git a/engine-core/test_snapshots/governance_tests/tests/test_reject_double_execution.1.json b/engine-core/test_snapshots/governance_tests/tests/test_reject_double_execution.1.json index eeea141..8dc4f99 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_reject_double_execution.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_reject_double_execution.1.json @@ -4,21 +4,8 @@ "nonce": 0 }, "auth": [ - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "", - "args": [] - } - }, - "sub_invocations": [] - } - ] - ], + [], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", @@ -37,7 +24,7 @@ ], "ledger": { "protocol_version": 21, - "sequence_number": 0, + "sequence_number": 721, "timestamp": 0, "network_id": "0000000000000000000000000000000000000000000000000000000000000000", "base_reserve": 0, @@ -68,6 +55,17 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, { "key": { "symbol": "PROPS" @@ -200,39 +198,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_code": { @@ -274,7 +239,6 @@ ], "data": { "map": [ -<<<<<<< HEAD { "key": { "symbol": "flags" @@ -421,79 +385,11 @@ ], "data": { "vec": [ -======= ->>>>>>> 375ece821d49ac44b67ab6ee4eae55baf579e142 - { - "key": { - "symbol": "flags" - }, - "val": { - "u32": 770 - } - }, { - "key": { - "symbol": "hash" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } + "string": "failing with contract error" }, { - "key": { - "symbol": "value" - }, - "val": { - "u64": 1 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "EVENT" - }, - { - "symbol": "LOG" - } - ], - "data": { - "map": [ - { - "key": { - "symbol": "flags" - }, - "val": { - "u32": 1282 - } - }, - { - "key": { - "symbol": "hash" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - { - "key": { - "symbol": "value" - }, - "val": { - "u64": 1 - } + "u32": 5 } ] } @@ -515,32 +411,7 @@ }, { "error": { - "auth": "existing_value" - } - } - ], - "data": { - "string": "frame is already authorized" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "error" - }, - { - "error": { - "auth": "existing_value" + "contract": 5 } } ], diff --git a/engine-core/test_snapshots/governance_tests/tests/test_reject_execution_of_pending_proposal.1.json b/engine-core/test_snapshots/governance_tests/tests/test_reject_execution_of_pending_proposal.1.json index 1600155..5460512 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_reject_execution_of_pending_proposal.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_reject_execution_of_pending_proposal.1.json @@ -3,7 +3,10 @@ "address": 2, "nonce": 0 }, - "auth": [], + "auth": [ + [], + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -36,7 +39,104 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [ + { + "key": { + "u64": 1 + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "action_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "approved_by" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "proposer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 0 + } + } + ] + }, + { + "u32": 0 + } + ] + } + } + ] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_state_transition_approved_to_executed.1.json b/engine-core/test_snapshots/governance_tests/tests/test_state_transition_approved_to_executed.1.json index 54d34b3..293e175 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_state_transition_approved_to_executed.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_state_transition_approved_to_executed.1.json @@ -3,10 +3,29 @@ "address": 2, "nonce": 0 }, - "auth": [], + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], "ledger": { "protocol_version": 21, - "sequence_number": 0, + "sequence_number": 721, "timestamp": 0, "network_id": "0000000000000000000000000000000000000000000000000000000000000000", "base_reserve": 0, @@ -36,7 +55,108 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [ + { + "key": { + "u64": 1 + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "action_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "approved_by" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "proposer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 2 + } + } + ] + }, + { + "u32": 720 + } + ] + } + } + ] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] } } } @@ -79,39 +199,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_code": { @@ -188,12 +275,11 @@ "event": { "ext": "v0", "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", + "type_": "contract", "body": { "v0": { "topics": [ { -<<<<<<< HEAD "symbol": "EVENT" }, { @@ -227,18 +313,6 @@ } } ] -======= - "symbol": "error" - }, - { - "error": { - "auth": "existing_value" - } - } - ], - "data": { - "string": "frame is already authorized" ->>>>>>> 375ece821d49ac44b67ab6ee4eae55baf579e142 } } } @@ -249,12 +323,11 @@ "event": { "ext": "v0", "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", + "type_": "contract", "body": { "v0": { "topics": [ { -<<<<<<< HEAD "symbol": "EVENT" }, { @@ -288,18 +361,6 @@ } } ] -======= - "symbol": "error" - }, - { - "error": { - "auth": "existing_value" - } - } - ], - "data": { - "string": "escalating error to panic" ->>>>>>> 375ece821d49ac44b67ab6ee4eae55baf579e142 } } } diff --git a/engine-core/test_snapshots/governance_tests/tests/test_state_transition_pending_to_approved.1.json b/engine-core/test_snapshots/governance_tests/tests/test_state_transition_pending_to_approved.1.json index ca98ab2..27b7f0e 100644 --- a/engine-core/test_snapshots/governance_tests/tests/test_state_transition_pending_to_approved.1.json +++ b/engine-core/test_snapshots/governance_tests/tests/test_state_transition_pending_to_approved.1.json @@ -3,7 +3,26 @@ "address": 2, "nonce": 0 }, - "auth": [], + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -36,7 +55,108 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "symbol": "MINSTAKE" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [ + { + "key": { + "u64": 1 + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "action_hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "approved_by" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "proposer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 1 + } + } + ] + }, + { + "u32": 720 + } + ] + } + } + ] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] } } } @@ -79,39 +199,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_code": { @@ -188,12 +275,11 @@ "event": { "ext": "v0", "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", + "type_": "contract", "body": { "v0": { "topics": [ { -<<<<<<< HEAD "symbol": "EVENT" }, { @@ -227,43 +313,6 @@ } } ] -======= - "symbol": "error" - }, - { - "error": { - "auth": "existing_value" - } - } - ], - "data": { - "string": "frame is already authorized" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "error" - }, - { - "error": { - "auth": "existing_value" - } - } - ], - "data": { - "string": "escalating error to panic" ->>>>>>> 375ece821d49ac44b67ab6ee4eae55baf579e142 } } } diff --git a/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_full_bps_all_goes_to_recipient.1.json b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_full_bps_all_goes_to_recipient.1.json index 543c46f..1698035 100644 --- a/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_full_bps_all_goes_to_recipient.1.json +++ b/engine-core/test_snapshots/protocol_fee/tests/fee_on_transfer_full_bps_all_goes_to_recipient.1.json @@ -916,7 +916,7 @@ } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } } } @@ -941,7 +941,7 @@ "data": { "i128": { "hi": 0, - "lo": 0 + "lo": 200 } } } @@ -968,7 +968,7 @@ } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" } } } @@ -993,7 +993,7 @@ "data": { "i128": { "hi": 0, - "lo": 200 + "lo": 0 } } } diff --git a/engine-core/test_snapshots/treasury/tests/snapshot_creation_and_retrieval.1.json b/engine-core/test_snapshots/treasury/tests/snapshot_creation_and_retrieval.1.json index 927d25c..9f08344 100644 --- a/engine-core/test_snapshots/treasury/tests/snapshot_creation_and_retrieval.1.json +++ b/engine-core/test_snapshots/treasury/tests/snapshot_creation_and_retrieval.1.json @@ -21,7 +21,14 @@ "contract_data": { "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { - "symbol": "S1" + "vec": [ + { + "symbol": "Snapshot" + }, + { + "u64": 1 + } + ] }, "durability": "temporary" } @@ -34,7 +41,14 @@ "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { - "symbol": "S1" + "vec": [ + { + "symbol": "Snapshot" + }, + { + "u64": 1 + } + ] }, "durability": "temporary", "val": { diff --git a/engine-core/test_snapshots/treasury/tests/snapshot_hash_verification.1.json b/engine-core/test_snapshots/treasury/tests/snapshot_hash_verification.1.json index 776fbad..2479ffd 100644 --- a/engine-core/test_snapshots/treasury/tests/snapshot_hash_verification.1.json +++ b/engine-core/test_snapshots/treasury/tests/snapshot_hash_verification.1.json @@ -21,7 +21,14 @@ "contract_data": { "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { - "symbol": "S1" + "vec": [ + { + "symbol": "Snapshot" + }, + { + "u64": 1 + } + ] }, "durability": "temporary" } @@ -34,7 +41,14 @@ "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { - "symbol": "S1" + "vec": [ + { + "symbol": "Snapshot" + }, + { + "u64": 1 + } + ] }, "durability": "temporary", "val": { diff --git a/engine-core/test_snapshots/upgrade/tests/upgrade_fails_when_hash_was_not_approved.1.json b/engine-core/test_snapshots/upgrade/tests/upgrade_fails_when_hash_was_not_approved.1.json new file mode 100644 index 0000000..2493a08 --- /dev/null +++ b/engine-core/test_snapshots/upgrade/tests/upgrade_fails_when_hash_was_not_approved.1.json @@ -0,0 +1,341 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [], + "ledger": { + "protocol_version": 21, + "sequence_number": 721, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 7 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 7 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 7 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/upgrade/tests/upgrade_fails_without_quorum.1.json b/engine-core/test_snapshots/upgrade/tests/upgrade_fails_without_quorum.1.json new file mode 100644 index 0000000..1c1bde7 --- /dev/null +++ b/engine-core/test_snapshots/upgrade/tests/upgrade_fails_without_quorum.1.json @@ -0,0 +1,260 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [], + "ledger": { + "protocol_version": 21, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 770 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 7 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "EVENT" + }, + { + "symbol": "LOG" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "flags" + }, + "val": { + "u32": 1026 + } + }, + { + "key": { + "symbol": "hash" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "value" + }, + "val": { + "u64": 7 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 2 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 2 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file From 90af6a4b31ecc962caac957fbb3e33dd0e36b2aa Mon Sep 17 00:00:00 2001 From: Samuel Dahunsi Date: Tue, 7 Jul 2026 03:03:04 +0100 Subject: [PATCH 3/4] fix wasm build: remove duplicate extern crate alloc and add missing event constants --- engine-core/src/core/proxy.rs | 2 -- engine-core/src/core/state.rs | 4 ++-- engine-core/src/event_struct.rs | 3 +++ engine-core/src/governance.rs | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/engine-core/src/core/proxy.rs b/engine-core/src/core/proxy.rs index fd30278..652416d 100644 --- a/engine-core/src/core/proxy.rs +++ b/engine-core/src/core/proxy.rs @@ -5,8 +5,6 @@ //! adheres to Soroban/Rust security standards. use soroban_sdk::{contract, contractimpl, contracterror, panic_with_error, Address, BytesN, Env, Symbol, Bytes}; -extern crate alloc; - use crate::{audit, types::StateCommitment}; const ADMIN_KEY: Symbol = soroban_sdk::symbol_short!("ADMIN"); diff --git a/engine-core/src/core/state.rs b/engine-core/src/core/state.rs index a113fb4..7bd88fe 100644 --- a/engine-core/src/core/state.rs +++ b/engine-core/src/core/state.rs @@ -43,7 +43,7 @@ fn allowed_transition(from: ProtocolState, to: ProtocolState) -> bool { } pub fn init(env: &Env) { - env.storage().instance().set(&KEY_STATE, &ProtocolState::Pending); + env.storage().instance().set(&KEY_STATE, &(ProtocolState::Pending as u32)); } pub fn get_state(env: &Env) -> ProtocolState { @@ -59,7 +59,7 @@ pub fn transition_to(env: &Env, next: ProtocolState) { if !allowed_transition(current, next) { panic_with_error!(env, StateError::InvalidTransition); } - env.storage().instance().set(&KEY_STATE, &next); + env.storage().instance().set(&KEY_STATE, &(next as u32)); publish_event( env, MOD_CORE | ACT_TRANSITION, diff --git a/engine-core/src/event_struct.rs b/engine-core/src/event_struct.rs index 23b7e35..fc6fa9f 100644 --- a/engine-core/src/event_struct.rs +++ b/engine-core/src/event_struct.rs @@ -23,6 +23,7 @@ pub const MOD_BURN: u32 = 0x05; pub const MOD_RECOVERY: u32 = 0x06; pub const MOD_FEE: u32 = 0x07; pub const MOD_UPGRADE: u32 = 0x08; +pub const MOD_CORE: u32 = 0x09; // ── action ids ──────────────────────────────────────────────────────────────── @@ -39,6 +40,8 @@ pub const ACT_TRIGGERED: u32 = 0x0A << 8; pub const ACT_FEE: u32 = 0x0B << 8; pub const ACT_FEE_TRANSFER: u32 = 0x0C << 8; pub const ACT_UPGRADE: u32 = 0x0D << 8; +pub const ACT_INIT: u32 = 0x0E << 8; +pub const ACT_TRANSITION: u32 = 0x0F << 8; /// Compact event struct — flat, zero heap allocation. #[contracttype] diff --git a/engine-core/src/governance.rs b/engine-core/src/governance.rs index 324e1a1..b601e25 100644 --- a/engine-core/src/governance.rs +++ b/engine-core/src/governance.rs @@ -5,7 +5,7 @@ //! Invalid transitions panic with typed `GovError` values. use soroban_sdk::{ - contracterror, panic_with_error, symbol_short, token, vec, Address, BytesN, Env, Map, Symbol, Vec, + contracterror, panic_with_error, symbol_short, token, vec, Address, Env, Map, Symbol, Vec, }; use crate::circuit_breaker::assert_closed; From 0ce28e9de40c45013581237484d90804b4645912 Mon Sep 17 00:00:00 2001 From: Samuel Dahunsi Date: Mon, 13 Jul 2026 13:06:11 +0100 Subject: [PATCH 4/4] fix wasm build --- engine-core/src/core/proxy.rs | 11 +++-------- engine-core/src/lib.rs | 3 --- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/engine-core/src/core/proxy.rs b/engine-core/src/core/proxy.rs index 652416d..4428134 100644 --- a/engine-core/src/core/proxy.rs +++ b/engine-core/src/core/proxy.rs @@ -4,7 +4,7 @@ //! Includes storage gap to prevent storage collisions, admin controls, and //! adheres to Soroban/Rust security standards. -use soroban_sdk::{contract, contractimpl, contracterror, panic_with_error, Address, BytesN, Env, Symbol, Bytes}; +use soroban_sdk::{contract, contractimpl, contracterror, panic_with_error, Address, BytesN, Env, Symbol}; use crate::{audit, types::StateCommitment}; const ADMIN_KEY: Symbol = soroban_sdk::symbol_short!("ADMIN"); @@ -52,12 +52,7 @@ impl UpgradeableProxy { } /// ZK-ready integrity check invoked via the audit layer - pub fn verify_integrity(env: Env, commitment: StateCommitment, payload: Bytes) { - // Copy bytes to verify transition - let mut payload_buf = alloc::vec::Vec::new(); - payload_buf.resize(payload.len() as usize, 0); - payload.copy_into_slice(&mut payload_buf); - - audit::validate_transition(&env, &commitment, &payload_buf); + pub fn verify_integrity(env: Env, commitment: StateCommitment, payload: BytesN<32>) { + audit::validate_transition(&env, &commitment, &payload.to_array()); } } diff --git a/engine-core/src/lib.rs b/engine-core/src/lib.rs index 8ae9884..cec3613 100644 --- a/engine-core/src/lib.rs +++ b/engine-core/src/lib.rs @@ -1,8 +1,5 @@ #![no_std] -extern crate alloc; - - pub mod audit; pub mod burn; pub mod circuit_breaker;