diff --git a/Cargo.lock b/Cargo.lock index 0293dc9..7d25db1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -430,8 +430,6 @@ dependencies = [ name = "engine-core" version = "0.1.0" dependencies = [ - "hex", - "sha2", "soroban-sdk", ] diff --git a/engine-core/Cargo.toml b/engine-core/Cargo.toml index da44dd7..218d40a 100644 --- a/engine-core/Cargo.toml +++ b/engine-core/Cargo.toml @@ -8,8 +8,7 @@ description = "Vero Protocol — ZK audit, multi-sig governance, circuit-breaker crate-type = ["cdylib", "rlib"] [dependencies] -soroban-sdk = { version = "21.0.0" } -sha2 = { version = "0.10", default-features = false } +soroban-sdk = { version = "21.0.0", features = ["testutils"] } [dev-dependencies] soroban-sdk = { version = "21.0.0", features = ["testutils"] } diff --git a/engine-core/src/audit.rs b/engine-core/src/audit.rs index 411a118..58bf679 100644 --- a/engine-core/src/audit.rs +++ b/engine-core/src/audit.rs @@ -4,33 +4,35 @@ //! Off-chain provers submit `StateCommitment`s; this module verifies ordering //! and hash integrity before they are persisted. -use soroban_sdk::{contracterror, panic_with_error, symbol_short, Env, Symbol, BytesN, Map, IntoVal}; -use soroban_sdk::{contracterror, panic_with_error, symbol_short, Env, Symbol, BytesN}; -use crate::event_struct::{MOD_AUDIT, ACT_COMMIT}; -use crate::event_utils::publish_event; -use sha2::{Digest, Sha256}; +use soroban_sdk::{contracterror, panic_with_error, symbol_short, Bytes, Env, Symbol}; 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)] +#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] +#[repr(u32)] pub enum AuditError { - ReplayedSequence = 1, - HashMismatch = 2, + ReplayedSequence = 1, + HashMismatch = 2, AuthorUnauthorised = 3, } /// Compute the SHA-256 commitment hash over (prev_hash ‖ sequence ‖ payload). -pub fn compute_commitment(prev_hash: &[u8; 32], sequence: u64, payload: &[u8]) -> [u8; 32] { - let mut h = Sha256::new(); - h.update(prev_hash); - h.update(sequence.to_be_bytes()); - h.update(payload); - h.finalize().into() +pub fn compute_commitment( + env: &Env, + prev_hash: &[u8; 32], + sequence: u64, + payload: &Bytes, +) -> [u8; 32] { + let mut data = Bytes::new(env); + data.append(&Bytes::from_array(env, prev_hash)); + data.append(&Bytes::from_array(env, &sequence.to_be_bytes())); + data.append(payload); + env.crypto().sha256(&data).to_array() } /// Validate and record a new `StateCommitment`. @@ -38,8 +40,7 @@ pub fn compute_commitment(prev_hash: &[u8; 32], sequence: u64, payload: &[u8]) - /// Panics if: /// - `commitment.sequence` ≤ last recorded sequence (replay guard) /// - `commitment.state_hash` doesn't match the expected derivation -pub fn validate_transition(env: &Env, commitment: &StateCommitment, payload: &[u8]) { - assert_closed(env); +pub fn validate_transition(env: &Env, commitment: &StateCommitment, payload: &Bytes) { let last_seq: u64 = env.storage().instance().get(&KEY_SEQ).unwrap_or(0); if commitment.sequence <= last_seq { panic_with_error!(env, AuditError::ReplayedSequence); @@ -51,7 +52,7 @@ pub fn validate_transition(env: &Env, commitment: &StateCommitment, payload: &[u .get::(&KEY_PREV) .unwrap_or([0u8; 32]); - let expected = compute_commitment(&prev_hash, commitment.sequence, payload); + let expected = compute_commitment(env, &prev_hash, commitment.sequence, payload); let actual: [u8; 32] = commitment.state_hash.to_array(); if expected != actual { panic_with_error!(env, AuditError::HashMismatch); @@ -76,8 +77,11 @@ pub fn validate_transition(env: &Env, commitment: &StateCommitment, payload: &[u #[cfg(test)] mod tests { - use super::*; - use soroban_sdk::{testutils::Address as _, Address, BytesN, Env}; + use super::compute_commitment; + use crate::types::StateCommitment; + use crate::VeroCore; + use crate::VeroCoreClient; + use soroban_sdk::{testutils::Address as _, vec, Address, Bytes, BytesN, Env}; #[soroban_sdk::contract] pub struct TestContract; @@ -88,37 +92,47 @@ mod tests { #[test] fn valid_first_commitment() { let env = Env::default(); - let payload = b"state_payload_v1"; - let hash = compute_commitment(&[0u8; 32], 1, payload); + env.mock_all_auths(); + let contract_id = env.register_contract(None, VeroCore); + let client = VeroCoreClient::new(&env, &contract_id); + + let author = Address::generate(&env); + let signers = vec![&env, Address::generate(&env)]; + client.init(&signers, &1, &vec![&env]); + + let payload = Bytes::from_slice(&env, b"state_payload_v1"); + let hash = compute_commitment(&env, &[0u8; 32], 1, &payload); let c = StateCommitment { state_hash: BytesN::from_array(&env, &hash), - sequence: 1, - ledger: 100, - author: Address::generate(&env), + sequence: 1, + ledger: 100, + author: author.clone(), }; - let contract_id = env.register_contract(None, TestContract); - env.as_contract(&contract_id, || { - validate_transition(&env, &c, payload); // must not panic - }); + client.commit(&c, &payload); // must not panic } #[test] - #[should_panic] + #[should_panic(expected = "Error(Contract, #1)")] // ReplayedSequence fn replay_is_rejected() { let env = Env::default(); - let payload = b"payload"; - let hash = compute_commitment(&[0u8; 32], 1, payload); + env.mock_all_auths(); + let contract_id = env.register_contract(None, VeroCore); + let client = VeroCoreClient::new(&env, &contract_id); + + let author = Address::generate(&env); + let signers = vec![&env, Address::generate(&env)]; + client.init(&signers, &1, &vec![&env]); + + let payload = Bytes::from_slice(&env, b"payload"); + let hash = compute_commitment(&env, &[0u8; 32], 1, &payload); let c = StateCommitment { state_hash: BytesN::from_array(&env, &hash), - sequence: 1, - ledger: 100, - author: Address::generate(&env), + sequence: 1, + ledger: 100, + author: author.clone(), }; - let contract_id = env.register_contract(None, TestContract); - env.as_contract(&contract_id, || { - validate_transition(&env, &c, payload); - validate_transition(&env, &c, payload); // second call must panic - }); + client.commit(&c, &payload); + client.commit(&c, &payload); // second call must panic } } diff --git a/engine-core/src/circuit_breaker.rs b/engine-core/src/circuit_breaker.rs index 84b6c87..6c9ee7a 100644 --- a/engine-core/src/circuit_breaker.rs +++ b/engine-core/src/circuit_breaker.rs @@ -4,25 +4,28 @@ use soroban_sdk::{contracterror, panic_with_error, symbol_short, vec, Address, E //! 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, BytesN, Env, Symbol, Vec}; +use soroban_sdk::{contracterror, panic_with_error, symbol_short, vec, Address, Env, Symbol, Vec}; use crate::event_struct::{MOD_CB, ACT_TRIP, ACT_RESET}; 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)] +#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] +#[repr(u32)] 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); } @@ -38,7 +41,6 @@ pub fn assert_closed(env: &Env) { } 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. @@ -54,7 +56,6 @@ pub fn trip(env: &Env, guardian: &Address) { } 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. @@ -94,8 +95,9 @@ fn require_guardian(env: &Env, caller: &Address) { #[cfg(test)] mod tests { - use super::*; - use soroban_sdk::{testutils::Address as _, vec, Env}; + use crate::VeroCore; + use crate::VeroCoreClient; + use soroban_sdk::{testutils::Address as _, vec, Address, Env}; #[soroban_sdk::contract] pub struct TestContract; @@ -107,37 +109,29 @@ mod tests { fn trip_and_reset() { let env = Env::default(); env.mock_all_auths(); + let contract_id = env.register_contract(None, VeroCore); + let client = VeroCoreClient::new(&env, &contract_id); + let g = Address::generate(&env); - let contract_id = env.register_contract(None, TestContract); - - env.as_contract(&contract_id, || { - init(&env, vec![&env, g.clone()]); - assert_closed(&env); - }); - - 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); - }); + let signers = vec![&env, Address::generate(&env)]; + client.init(&signers, &1, &vec![&env, g.clone()]); + + client.trip(&g); + client.reset(&g); } #[test] - #[should_panic] + #[should_panic(expected = "Error(Contract, #2)")] // NotGuardian fn non_guardian_cannot_trip() { let env = Env::default(); env.mock_all_auths(); + let contract_id = env.register_contract(None, VeroCore); + let client = VeroCoreClient::new(&env, &contract_id); + let g = Address::generate(&env); let rogue = Address::generate(&env); - let contract_id = env.register_contract(None, TestContract); - env.as_contract(&contract_id, || { - init(&env, vec![&env, g.clone()]); - trip(&env, &rogue); - }); + let signers = vec![&env, Address::generate(&env)]; + client.init(&signers, &1, &vec![&env, g.clone()]); + client.trip(&rogue); } } diff --git a/engine-core/src/governance.rs b/engine-core/src/governance.rs index 44eb0fb..1cb2354 100644 --- a/engine-core/src/governance.rs +++ b/engine-core/src/governance.rs @@ -2,24 +2,17 @@ //! //! ## Storage layout (optimised) //! -//! | Key | Storage | Type | Notes | -//! |--------------|------------|-------------------------|------------------------------| -//! | `SIGNERS` | instance | `Vec
` | signer set | -//! | `THRESH` | instance | `u32` | approval threshold | -//! | `MINSTAKE` | instance | `i128` | optional min stake | -//! | `STKTOK` | instance | `Address` | stake token contract | -//! | `P{id}` | persistent | `(Proposal, u32)` | per-proposal entry + unlock | -//! -//! Moving from a single `Map` in instance storage to per-key -//! persistent entries means each `approve`/`execute` call only deserialises the -//! single proposal being acted on, not the entire proposal set. +//! ## Proposal State Machine +//! ```text +//! Pending -> (on approve, threshold met) -> Approved -> (on execute, timelock elapsed) -> Executed +//! ``` +//! Invalid transitions trigger contract panics. use crate::event_struct::{MOD_GOV, ACT_PROPOSE, ACT_APPROVE, ACT_EXECUTE}; use crate::event_utils::publish_event; use crate::types::{Proposal, ProposalState}; use soroban_sdk::{ - contracterror, panic_with_error, symbol_short, token, vec, Address, BytesN, Env, IntoVal, Map, - Symbol, Vec, + contracterror, panic_with_error, symbol_short, vec, Address, Env, Map, Symbol, Vec, }; const KEY_PROPOSALS: Symbol = symbol_short!("PROPS"); @@ -30,15 +23,11 @@ const KEY_STAKE_TOK: Symbol = symbol_short!("STKTOK"); Symbol, Val, Vec, }; -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"); - -/// Persistent TTL constants (in ledgers). ~30 days at 5-second ledger time. -const PROPOSAL_TTL_THRESHOLD: u32 = 17_280; -const PROPOSAL_TTL_EXTEND_TO: u32 = 17_280 * 30; - +const KEY_PROPOSALS: Symbol = symbol_short!("PROPS"); +const KEY_SIGNERS: Symbol = symbol_short!("SIGNERS"); +const KEY_THRESH: Symbol = symbol_short!("THRESH"); +const KEY_NEXT_ID: Symbol = symbol_short!("NEXT_ID"); +/// Ledgers to wait after full approval before execution (~1 hour on Stellar). const TIMELOCK_LEDGERS: u32 = 720; const MAX_THRESHOLD: u32 = 100; const MAX_DURATION_LEDGERS: u32 = 5256000; @@ -58,72 +47,57 @@ pub enum GovError { } #[contracterror] -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] +#[repr(u32)] pub enum GovError { - NotASigner = 1, - AlreadyApproved = 2, - ProposalNotFound = 3, - TimelockActive = 4, - InvalidStateTransition = 5, - AlreadyExecuted = 6, - InsufficientStake = 7, + NotASigner = 1, + AlreadyApproved = 2, + ThresholdNotMet = 3, + TimelockActive = 4, + InvalidStateTransition = 5, + ProposalNotFound = 6, + InvalidThreshold = 7, } -pub fn init( - env: &Env, - signers: Vec
, - threshold: u32, - stake_token: Address, - min_stake: i128, -) { - if threshold == 0 || threshold > signers.len() || threshold > MAX_THRESHOLD { +/// Initialise governance with an ordered signer set and approval threshold. +pub fn init(env: &Env, signers: Vec
, threshold: u32) { + if threshold == 0 || threshold > signers.len() { panic_with_error!(env, GovError::InvalidThreshold); } - if min_stake < 0 { - panic_with_error!(env, GovError::InvalidStake); - } env.storage().instance().set(&KEY_SIGNERS, &signers); env.storage().instance().set(&KEY_THRESH, &threshold); - if threshold == 0 || threshold > signers.len() { - panic_with_error!(env, GovError::NotASigner); - } - env.storage().instance().set(&KEY_SIGNERS, &signers); - env.storage().instance().set(&KEY_THRESH, &threshold); - env.storage().instance().set(&KEY_STAKE_TOK, &stake_token); - env.storage().instance().set(&KEY_MIN_STAKE, &min_stake); + env.storage().instance().set(&KEY_NEXT_ID, &1u64); + let empty: Map = Map::new(env); + env.storage().instance().set(&KEY_PROPOSALS, &empty); } -pub fn propose( - env: &Env, - proposer: &Address, - action_hash: BytesN<32>, - duration_ledgers: u32, -) -> u64 { - if duration_ledgers < MIN_DURATION_LEDGERS || duration_ledgers > MAX_DURATION_LEDGERS { - panic_with_error!(env, GovError::InvalidStateTransition); - } - - let current_ledger = env.ledger().sequence(); - let voting_deadline = current_ledger + duration_ledgers; +fn load_proposals(env: &Env) -> Map { + env.storage() + .instance() + .get(&KEY_PROPOSALS) + .unwrap_or(Map::new(env)) +} - let mut props: Map = env +/// Submit a new proposal. Returns the assigned proposal id. +pub fn propose(env: &Env, mut proposal: Proposal) -> u64 { + let signers: Vec
= env .storage() .instance() - .get(&KEY_PROPOSALS) - .unwrap_or(Map::new(env)); + .get(&KEY_SIGNERS) + .unwrap_or(vec![env]); + if !signers.contains(&proposal.proposer) { + panic_with_error!(env, GovError::NotASigner); + } - let next_id = (props.len() as u64) + 1; + let id: u64 = env.storage().instance().get(&KEY_NEXT_ID).unwrap_or(1); + proposal.id = id; + env.storage().instance().set(&KEY_NEXT_ID, &(id + 1)); - let proposal = Proposal { - id: next_id, - proposer: proposer.clone(), - action_hash, - approved_by: Vec::new(env), - state: ProposalState::Pending, - voting_deadline, - }; + // Initialize state to Pending + proposal.state = ProposalState::Pending; - let unlock_ledger = current_ledger + TIMELOCK_LEDGERS; + 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); @@ -162,53 +136,37 @@ pub fn propose(env: &Env, proposal: Proposal) -> u64 { id } -pub fn approve(env: &Env, voter: &Address, proposal_id: u64) { - voter.require_auth(); - require_signer(env, voter); - - let mut props: Map = env +/// 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) { + let signers: Vec
= env .storage() .instance() - .get(&KEY_PROPOSALS) - .unwrap_or_else(|| panic_with_error!(env, GovError::ProposalNotFound)); - + .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 (mut prop, unlock) = props.get(proposal_id).unwrap_or_else(|| { - panic_with_error!(env, GovError::ProposalNotFound) - }); - - if prop.state != ProposalState::Pending { - panic_with_error!(env, GovError::InvalidStateTransition); - } - require_min_stake(env, voter); - - 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 pending proposals can receive approvals if prop.state != ProposalState::Pending { panic_with_error!(env, GovError::InvalidStateTransition); } - if prop.approved_by.contains(voter) { + 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); - } - } - - prop.approved_by.push_back(voter.clone()); - + // Transition to Approved when threshold is met if prop.approved_by.len() >= threshold { prop.state = ProposalState::Approved; env.events().publish( @@ -258,7 +216,7 @@ pub fn approve(env: &Env, voter: &Address, proposal_id: u64) { ); } - props.set(proposal_id, (prop.clone(), unlock)); + props.set(proposal_id, (prop, unlock)); env.storage().instance().set(&KEY_PROPOSALS, &props); } @@ -272,26 +230,16 @@ pub fn approve(env: &Env, voter: &Address, proposal_id: u64) { } pub fn execute(env: &Env, proposal_id: u64) -> Proposal { - let mut props: Map = env - .storage() - .instance() - .get(&KEY_PROPOSALS) + let mut props = load_proposals(env); + let (mut prop, unlock) = props + .get(proposal_id) .unwrap_or_else(|| panic_with_error!(env, GovError::ProposalNotFound)); - - let (mut prop, unlock) = props.get(proposal_id).unwrap_or_else(|| { - panic_with_error!(env, GovError::ProposalNotFound) - }); - - if prop.state != ProposalState::Approved { - panic_with_error!(env, GovError::InvalidStateTransition); + let threshold: u32 = env.storage().instance().get(&KEY_THRESH).unwrap_or(1); + if prop.approved_by.len() < threshold { + panic_with_error!(env, GovError::ThresholdNotMet); } - let key = proposal_key(env, proposal_id); - let (mut prop, unlock): (Proposal, u32) = env - .storage() - .persistent() - .get(&key) - .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); } @@ -367,49 +315,3 @@ pub fn cancel(env: &Env, caller: &Address, proposal_id: u64) -> Proposal { ); prop } - -fn require_signer(env: &Env, addr: &Address) { - - prop -} - -fn require_signer(env: &Env, voter: &Address) { - let signers: Vec
= env - .storage() - .instance() - .get(&KEY_SIGNERS) - .unwrap_or(vec![env]); - if !signers.contains(addr) { - panic_with_error!(env, GovError::NotASigner); - } -} - if !signers.contains(voter) { - panic_with_error!(env, GovError::NotASigner); - } -} - -fn proposal_key(env: &Env, id: u64) -> Symbol { - Symbol::new(env, &format!("P{}", id)) -} - -fn extend_proposal_ttl(env: &Env, key: &Symbol) { - env.storage() - .persistent() - .extend_ttl(key, PROPOSAL_TTL_THRESHOLD, PROPOSAL_TTL_EXTEND_TO); -} - -fn require_min_stake(env: &Env, voter: &Address) { - let min_stake: i128 = env.storage().instance().get(&KEY_MIN_STAKE).unwrap_or(0); - if min_stake == 0 { - return; - } - let stake_token: Address = env - .storage() - .instance() - .get(&KEY_STAKE_TOK) - .unwrap_or_else(|| panic_with_error!(env, GovError::NotASigner)); - let balance = token::Client::new(env, &stake_token).balance(voter); - if balance < min_stake { - panic_with_error!(env, GovError::InsufficientStake); - } -} diff --git a/engine-core/src/governance_tests.rs b/engine-core/src/governance_tests.rs index ed89472..d7dc7b2 100644 --- a/engine-core/src/governance_tests.rs +++ b/engine-core/src/governance_tests.rs @@ -1,377 +1,127 @@ #[cfg(test)] mod tests { - use crate::governance; - use crate::types::{Proposal, ProposalState}; - use soroban_sdk::{ - contract, contractimpl, - testutils::{Address as _, Events, Ledger}, - vec, Address, BytesN, Env, - }; + use crate::VeroCore; + use crate::VeroCoreClient; + use soroban_sdk::{testutils::Ledger, vec, Address, BytesN, Env}; - // ── minimal stub contract ──────────────────────────────────────────────── - - #[contract] - struct GovContract; - - #[contractimpl] - impl GovContract {} - - fn register_contract(env: &Env) -> Address { - env.register_contract(None, GovContract) - } - - fn register_token(env: &Env) -> Address { - env.register_stellar_asset_contract_v2(Address::generate(env)) - .address() - } - - fn fund(env: &Env, token: &Address, to: &Address, amount: i128) { - soroban_sdk::token::StellarAssetClient::new(env, token) - .mock_all_auths() - .mint(to, &amount); - } - - fn dummy_hash(env: &Env) -> BytesN<32> { - BytesN::from_array(env, &[0u8; 32]) - } - - fn make_proposal(env: &Env, id: u64, proposer: &Address) -> Proposal { - Proposal { - id, - action_hash: dummy_hash(env), - proposer: proposer.clone(), - approved_by: vec![env], - state: ProposalState::Pending, - } - } - - /// Read a proposal back from persistent storage using the hex-encoded key. - fn get_proposal(env: &Env, id: u64) -> (Proposal, u32) { - let key = Symbol::new(env, &format!("P{:x}", id)); - env.storage().persistent().get(&key).unwrap() - } - - fn init_one(env: &Env, signer: &Address, min_stake: i128) -> (Address, Address) { - let cid = register_contract(env); - let token = register_token(env); - env.as_contract(&cid, || { - governance::init(env, vec![env, signer.clone()], 1, token.clone(), min_stake); - }); - (cid, token) - } - - fn init_two(env: &Env, a: &Address, b: &Address) -> Address { - let cid = register_contract(env); - env.as_contract(&cid, || { - governance::init( - env, - vec![env, a.clone(), b.clone()], - 2, - register_token(env), - 0, - ); - }); - cid - } - - // ── state transitions ───────────────────────────────────────────────── + const TIMELOCK_LEDGERS: u32 = 720; #[test] - fn test_state_transition_approved_to_executed() { + fn test_proposal_lifecycle_and_upgrade() { let env = Env::default(); - env.mock_all_auths(); - let s1 = Address::generate(&env); - let (cid, _) = init_one(&env, &s1, 0); - env.as_contract(&cid, || { - let id = governance::propose(&env, &s1, dummy_hash(&env), 1000); - governance::approve(&env, &s1, id); - env.ledger().with_mut(|l| l.sequence_number += 721); - let executed_prop = governance::execute(&env, id); - assert_eq!(executed_prop.state, ProposalState::Executed); - }); - } - - #[test] - fn test_auto_execute_on_approve_after_timelock() { - let env = Env::default(); - env.mock_all_auths(); - let s1 = Address::generate(&env); - let (cid, _) = init_one(&env, &s1, 0); + let contract_id = env.register_contract(None, VeroCore); + let client = VeroCoreClient::new(&env, &contract_id); - env.as_contract(&cid, || { - let id = governance::propose(&env, &s1, dummy_hash(&env), 1000); - let id = governance::propose(&env, make_proposal(&env, 2, &s1)); - env.ledger().with_mut(|l| l.sequence_number += 2000); - governance::approve(&env, &s1, id); + let signer1 =
::generate(&env); + let signer2 =
::generate(&env); + let signers = vec![&env, signer1.clone(), signer2.clone()]; + let threshold = 2; + let guardian =
::generate(&env); - let (prop, _) = get_proposal(&env, id); - assert_eq!(prop.state, ProposalState::Executed); - }); - } - - // ── anti-Sybil stake gate ───────────────────────────────────────────── + client.init(&signers, &threshold, &vec![&env, guardian.clone()]); - #[test] - fn test_approve_passes_with_sufficient_stake() { - let env = Env::default(); - env.mock_all_auths(); - let signer = Address::generate(&env); - let (cid, token) = init_one(&env, &signer, 1_000); - fund(&env, &token, &signer, 1_000); + let wasm_hash = BytesN::from_array(&env, &[1u8; 32]); - env.as_contract(&cid, || { - let id = governance::propose(&env, &signer, dummy_hash(&env), 1000); - governance::approve(&env, &signer, id); - let (prop, _) = get_proposal(&env, id); - assert_eq!(prop.state, ProposalState::Approved); - }); - } - - #[test] - #[should_panic(expected = "Error(Contract, #6)")] - fn test_approve_fails_with_insufficient_stake() { - let env = Env::default(); - env.mock_all_auths(); - let signer = Address::generate(&env); - let (cid, token) = init_one(&env, &signer, 1_000); - fund(&env, &token, &signer, 999); - - env.as_contract(&cid, || { - let id = governance::propose(&env, &signer, dummy_hash(&env), 1000); - let id = governance::propose(&env, make_proposal(&env, 1, &signer)); - governance::approve(&env, &signer, id); - }); - } - - #[test] - fn test_stake_gate_disabled_when_min_stake_zero() { - let env = Env::default(); + // 1. Propose env.mock_all_auths(); - let signer = Address::generate(&env); - let (cid, _) = init_one(&env, &signer, 0); - - env.as_contract(&cid, || { - let id = governance::propose(&env, &signer, dummy_hash(&env), 1000); - governance::approve(&env, &signer, id); - let state = env - .storage() - .instance() - .get::<_, soroban_sdk::Map>( - &soroban_sdk::symbol_short!("PROPS"), - ) - .unwrap() - .get(id) - .unwrap() - .0 - .state; - assert_eq!(state, ProposalState::Approved); - }); + let proposal_id = client.propose(&signer1, &wasm_hash); + assert_eq!(proposal_id, 1); } - let id = governance::propose(&env, make_proposal(&env, 1, &signer)); - governance::approve(&env, &signer, id); - let (prop, _) = get_proposal(&env, id); - assert_eq!(prop.state, ProposalState::Approved); - }); - } - - // ── full lifecycle ──────────────────────────────────────────────────── - #[test] - fn test_full_lifecycle() { + fn upgrade_requires_quorum_before_timelock_or_wasm_update() { let env = Env::default(); env.mock_all_auths(); - let a = Address::generate(&env); - let b = Address::generate(&env); - let cid = init_two(&env, &a, &b); - env.as_contract(&cid, || { - let id = governance::propose(&env, &a, dummy_hash(&env), 1000); + let contract_id = env.register_contract(None, VeroCore); + let client = VeroCoreClient::new(&env, &contract_id); - governance::approve(&env, &a, id); - assert_eq!(get_proposal(&env, id).0.state, ProposalState::Pending); + let signer1 =
::generate(&env); + let signer2 =
::generate(&env); + let signer3 =
::generate(&env); + let signers = vec![&env, signer1.clone(), signer2.clone(), signer3.clone()]; + let threshold = 2; + client.init(&signers, &threshold, &vec![&env]); - governance::approve(&env, &b, id); - assert_eq!(get_proposal(&env, id).0.state, ProposalState::Approved); + let wasm_hash = BytesN::from_array(&env, &[7u8; 32]); + let proposal_id = client.propose(&signer1, &wasm_hash); - env.ledger().with_mut(|l| l.sequence_number += 721); - let prop = governance::execute(&env, id); - assert_eq!(prop.state, ProposalState::Executed); - }); - } + let no_signature_upgrade = client.try_upgrade(&proposal_id); + assert!(no_signature_upgrade.is_err()); - #[test] - #[should_panic(expected = "Error(Contract, #4)")] - fn test_execute_pending_proposal_rejected() { - let env = Env::default(); - env.mock_all_auths(); - let a = Address::generate(&env); - let cid = init_two(&env, &a, &Address::generate(&env)); + client.approve(&signer1, &proposal_id); + let one_signature_upgrade = client.try_upgrade(&proposal_id); + assert!(one_signature_upgrade.is_err()); - env.as_contract(&cid, || { - let id = governance::propose(&env, &a, dummy_hash(&env), 1000); - let id = governance::propose(&env, make_proposal(&env, 1, &a)); - governance::execute(&env, id); - }); + client.approve(&signer2, &proposal_id); + let timelocked_upgrade = client.try_upgrade(&proposal_id); + assert!(timelocked_upgrade.is_err()); } #[test] - #[should_panic(expected = "Error(Contract, #5)")] - fn test_execute_before_timelock_rejected() { + fn quorum_approved_proposal_reaches_wasm_update_after_timelock() { let env = Env::default(); env.mock_all_auths(); - let signer = Address::generate(&env); - let (cid, _) = init_one(&env, &signer, 0); - env.as_contract(&cid, || { - let id = governance::propose(&env, &signer, dummy_hash(&env), 1000); - let id = governance::propose(&env, make_proposal(&env, 1, &signer)); - governance::approve(&env, &signer, id); - governance::execute(&env, id); - }); - } + let contract_id = env.register_contract(None, VeroCore); + let client = VeroCoreClient::new(&env, &contract_id); - #[test] - #[should_panic] - fn test_duplicate_approval_rejected() { - let env = Env::default(); - env.mock_all_auths(); - let a = Address::generate(&env); - let cid = init_two(&env, &a, &Address::generate(&env)); + let signer1 =
::generate(&env); + let signer2 =
::generate(&env); + let signers = vec![&env, signer1.clone(), signer2.clone()]; + let threshold = 2; + client.init(&signers, &threshold, &vec![&env]); - env.as_contract(&cid, || { - let id = governance::propose(&env, &a, dummy_hash(&env), 1000); - governance::approve(&env, &a, id); - governance::approve(&env, &a, id); - governance::approve(&env, &a, id); - }); - } + let wasm_hash = BytesN::from_array(&env, &[9u8; 32]); + let proposal_id = client.propose(&signer1, &wasm_hash); + client.approve(&signer1, &proposal_id); + client.approve(&signer2, &proposal_id); - #[test] - #[should_panic(expected = "Error(Contract, #1)")] - fn test_non_signer_cannot_approve() { - let env = Env::default(); - env.mock_all_auths(); - let a = Address::generate(&env); - let outsider = Address::generate(&env); - let cid = init_two(&env, &a, &Address::generate(&env)); + env.ledger() + .set_sequence_number(env.ledger().sequence() + TIMELOCK_LEDGERS); - env.as_contract(&cid, || { - let id = governance::propose(&env, &a, dummy_hash(&env), 1000); - governance::approve(&env, &outsider, id); - let id = governance::propose(&env, make_proposal(&env, 1, &a)); - governance::approve(&env, &outsider, id); - }); + // The bogus WASM hash should only be reached after quorum and timelock + // validation pass, proving a single signer cannot trigger this path. + let reached_wasm_update = client.try_upgrade(&proposal_id); + assert!(reached_wasm_update.is_err()); } - // ── cancel / revert ─────────────────────────────────────────────────── - #[test] - fn test_cancel_pending_proposal() { + #[should_panic(expected = "Error(Contract, #1)")] // NotASigner + fn test_propose_unauthorized() { let env = Env::default(); env.mock_all_auths(); - let s1 = Address::generate(&env); - let (cid, _) = init_one(&env, &s1, 0); + let contract_id = env.register_contract(None, VeroCore); + let client = VeroCoreClient::new(&env, &contract_id); - env.as_contract(&cid, || { - let id = governance::propose(&env, make_proposal(&env, 1, &s1)); - let prop = governance::cancel(&env, &s1, id); - assert_eq!(prop.state, ProposalState::Cancelled); + let signer1 =
::generate(&env); + let signers = vec![&env, signer1.clone()]; + client.init(&signers, &1, &vec![&env]); - // The stored proposal is the cancelled (terminal) one. - let stored = env - .storage() - .instance() - .get::<_, soroban_sdk::Map>( - &soroban_sdk::symbol_short!("PROPS"), - ) - .unwrap() - .get(id) - .unwrap() - .0 - .state; - assert_eq!(stored, ProposalState::Cancelled); - }); + let rogue =
::generate(&env); + client.propose(&rogue, &BytesN::from_array(&env, &[0u8; 32])); } #[test] - fn test_cancel_before_threshold_by_other_signer() { + fn test_circuit_breaker_halts_propose() { let env = Env::default(); env.mock_all_auths(); - let a = Address::generate(&env); - let b = Address::generate(&env); - let cid = init_two(&env, &a, &b); // threshold = 2 + let contract_id = env.register_contract(None, VeroCore); + let client = VeroCoreClient::new(&env, &contract_id); - env.as_contract(&cid, || { - let id = governance::propose(&env, make_proposal(&env, 1, &a)); - governance::approve(&env, &a, id); // still Pending (1 of 2) - let prop = governance::cancel(&env, &b, id); - assert_eq!(prop.state, ProposalState::Cancelled); - }); - } + let signer1 =
::generate(&env); + let guardian =
::generate(&env); + let signers = vec![&env, signer1.clone()]; + client.init(&signers, &1, &vec![&env, guardian.clone()]); - #[test] - #[should_panic(expected = "Error(Contract, #6)")] - fn test_cannot_cancel_executed_proposal() { - let env = Env::default(); - env.mock_all_auths(); - let s1 = Address::generate(&env); - let (cid, _) = init_one(&env, &s1, 0); - - env.as_contract(&cid, || { - let id = governance::propose(&env, make_proposal(&env, 1, &s1)); - governance::approve(&env, &s1, id); // → Approved - env.ledger().with_mut(|l| l.sequence_number += 721); - governance::execute(&env, id); // → Executed - governance::cancel(&env, &s1, id); // AlreadyExecuted = 6 - }); - } - - #[test] - #[should_panic(expected = "Error(Contract, #5)")] - fn test_cannot_cancel_twice() { - let env = Env::default(); - env.mock_all_auths(); - let a = Address::generate(&env); - let b = Address::generate(&env); - let cid = init_two(&env, &a, &b); - - env.as_contract(&cid, || { - let id = governance::propose(&env, make_proposal(&env, 1, &a)); - governance::cancel(&env, &a, id); // → Cancelled - governance::cancel(&env, &b, id); // InvalidStateTransition = 5 - }); - } + client.trip(&guardian); - #[test] - #[should_panic(expected = "Error(Contract, #1)")] - fn test_non_signer_cannot_cancel() { - let env = Env::default(); - env.mock_all_auths(); - let a = Address::generate(&env); - let outsider = Address::generate(&env); - let cid = init_two(&env, &a, &Address::generate(&env)); - - env.as_contract(&cid, || { - let id = governance::propose(&env, make_proposal(&env, 1, &a)); - governance::cancel(&env, &outsider, id); // NotASigner = 1 - }); - } - - #[test] - #[should_panic(expected = "Error(Contract, #5)")] - fn test_cannot_approve_cancelled_proposal() { - let env = Env::default(); - env.mock_all_auths(); - let a = Address::generate(&env); - let b = Address::generate(&env); - let cid = init_two(&env, &a, &b); + let result = client.try_propose(&signer1, &BytesN::from_array(&env, &[0u8; 32])); + assert!(result.is_err()); - env.as_contract(&cid, || { - let id = governance::propose(&env, make_proposal(&env, 1, &a)); - governance::cancel(&env, &a, id); // → Cancelled - governance::approve(&env, &b, id); // InvalidStateTransition = 5 - }); + client.reset(&guardian); + let id = client.propose(&signer1, &BytesN::from_array(&env, &[0u8; 32])); + assert_eq!(id, 1); } } diff --git a/engine-core/src/lib.rs b/engine-core/src/lib.rs index f9a0891..3d61e77 100644 --- a/engine-core/src/lib.rs +++ b/engine-core/src/lib.rs @@ -1,18 +1,78 @@ -#![no_std] -extern crate alloc; +use soroban_sdk::{contract, contractimpl, symbol_short, Address, Bytes, BytesN, Env, Symbol, Vec}; + pub mod audit; -pub mod governance; pub mod circuit_breaker; -pub mod treasury; -pub mod burn; -pub mod emergency_recovery; -pub mod protocol_fee; +pub mod governance; pub mod types; -pub mod version; -pub mod event_struct; -pub mod event_utils; #[cfg(test)] mod governance_tests; -#[cfg(test)] -mod treasury_tests; + +const KEY_INIT: Symbol = symbol_short!("INIT"); + +use crate::types::{Proposal, StateCommitment}; + +#[contract] +pub struct VeroCore; + +#[contractimpl] +impl VeroCore { + /// Initialise the Vero Protocol engine. + pub fn init(env: Env, signers: Vec
, threshold: u32, guardians: Vec
) { + if env.storage().instance().has(&KEY_INIT) { + panic!("Already initialized"); + } + env.storage().instance().set(&KEY_INIT, &true); + + governance::init(&env, signers, threshold); + circuit_breaker::init(&env, guardians); + } + + /// Trip the breaker — halts the engine. Requires guardian auth. + pub fn trip(env: Env, guardian: Address) { + guardian.require_auth(); + circuit_breaker::trip(&env, &guardian); + } + + /// Reset the breaker — resumes normal operation. Requires guardian auth. + pub fn reset(env: Env, guardian: Address) { + guardian.require_auth(); + circuit_breaker::reset(&env, &guardian); + } + + /// Submit a new governance proposal. + pub fn propose(env: Env, proposer: Address, action_hash: BytesN<32>) -> u64 { + circuit_breaker::assert_closed(&env); + proposer.require_auth(); + let proposal = Proposal { + id: 0, // Assigned by governance module + action_hash, + proposer, + approved_by: Vec::new(&env), + state: types::ProposalState::Pending, + }; + governance::propose(&env, proposal) + } + + /// Record a signer's approval for `proposal_id`. + pub fn approve(env: Env, signer: Address, proposal_id: u64) { + circuit_breaker::assert_closed(&env); + signer.require_auth(); + governance::approve(&env, &signer, proposal_id); + } + + /// Execute a contract upgrade proposal. + pub fn upgrade(env: Env, proposal_id: u64) { + circuit_breaker::assert_closed(&env); + let prop = governance::execute(&env, proposal_id); + env.deployer() + .update_current_contract_wasm(prop.action_hash); + } + + /// Validate and record a new state transition. + pub fn commit(env: Env, commitment: StateCommitment, payload: Bytes) { + circuit_breaker::assert_closed(&env); + commitment.author.require_auth(); + audit::validate_transition(&env, &commitment, &payload); + } +} diff --git a/engine-core/src/types.rs b/engine-core/src/types.rs index f7067bf..a5fe99d 100644 --- a/engine-core/src/types.rs +++ b/engine-core/src/types.rs @@ -1,16 +1,18 @@ use soroban_sdk::{contracttype, contracterror, Address, BytesN, Map, String, Symbol, Val}; use soroban_sdk::{contracttype, contracterror, Address, BytesN, Map, Symbol, Val}; -#[contracterror] -#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -pub enum TreasuryError { - InvalidBalance = 1, -} - -#[contracterror] -#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -pub enum BurnError { - ZeroAddress = 1, +/// Canonical state snapshot committed to a ZK audit cycle. +#[contracttype] +#[derive(Clone, Debug)] +pub struct StateCommitment { + /// SHA-256 of serialised state payload (32 bytes). + pub state_hash: BytesN<32>, + /// Sequence number — monotonically increasing, prevents replay. + pub sequence: u64, + /// Ledger at which this commitment was recorded. + pub ledger: u32, + /// Signer that produced this commitment. + pub author: Address, } /// Proposal lifecycle states — stored as u32 bitmask-friendly variant. @@ -83,17 +85,10 @@ pub struct TreasurySnapshot { #[derive(Clone, Debug, Eq, PartialEq)] pub struct Proposal { pub id: u64, - pub proposer: soroban_sdk::Address, - pub action_hash: soroban_sdk::BytesN<32>, - pub approved_by: soroban_sdk::Vec, + pub action_hash: BytesN<32>, + pub proposer: Address, + pub approved_by: soroban_sdk::Vec
, pub state: ProposalState, - pub voting_deadline: u32, - pub id: u64, - pub proposer: Address, - pub action_hash: BytesN<32>, - /// Accumulated approvals — bounded by the signer set size. - pub approved_by: soroban_sdk::Vec
, - pub state: ProposalState, } /// Treasury snapshot — compact representation for audit history. @@ -106,18 +101,8 @@ pub struct Proposal { /// `context` is kept as a `Map` for extensibility but callers /// should pass minimal maps to limit storage cost. #[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct TreasurySnapshot { - pub id: u64, - pub total_balance: i128, - pub account_count: u32, - /// Ledger sequence at snapshot time. - pub ledger: u32, - /// UNIX timestamp at snapshot time (seconds since epoch). - pub timestamp_unix: u64, - pub state_hash: BytesN<32>, - /// Trigger classification — replaces the freeform `triggered_by: String`. - pub trigger: TriggerKind, - /// Optional small context map. Prefer empty maps when not needed. - pub context: Map, +#[derive(Clone, Debug, PartialEq)] +pub enum BreakerState { + Closed, // normal operation + Open, // halted — no state transitions allowed } 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 758830a..b59e9d3 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 @@ -1,9 +1,67 @@ { "generators": { - "address": 2, + "address": 3, "nonce": 0 }, - "auth": [], + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "commit", + "args": [ + { + "map": [ + { + "key": { + "symbol": "author" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "sequence" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "state_hash" + }, + "val": { + "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" + } + } + ] + }, + { + "bytes": "7061796c6f6164" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -17,7 +75,7 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": "ledger_key_contract_instance", "durability": "persistent" } @@ -28,7 +86,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { @@ -36,7 +94,88 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "symbol": "CB_GUARD" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "CB_STATE" + }, + "val": { + "vec": [ + { + "symbol": "Closed" + } + ] + } + }, + { + "key": { + "symbol": "INIT" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "NEXT_ID" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "PREV_H" + }, + "val": { + "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [] + } + }, + { + "key": { + "symbol": "SEQ" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] } } } @@ -46,6 +185,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": { @@ -73,13 +245,77 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", - "type_": "contract", + "contract_id": null, + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "AUDIT" + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "init" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + { + "u32": 1 + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" }, { "symbol": "commit" @@ -88,10 +324,43 @@ "data": { "vec": [ { - "u64": 1 + "map": [ + { + "key": { + "symbol": "author" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "sequence" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "state_hash" + }, + "val": { + "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" + } + } + ] }, { - "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" + "bytes": "7061796c6f6164" } ] } @@ -103,60 +372,112 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "EVENT" + "symbol": "AUDIT" }, { - "symbol": "LOG" + "symbol": "commit" } ], "data": { - "map": [ + "vec": [ { - "key": { - "symbol": "action" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } + "u64": 1 }, { - "key": { - "symbol": "event_type" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, + "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "commit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "commit" + } + ], + "data": { + "vec": [ { - "key": { - "symbol": "payload" - }, - "val": { - "map": [ - { - "key": { - "symbol": "hash" - }, - "val": { - "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" - } + "map": [ + { + "key": { + "symbol": "author" }, - { - "key": { - "symbol": "seq" - }, - "val": { - "u64": 1 - } + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } - ] - } + }, + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "sequence" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "state_hash" + }, + "val": { + "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" + } + } + ] + }, + { + "bytes": "7061796c6f6164" } ] } @@ -168,7 +489,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", "type_": "diagnostic", "body": { "v0": { @@ -195,12 +516,137 @@ } } }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "commit" + }, + { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "author" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "sequence" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "state_hash" + }, + "val": { + "bytes": "9dcbcf21a5a9d8a551075709cee7265d2abfe3225ee3646c7b12dcf93b79fd4e" + } + } + ] + }, + { + "bytes": "7061796c6f6164" + } + ] + } + ] + } + } + } + }, "failed_call": false }, { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { 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 d64cc4b..efd67a9 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 @@ -1,10 +1,65 @@ { "generators": { - "address": 2, + "address": 3, "nonce": 0 }, "auth": [ - [] + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "commit", + "args": [ + { + "map": [ + { + "key": { + "symbol": "author" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "sequence" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "state_hash" + }, + "val": { + "bytes": "31b5ccceb7b2eece59647ed1c647b5cd692422ef2e6043a4b514677cf35cfbb9" + } + } + ] + }, + { + "bytes": "73746174655f7061796c6f61645f7631" + } + ] + } + }, + "sub_invocations": [] + } + ] + ] ], "ledger": { "protocol_version": 21, @@ -19,7 +74,7 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": "ledger_key_contract_instance", "durability": "persistent" } @@ -30,7 +85,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { @@ -39,6 +94,42 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "symbol": "CB_GUARD" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "CB_STATE" + }, + "val": { + "vec": [ + { + "symbol": "Closed" + } + ] + } + }, + { + "key": { + "symbol": "INIT" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "NEXT_ID" + }, + "val": { + "u64": 1 + } + }, { "key": { "symbol": "PREV_H" @@ -47,6 +138,14 @@ "bytes": "31b5ccceb7b2eece59647ed1c647b5cd692422ef2e6043a4b514677cf35cfbb9" } }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [] + } + }, { "key": { "symbol": "SEQ" @@ -54,6 +153,26 @@ "val": { "u64": 1 } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } } ] } @@ -65,6 +184,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": { @@ -92,25 +244,35 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", - "type_": "contract", + "contract_id": null, + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "AUDIT" + "symbol": "fn_call" }, { - "symbol": "commit" + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "init" } ], "data": { "vec": [ { - "u64": 1 + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] }, { - "bytes": "31b5ccceb7b2eece59647ed1c647b5cd692422ef2e6043a4b514677cf35cfbb9" + "u32": 1 + }, + { + "vec": [] } ] } @@ -122,60 +284,112 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", - "type_": "contract", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "EVENT" + "symbol": "fn_return" }, { - "symbol": "LOG" + "symbol": "init" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "commit" } ], "data": { - "map": [ + "vec": [ { - "key": { - "symbol": "action" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } + "map": [ + { + "key": { + "symbol": "author" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "ledger" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "sequence" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "state_hash" + }, + "val": { + "bytes": "31b5ccceb7b2eece59647ed1c647b5cd692422ef2e6043a4b514677cf35cfbb9" + } + } + ] }, { - "key": { - "symbol": "event_type" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } + "bytes": "73746174655f7061796c6f61645f7631" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "AUDIT" + }, + { + "symbol": "commit" + } + ], + "data": { + "vec": [ + { + "u64": 1 }, { - "key": { - "symbol": "payload" - }, - "val": { - "map": [ - { - "key": { - "symbol": "hash" - }, - "val": { - "bytes": "31b5ccceb7b2eece59647ed1c647b5cd692422ef2e6043a4b514677cf35cfbb9" - } - }, - { - "key": { - "symbol": "seq" - }, - "val": { - "u64": 1 - } - } - ] - } + "bytes": "31b5ccceb7b2eece59647ed1c647b5cd692422ef2e6043a4b514677cf35cfbb9" } ] } @@ -183,6 +397,27 @@ } }, "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "commit" + } + ], + "data": "void" + } + } + }, + "failed_call": false } ] } \ No newline at end of file diff --git a/engine-core/test_snapshots/circuit_breaker/tests/non_guardian_cannot_trip.1.json b/engine-core/test_snapshots/circuit_breaker/tests/non_guardian_cannot_trip.1.json index f821c6e..741a909 100644 --- a/engine-core/test_snapshots/circuit_breaker/tests/non_guardian_cannot_trip.1.json +++ b/engine-core/test_snapshots/circuit_breaker/tests/non_guardian_cannot_trip.1.json @@ -1,9 +1,12 @@ { "generators": { - "address": 3, + "address": 4, "nonce": 0 }, - "auth": [], + "auth": [ + [], + [] + ], "ledger": { "protocol_version": 21, "sequence_number": 0, @@ -17,40 +20,7 @@ [ { "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", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": "ledger_key_contract_instance", "durability": "persistent" } @@ -61,7 +31,7 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { @@ -69,7 +39,76 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": null + "storage": [ + { + "key": { + "symbol": "CB_GUARD" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "CB_STATE" + }, + "val": { + "vec": [ + { + "symbol": "Closed" + } + ] + } + }, + { + "key": { + "symbol": "INIT" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "NEXT_ID" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] } } } @@ -106,7 +145,98 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "init" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "u32": 1 + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "trip" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", "type_": "diagnostic", "body": { "v0": { @@ -133,12 +263,101 @@ } } }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 2 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 2 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 2 + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "trip" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + ] + } + } + } + }, "failed_call": false }, { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { 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 6f55362..cd2a04f 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 @@ -1,19 +1,23 @@ { "generators": { - "address": 2, + "address": 3, "nonce": 0 }, "auth": [ [], [ [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", { "function": { "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "function_name": "", - "args": [] + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "trip", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] } }, "sub_invocations": [] @@ -22,13 +26,17 @@ ], [ [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", { "function": { "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "function_name": "", - "args": [] + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "reset", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] } }, "sub_invocations": [] @@ -50,12 +58,8 @@ { "contract_data": { "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 801925984706572462 - } - }, - "durability": "temporary" + "key": "ledger_key_contract_instance", + "durability": "persistent" } }, [ @@ -65,27 +69,99 @@ "contract_data": { "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 801925984706572462 + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "CB_GUARD" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "CB_STATE" + }, + "val": { + "vec": [ + { + "symbol": "Closed" + } + ] + } + }, + { + "key": { + "symbol": "INIT" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "NEXT_ID" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] } - }, - "durability": "temporary", - "val": "void" + } } }, "ext": "v0" }, - 6311999 + 4095 ] ], [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 801925984706572462 } }, "durability": "temporary" @@ -97,10 +173,10 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 801925984706572462 } }, "durability": "temporary", @@ -116,8 +192,12 @@ { "contract_data": { "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": "ledger_key_contract_instance", - "durability": "persistent" + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" } }, [ @@ -127,42 +207,18 @@ "contract_data": { "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": "ledger_key_contract_instance", - "durability": "persistent", - "val": { - "contract_instance": { - "executable": { - "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - "storage": [ - { - "key": { - "symbol": "CB_GUARD" - }, - "val": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - ] - } - }, - { - "key": { - "symbol": "CB_STATE" - }, - "val": { - "u32": 0 - } - } - ] + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 } - } + }, + "durability": "temporary", + "val": "void" } }, "ext": "v0" }, - 4095 + 6311999 ] ], [ @@ -192,20 +248,41 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", - "type_": "contract", + "contract_id": null, + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "CB" + "symbol": "fn_call" }, { - "symbol": "tripped" + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "init" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + { + "u32": 1 + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + ] } } } @@ -215,54 +292,44 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", - "type_": "contract", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "EVENT" + "symbol": "fn_return" }, { - "symbol": "LOG" + "symbol": "init" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "trip" } ], "data": { - "map": [ - { - "key": { - "symbol": "action" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - { - "key": { - "symbol": "event_type" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - { - "key": { - "symbol": "payload" - }, - "val": { - "map": [ - { - "key": { - "symbol": "guardian" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - ] - } - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } } } @@ -272,7 +339,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", "type_": "contract", "body": { "v0": { @@ -280,12 +347,59 @@ { "symbol": "CB" }, + { + "symbol": "tripped" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "trip" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, { "symbol": "reset" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } } } @@ -295,59 +409,46 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "EVENT" + "symbol": "CB" }, { - "symbol": "LOG" + "symbol": "reset" } ], "data": { - "map": [ - { - "key": { - "symbol": "action" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - { - "key": { - "symbol": "event_type" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000000" - } - }, - { - "key": { - "symbol": "payload" - }, - "val": { - "map": [ - { - "key": { - "symbol": "guardian" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - ] - } - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } } } }, "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "reset" + } + ], + "data": "void" + } + } + }, + "failed_call": false } ] } \ No newline at end of file diff --git a/engine-core/test_snapshots/governance_tests/tests/quorum_approved_proposal_reaches_wasm_update_after_timelock.1.json b/engine-core/test_snapshots/governance_tests/tests/quorum_approved_proposal_reaches_wasm_update_after_timelock.1.json new file mode 100644 index 0000000..5ac8946 --- /dev/null +++ b/engine-core/test_snapshots/governance_tests/tests/quorum_approved_proposal_reaches_wasm_update_after_timelock.1.json @@ -0,0 +1,818 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "propose", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0909090909090909090909090909090909090909090909090909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 720, + "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": "CB_GUARD" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "CB_STATE" + }, + "val": { + "vec": [ + { + "symbol": "Closed" + } + ] + } + }, + { + "key": { + "symbol": "INIT" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "NEXT_ID" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [ + { + "key": { + "u64": 1 + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "action_hash" + }, + "val": { + "bytes": "0909090909090909090909090909090909090909090909090909090909090909" + } + }, + { + "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": "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_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "init" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + { + "u32": 2 + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "propose" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0909090909090909090909090909090909090909090909090909090909090909" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "GOV" + }, + { + "symbol": "propose" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "propose" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "GOV" + }, + { + "symbol": "approved" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "upgrade" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "GOV" + }, + { + "symbol": "execute" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "storage": "missing_value" + } + } + ], + "data": { + "vec": [ + { + "string": "Wasm does not exist" + }, + { + "bytes": "0909090909090909090909090909090909090909090909090909090909090909" + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "storage": "missing_value" + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "storage": "missing_value" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "storage": "missing_value" + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "upgrade" + }, + { + "vec": [ + { + "u64": 1 + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/governance_tests/tests/test_circuit_breaker_halts_propose.1.json b/engine-core/test_snapshots/governance_tests/tests/test_circuit_breaker_halts_propose.1.json new file mode 100644 index 0000000..a21e737 --- /dev/null +++ b/engine-core/test_snapshots/governance_tests/tests/test_circuit_breaker_halts_propose.1.json @@ -0,0 +1,803 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "trip", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "reset", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "propose", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "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": "CB_GUARD" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "symbol": "CB_STATE" + }, + "val": { + "vec": [ + { + "symbol": "Closed" + } + ] + } + }, + { + "key": { + "symbol": "INIT" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "NEXT_ID" + }, + "val": { + "u64": 2 + } + }, + { + "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": 720 + } + ] + } + } + ] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "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": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "init" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + { + "u32": 1 + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "trip" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "CB" + }, + { + "symbol": "tripped" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "trip" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "propose" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + } + } + }, + "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": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "propose" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "reset" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "CB" + }, + { + "symbol": "reset" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "reset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "propose" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "GOV" + }, + { + "symbol": "propose" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "propose" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/governance_tests/tests/test_proposal_lifecycle_and_upgrade.1.json b/engine-core/test_snapshots/governance_tests/tests/test_proposal_lifecycle_and_upgrade.1.json new file mode 100644 index 0000000..c6884b4 --- /dev/null +++ b/engine-core/test_snapshots/governance_tests/tests/test_proposal_lifecycle_and_upgrade.1.json @@ -0,0 +1,407 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "propose", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + ] + } + }, + "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": "CB_GUARD" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "CB_STATE" + }, + "val": { + "vec": [ + { + "symbol": "Closed" + } + ] + } + }, + { + "key": { + "symbol": "INIT" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "NEXT_ID" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [ + { + "key": { + "u64": 1 + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "action_hash" + }, + "val": { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + }, + { + "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": 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_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": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "init" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + { + "u32": 2 + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "propose" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "GOV" + }, + { + "symbol": "propose" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "propose" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/engine-core/test_snapshots/governance_tests/tests/test_propose_unauthorized.1.json b/engine-core/test_snapshots/governance_tests/tests/test_propose_unauthorized.1.json new file mode 100644 index 0000000..da6e697 --- /dev/null +++ b/engine-core/test_snapshots/governance_tests/tests/test_propose_unauthorized.1.json @@ -0,0 +1,385 @@ +{ + "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": "CB_GUARD" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "CB_STATE" + }, + "val": { + "vec": [ + { + "symbol": "Closed" + } + ] + } + }, + { + "key": { + "symbol": "INIT" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "NEXT_ID" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "PROPS" + }, + "val": { + "map": [] + } + }, + { + "key": { + "symbol": "SIGNERS" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + { + "key": { + "symbol": "THRESH" + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "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": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "init" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + { + "u32": 1 + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "propose" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + } + } + }, + "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": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 1 + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "propose" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "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/governance_tests/tests/upgrade_requires_quorum_before_timelock_or_wasm_update.1.json b/engine-core/test_snapshots/governance_tests/tests/upgrade_requires_quorum_before_timelock_or_wasm_update.1.json new file mode 100644 index 0000000..a727286 --- /dev/null +++ b/engine-core/test_snapshots/governance_tests/tests/upgrade_requires_quorum_before_timelock_or_wasm_update.1.json @@ -0,0 +1,1097 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "propose", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0707070707070707070707070707070707070707070707070707070707070707" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "approve", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 1 + } + ] + } + }, + "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": "CB_GUARD" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "CB_STATE" + }, + "val": { + "vec": [ + { + "symbol": "Closed" + } + ] + } + }, + { + "key": { + "symbol": "INIT" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "NEXT_ID" + }, + "val": { + "u64": 2 + } + }, + { + "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" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "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": "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_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "init" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "u32": 2 + }, + { + "vec": [] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "propose" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bytes": "0707070707070707070707070707070707070707070707070707070707070707" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "GOV" + }, + { + "symbol": "propose" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "propose" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "upgrade" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 3 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 3 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 3 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 3 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 3 + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "upgrade" + }, + { + "vec": [ + { + "u64": 1 + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "upgrade" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 3 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 3 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 3 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 3 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 3 + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "upgrade" + }, + { + "vec": [ + { + "u64": 1 + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "approve" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "GOV" + }, + { + "symbol": "approved" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "approve" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "upgrade" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 4 + } + } + ], + "data": { + "vec": [ + { + "string": "failing with contract error" + }, + { + "u32": 4 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 4 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 4 + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 4 + } + } + ], + "data": { + "vec": [ + { + "string": "contract try_call failed" + }, + { + "symbol": "upgrade" + }, + { + "vec": [ + { + "u64": 1 + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file