From 058c19616f68b6d34a4e63084d8abbd95b2609a2 Mon Sep 17 00:00:00 2001 From: Mawuli Ejere Date: Sat, 24 Oct 2026 11:58:22 +0100 Subject: [PATCH 1/3] feat(secondary-trade-history): add secondary market price history contract (#642) --- Cargo.lock | 77 + Cargo.toml | 3 + contracts/secondary-trade-history/Cargo.toml | 16 + .../secondary-trade-history/src/errors.rs | 24 + .../secondary-trade-history/src/events.rs | 23 + contracts/secondary-trade-history/src/lib.rs | 135 + .../secondary-trade-history/src/storage.rs | 68 + contracts/secondary-trade-history/src/test.rs | 233 + .../secondary-trade-history/src/types.rs | 27 + .../test/test_cannot_initialize_twice.1.json | 87 + ...get_last_price_fails_with_no_trades.1.json | 87 + ...test_get_price_history_newest_first.1.json | 343 + ...st_get_price_history_respects_limit.1.json | 495 + .../test_history_isolated_per_invoice.1.json | 296 + ...st_history_pruned_beyond_100_trades.1.json | 7956 +++++++++++++++++ ...est_initialize_rejects_zero_address.1.json | 62 + ..._initialize_sets_admin_and_recorder.1.json | 88 + ...est_record_trade_and_get_last_price.1.json | 268 + ...rd_trade_emits_trade_recorded_event.1.json | 224 + ...ejects_non_positive_price_or_amount.1.json | 89 + .../test/test_set_recorder_admin_only.1.json | 130 + 21 files changed, 10731 insertions(+) create mode 100644 contracts/secondary-trade-history/Cargo.toml create mode 100644 contracts/secondary-trade-history/src/errors.rs create mode 100644 contracts/secondary-trade-history/src/events.rs create mode 100644 contracts/secondary-trade-history/src/lib.rs create mode 100644 contracts/secondary-trade-history/src/storage.rs create mode 100644 contracts/secondary-trade-history/src/test.rs create mode 100644 contracts/secondary-trade-history/src/types.rs create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_cannot_initialize_twice.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_get_last_price_fails_with_no_trades.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_get_price_history_newest_first.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_get_price_history_respects_limit.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_history_isolated_per_invoice.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_history_pruned_beyond_100_trades.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_initialize_rejects_zero_address.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_initialize_sets_admin_and_recorder.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_record_trade_and_get_last_price.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_record_trade_emits_trade_recorded_event.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_record_trade_rejects_non_positive_price_or_amount.1.json create mode 100644 contracts/secondary-trade-history/test_snapshots/test/test_set_recorder_admin_only.1.json diff --git a/Cargo.lock b/Cargo.lock index 17a99f66..9aa43d8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,6 +9,13 @@ dependencies = [ "soroban-sdk 27.0.6", ] +[[package]] +name = "accreditation-renewal" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "addr2line" version = "0.25.1" @@ -1290,6 +1297,13 @@ dependencies = [ "soroban-sdk 27.0.6", ] +[[package]] +name = "investor-portfolio-health" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "investor-scoring" version = "0.1.0" @@ -1311,6 +1325,13 @@ dependencies = [ "soroban-sdk 27.0.6", ] +[[package]] +name = "invoice-co-investment-pool" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "invoice-escrow" version = "0.1.0" @@ -1321,6 +1342,20 @@ dependencies = [ "soroban-sdk 27.0.6", ] +[[package]] +name = "invoice-hardship-extension" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + +[[package]] +name = "invoice-issuer-verification" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "invoice-maturity" version = "0.1.0" @@ -1335,6 +1370,13 @@ dependencies = [ "soroban-sdk 27.0.6", ] +[[package]] +name = "invoice-performance-alert" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "invoice-pool" version = "0.1.0" @@ -1370,6 +1412,13 @@ dependencies = [ "soroban-sdk 27.0.6", ] +[[package]] +name = "invoice-tranche" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "itertools" version = "0.11.0" @@ -1698,6 +1747,13 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "portfolio-nav-snapshot" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "powerfmt" version = "0.2.1" @@ -1723,6 +1779,13 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "price-stabilisation" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -1990,6 +2053,13 @@ dependencies = [ "soroban-sdk 27.0.6", ] +[[package]] +name = "secondary-trade-history" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "semver" version = "1.0.28" @@ -2763,6 +2833,13 @@ dependencies = [ "winnow", ] +[[package]] +name = "treasury-management" +version = "0.1.0" +dependencies = [ + "soroban-sdk 27.0.6", +] + [[package]] name = "twap-oracle" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 5d54cae7..61e63c37 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ members = [ "contracts/invoice-amendment", "contracts/invoice-co-investment", "contracts/invoice-escrow", + "contracts/invoice-issuer-verification", "contracts/invoice-maturity", "contracts/invoice-metadata-registry", "contracts/invoice-pool", @@ -37,7 +38,9 @@ members = [ "contracts/partial-settlement", "contracts/payment-distributor", "contracts/secondary-market", + "contracts/secondary-trade-history", "contracts/staking-rewards", + "contracts/treasury-management", "contracts/twap-oracle", "contracts/price-stabilisation", "contracts/accreditation-renewal", diff --git a/contracts/secondary-trade-history/Cargo.toml b/contracts/secondary-trade-history/Cargo.toml new file mode 100644 index 00000000..ff999d08 --- /dev/null +++ b/contracts/secondary-trade-history/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "secondary-trade-history" +version = "0.1.0" +edition = "2021" +# Deployed as WASM, never published to crates.io. +publish = false +description = "StellarSettle secondary market trade price history contract" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +soroban-sdk = { workspace = true } + +[dev-dependencies] +soroban-sdk = { workspace = true, features = ["testutils"] } diff --git a/contracts/secondary-trade-history/src/errors.rs b/contracts/secondary-trade-history/src/errors.rs new file mode 100644 index 00000000..4d4ae8f1 --- /dev/null +++ b/contracts/secondary-trade-history/src/errors.rs @@ -0,0 +1,24 @@ +//! Error types for the secondary market trade history contract. + +use soroban_sdk::contracterror; + +/// Errors that can occur during contract execution. +#[contracterror] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[repr(u32)] +pub enum Error { + /// Contract has already been initialized. + AlreadyInit = 1, + /// Contract has not been initialized. + NotInit = 2, + /// Caller is not the admin. + Unauthorized = 3, + /// Address is the zero address (all-zero 32-byte key). + InvalidAddress = 4, + /// price or amount must be strictly positive. + InvalidTrade = 5, + /// Caller is not the authorized recorder. + NotRecorder = 6, + /// No trade has ever been recorded for this invoice. + NoTrades = 7, +} diff --git a/contracts/secondary-trade-history/src/events.rs b/contracts/secondary-trade-history/src/events.rs new file mode 100644 index 00000000..59dac93e --- /dev/null +++ b/contracts/secondary-trade-history/src/events.rs @@ -0,0 +1,23 @@ +#![allow(deprecated)] +//! Events emitted by the secondary market trade history contract. + +use soroban_sdk::{BytesN, Env, Symbol}; + +/// Emitted when the contract is initialized. +pub fn initialized(env: &Env, admin: &soroban_sdk::Address) { + let topics = (Symbol::new(env, "initialized"),); + env.events().publish(topics, admin.clone()); +} + +/// Emitted each time a trade is recorded. +/// Topics: (TradeRecorded, invoice_id); Data: (price, amount, timestamp). +pub fn trade_recorded( + env: &Env, + invoice_id: &BytesN<32>, + price: i128, + amount: i128, + timestamp: u64, +) { + let topics = (Symbol::new(env, "TradeRecorded"), invoice_id.clone()); + env.events().publish(topics, (price, amount, timestamp)); +} diff --git a/contracts/secondary-trade-history/src/lib.rs b/contracts/secondary-trade-history/src/lib.rs new file mode 100644 index 00000000..0cb41743 --- /dev/null +++ b/contracts/secondary-trade-history/src/lib.rs @@ -0,0 +1,135 @@ +//! Secondary market trade price history contract for StellarSettle. +//! +//! Records each executed secondary market trade price for an invoice's +//! fractions on-chain, enabling on-chain price discovery and chart data +//! for the backend without relying solely on event indexing. +//! +//! `record_trade` is restricted to a single authorized recorder address +//! (set at deploy time, normally the secondary-market contract itself), +//! since an unrestricted writer would let anyone inject fabricated trade +//! prices that corrupt the price history this contract exists to provide. + +#![no_std] + +mod errors; +mod events; +mod storage; +mod types; + +pub use types::TradeRecord; + +use soroban_sdk::{contract, contractimpl, Address, BytesN, Env, String, Vec}; + +use errors::Error; + +/// Reject the zero address (all-zero 32-byte Ed25519 key). +fn ensure_non_zero_address(env: &Env, address: &Address) -> Result<(), Error> { + let zero_str = String::from_str( + env, + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", + ); + let zero = Address::from_string(&zero_str); + if *address == zero { + return Err(Error::InvalidAddress); + } + Ok(()) +} + +#[contract] +pub struct SecondaryTradeHistory; + +#[contractimpl] +impl SecondaryTradeHistory { + /// Initialize the contract with the admin (allowed to change the + /// recorder) and the initial recorder address (normally the deployed + /// secondary-market contract's address). + pub fn initialize(env: Env, admin: Address, recorder: Address) -> Result<(), Error> { + ensure_non_zero_address(&env, &admin)?; + ensure_non_zero_address(&env, &recorder)?; + if storage::get_admin(&env).is_some() { + return Err(Error::AlreadyInit); + } + storage::set_admin(&env, &admin); + storage::set_recorder(&env, &recorder); + events::initialized(&env, &admin); + Ok(()) + } + + /// Admin-only: change the authorized recorder address, e.g. after + /// redeploying the secondary-market contract. + pub fn set_recorder(env: Env, admin: Address, recorder: Address) -> Result<(), Error> { + let stored_admin = storage::get_admin(&env).ok_or(Error::NotInit)?; + if admin != stored_admin { + return Err(Error::Unauthorized); + } + admin.require_auth(); + ensure_non_zero_address(&env, &recorder)?; + storage::set_recorder(&env, &recorder); + Ok(()) + } + + /// Recorder-only: record one executed trade for `invoice_id`. Storage + /// is pruned to the most recent 100 trades per invoice; the oldest is + /// dropped on overflow. + pub fn record_trade( + env: Env, + invoice_id: BytesN<32>, + price: i128, + amount: i128, + timestamp: u64, + ) -> Result<(), Error> { + let recorder = storage::get_recorder(&env).ok_or(Error::NotInit)?; + recorder.require_auth(); + + if price <= 0 || amount <= 0 { + return Err(Error::InvalidTrade); + } + + storage::push_trade( + &env, + &invoice_id, + TradeRecord { + price, + amount, + timestamp, + }, + ); + events::trade_recorded(&env, &invoice_id, price, amount, timestamp); + Ok(()) + } + + /// View: return up to `limit` of `invoice_id`'s most recent trades, + /// newest first. `limit` is clamped to the number of trades actually + /// stored (and to the 100-trade retention cap). + pub fn get_price_history(env: Env, invoice_id: BytesN<32>, limit: u32) -> Vec { + let history = storage::get_history(&env, &invoice_id); + let take = core::cmp::min(limit, history.len()); + let mut result = Vec::new(&env); + for i in 0..take { + result.push_back(history.get(i).unwrap()); + } + result + } + + /// View: return the most recent trade price for `invoice_id`. + pub fn get_last_price(env: Env, invoice_id: BytesN<32>) -> Result { + let history = storage::get_history(&env, &invoice_id); + history + .get(0) + .map(|record| record.price) + .ok_or(Error::NoTrades) + } + + /// View: return the current admin. + pub fn get_admin(env: Env) -> Result { + storage::get_admin(&env).ok_or(Error::NotInit) + } + + /// View: return the current authorized recorder. + pub fn get_recorder(env: Env) -> Result { + storage::get_recorder(&env).ok_or(Error::NotInit) + } +} + +#[cfg(test)] +mod test; diff --git a/contracts/secondary-trade-history/src/storage.rs b/contracts/secondary-trade-history/src/storage.rs new file mode 100644 index 00000000..aacb7b37 --- /dev/null +++ b/contracts/secondary-trade-history/src/storage.rs @@ -0,0 +1,68 @@ +//! Storage helpers for the secondary market trade history contract. + +use soroban_sdk::{Address, BytesN, Env, Vec}; + +use crate::types::{StorageKey, TradeRecord}; + +/// Maximum trades retained per invoice; the oldest is pruned on overflow. +pub const MAX_TRADES: u32 = 100; + +/// Ledgers below which a persistent entry's TTL is extended (~7 days at 5s/ledger). +pub const TTL_THRESHOLD: u32 = 120_960; +/// Minimum TTL extension in ledger units (~60 days at 5s/ledger). +pub const MIN_TTL_EXTEND: u32 = 1_036_800; + +pub fn set_admin(env: &Env, admin: &Address) { + env.storage().instance().set(&StorageKey::Admin, admin); + env.storage() + .instance() + .extend_ttl(TTL_THRESHOLD, MIN_TTL_EXTEND); +} + +pub fn get_admin(env: &Env) -> Option
{ + env.storage() + .instance() + .extend_ttl(TTL_THRESHOLD, MIN_TTL_EXTEND); + env.storage().instance().get(&StorageKey::Admin) +} + +pub fn set_recorder(env: &Env, recorder: &Address) { + env.storage() + .instance() + .set(&StorageKey::Recorder, recorder); + env.storage() + .instance() + .extend_ttl(TTL_THRESHOLD, MIN_TTL_EXTEND); +} + +pub fn get_recorder(env: &Env) -> Option
{ + env.storage().instance().get(&StorageKey::Recorder) +} + +/// Load an invoice's trade history, newest trade first. Empty `Vec` if +/// no trade has ever been recorded. +pub fn get_history(env: &Env, invoice_id: &BytesN<32>) -> Vec { + let key = StorageKey::History(invoice_id.clone()); + let data = env.storage().persistent().get(&key); + if data.is_some() { + env.storage() + .persistent() + .extend_ttl(&key, TTL_THRESHOLD, MIN_TTL_EXTEND); + } + data.unwrap_or(Vec::new(env)) +} + +/// Prepend `record` to `invoice_id`'s history (newest-first), pruning the +/// oldest entry (the last element) if the list would exceed `MAX_TRADES`. +pub fn push_trade(env: &Env, invoice_id: &BytesN<32>, record: TradeRecord) { + let key = StorageKey::History(invoice_id.clone()); + let mut history = get_history(env, invoice_id); + history.insert(0, record); + while history.len() > MAX_TRADES { + history.remove(history.len() - 1); + } + env.storage().persistent().set(&key, &history); + env.storage() + .persistent() + .extend_ttl(&key, TTL_THRESHOLD, MIN_TTL_EXTEND); +} diff --git a/contracts/secondary-trade-history/src/test.rs b/contracts/secondary-trade-history/src/test.rs new file mode 100644 index 00000000..e2919ccb --- /dev/null +++ b/contracts/secondary-trade-history/src/test.rs @@ -0,0 +1,233 @@ +#![cfg(test)] +#![allow(deprecated)] + +use soroban_sdk::testutils::{Address as _, Events}; +use soroban_sdk::{Address, BytesN, Env, String, Symbol, TryFromVal, TryIntoVal, Val, Vec}; + +use crate::{Error, SecondaryTradeHistory, SecondaryTradeHistoryClient}; + +fn zero_address(env: &Env) -> Address { + Address::from_string(&String::from_str( + env, + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", + )) +} + +fn setup<'a>(env: &Env) -> (Address, Address, SecondaryTradeHistoryClient<'a>) { + env.mock_all_auths(); + let contract_id = env.register(SecondaryTradeHistory, ()); + let client = SecondaryTradeHistoryClient::new(env, &contract_id); + let admin = Address::generate(env); + let recorder = Address::generate(env); + client.initialize(&admin, &recorder); + (admin, recorder, client) +} + +fn invoice_id(env: &Env, seed: u8) -> BytesN<32> { + BytesN::from_array(env, &[seed; 32]) +} + +/// Returns the topics and data of the most recently emitted event on `env`. +fn last_event(env: &Env) -> (Vec, Val) { + let all = env.events().all(); + let events = all.events(); + let last = events.last().expect("no events emitted"); + let soroban_sdk::xdr::ContractEventBody::V0(v0) = &last.body; + let topics = Vec::::try_from_val( + env, + &soroban_sdk::xdr::ScVal::Vec(Some(v0.topics.clone().into())), + ) + .unwrap(); + let data = Val::try_from_val(env, &v0.data).unwrap(); + (topics, data) +} + +#[test] +fn test_initialize_sets_admin_and_recorder() { + let env = Env::default(); + let (admin, recorder, client) = setup(&env); + assert_eq!(client.get_admin(), admin); + assert_eq!(client.get_recorder(), recorder); +} + +#[test] +fn test_cannot_initialize_twice() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register(SecondaryTradeHistory, ()); + let client = SecondaryTradeHistoryClient::new(&env, &contract_id); + let admin = Address::generate(&env); + let recorder = Address::generate(&env); + client.initialize(&admin, &recorder); + assert_eq!( + client.try_initialize(&admin, &recorder), + Err(Ok(Error::AlreadyInit)) + ); +} + +#[test] +fn test_initialize_rejects_zero_address() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register(SecondaryTradeHistory, ()); + let client = SecondaryTradeHistoryClient::new(&env, &contract_id); + let admin = Address::generate(&env); + let recorder = Address::generate(&env); + + assert_eq!( + client.try_initialize(&zero_address(&env), &recorder), + Err(Ok(Error::InvalidAddress)) + ); + assert_eq!( + client.try_initialize(&admin, &zero_address(&env)), + Err(Ok(Error::InvalidAddress)) + ); +} + +#[test] +fn test_record_trade_and_get_last_price() { + let env = Env::default(); + let (_admin, recorder, client) = setup(&env); + let inv = invoice_id(&env, 1); + + client.record_trade(&inv, &100, &5, &1000); + assert_eq!(client.get_last_price(&inv), 100); + + client.record_trade(&inv, &150, &3, &2000); + assert_eq!(client.get_last_price(&inv), 150); + let _ = recorder; +} + +#[test] +fn test_get_last_price_fails_with_no_trades() { + let env = Env::default(); + let (_admin, _recorder, client) = setup(&env); + let inv = invoice_id(&env, 1); + + assert_eq!(client.try_get_last_price(&inv), Err(Ok(Error::NoTrades))); +} + +#[test] +fn test_get_price_history_newest_first() { + let env = Env::default(); + let (_admin, _recorder, client) = setup(&env); + let inv = invoice_id(&env, 1); + + client.record_trade(&inv, &100, &1, &1000); + client.record_trade(&inv, &110, &1, &2000); + client.record_trade(&inv, &120, &1, &3000); + + let history = client.get_price_history(&inv, &10); + assert_eq!(history.len(), 3); + assert_eq!(history.get(0).unwrap().price, 120); + assert_eq!(history.get(1).unwrap().price, 110); + assert_eq!(history.get(2).unwrap().price, 100); +} + +#[test] +fn test_get_price_history_respects_limit() { + let env = Env::default(); + let (_admin, _recorder, client) = setup(&env); + let inv = invoice_id(&env, 1); + + for i in 0..5 { + client.record_trade(&inv, &(100 + i as i128), &1, &(1000 + i as u64)); + } + + let history = client.get_price_history(&inv, &2); + assert_eq!(history.len(), 2); + // Newest first: last recorded (104) then second-to-last (103). + assert_eq!(history.get(0).unwrap().price, 104); + assert_eq!(history.get(1).unwrap().price, 103); +} + +#[test] +fn test_history_pruned_beyond_100_trades() { + let env = Env::default(); + let (_admin, _recorder, client) = setup(&env); + let inv = invoice_id(&env, 1); + + for i in 0..105 { + client.record_trade(&inv, &(1000 + i as i128), &1, &(i as u64)); + } + + let history = client.get_price_history(&inv, &200); + assert_eq!(history.len(), 100); + // The 5 oldest trades (prices 1000..1004) should have been pruned; + // the oldest remaining entry is price 1005, and it sits last since + // history is stored newest-first. + assert_eq!(history.get(99).unwrap().price, 1005); + // The most recent trade (price 1104) is still first. + assert_eq!(history.get(0).unwrap().price, 1104); + assert_eq!(client.get_last_price(&inv), 1104); +} + +#[test] +fn test_record_trade_rejects_non_positive_price_or_amount() { + let env = Env::default(); + let (_admin, _recorder, client) = setup(&env); + let inv = invoice_id(&env, 1); + + assert_eq!( + client.try_record_trade(&inv, &0, &1, &1000), + Err(Ok(Error::InvalidTrade)) + ); + assert_eq!( + client.try_record_trade(&inv, &100, &0, &1000), + Err(Ok(Error::InvalidTrade)) + ); + assert_eq!( + client.try_record_trade(&inv, &-10, &1, &1000), + Err(Ok(Error::InvalidTrade)) + ); +} + +#[test] +fn test_record_trade_emits_trade_recorded_event() { + let env = Env::default(); + let (_admin, _recorder, client) = setup(&env); + let inv = invoice_id(&env, 1); + + client.record_trade(&inv, &100, &5, &1000); + + let (topics, data) = last_event(&env); + assert_eq!(topics.len(), 2); + let event_name: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(event_name, Symbol::new(&env, "TradeRecorded")); + let event_invoice: BytesN<32> = topics.get(1).unwrap().try_into_val(&env).unwrap(); + assert_eq!(event_invoice, inv); + let (price, amount, timestamp): (i128, i128, u64) = data.try_into_val(&env).unwrap(); + assert_eq!(price, 100); + assert_eq!(amount, 5); + assert_eq!(timestamp, 1000); +} + +#[test] +fn test_set_recorder_admin_only() { + let env = Env::default(); + let (admin, _old_recorder, client) = setup(&env); + let new_recorder = Address::generate(&env); + let not_admin = Address::generate(&env); + + assert_eq!( + client.try_set_recorder(¬_admin, &new_recorder), + Err(Ok(Error::Unauthorized)) + ); + + client.set_recorder(&admin, &new_recorder); + assert_eq!(client.get_recorder(), new_recorder); +} + +#[test] +fn test_history_isolated_per_invoice() { + let env = Env::default(); + let (_admin, _recorder, client) = setup(&env); + let inv_a = invoice_id(&env, 1); + let inv_b = invoice_id(&env, 2); + + client.record_trade(&inv_a, &100, &1, &1000); + client.record_trade(&inv_b, &999, &1, &1000); + + assert_eq!(client.get_last_price(&inv_a), 100); + assert_eq!(client.get_last_price(&inv_b), 999); +} diff --git a/contracts/secondary-trade-history/src/types.rs b/contracts/secondary-trade-history/src/types.rs new file mode 100644 index 00000000..0709109d --- /dev/null +++ b/contracts/secondary-trade-history/src/types.rs @@ -0,0 +1,27 @@ +//! Data types for the secondary market trade history contract. + +use soroban_sdk::{contracttype, BytesN}; + +/// Storage key enum for instance and persistent storage. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum StorageKey { + /// Instance: contract admin. + Admin, + /// Instance: the sole address authorized to call `record_trade` + /// (normally the deployed secondary-market contract). Fake trade + /// records would corrupt on-chain price discovery, so recording is + /// gated to one trusted caller rather than left open. + Recorder, + /// Persistent: trade history for an invoice, newest-first. + History(BytesN<32>), +} + +/// One executed secondary market trade for a given invoice. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct TradeRecord { + pub price: i128, + pub amount: i128, + pub timestamp: u64, +} diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_cannot_initialize_twice.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_cannot_initialize_twice.1.json new file mode 100644 index 00000000..eee72363 --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_cannot_initialize_twice.1.json @@ -0,0 +1,87 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_get_last_price_fails_with_no_trades.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_get_last_price_fails_with_no_trades.1.json new file mode 100644 index 00000000..eee72363 --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_get_last_price_fails_with_no_trades.1.json @@ -0,0 +1,87 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_get_price_history_newest_first.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_get_price_history_newest_first.1.json new file mode 100644 index 00000000..7a20dc36 --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_get_price_history_newest_first.1.json @@ -0,0 +1,343 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "100" + }, + { + "i128": "1" + }, + { + "u64": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "110" + }, + { + "i128": "1" + }, + { + "u64": "2000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "120" + }, + { + "i128": "1" + }, + { + "u64": "3000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "History" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "120" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "3000" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "110" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "2000" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1000" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_get_price_history_respects_limit.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_get_price_history_respects_limit.1.json new file mode 100644 index 00000000..b29d3b7a --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_get_price_history_respects_limit.1.json @@ -0,0 +1,495 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "100" + }, + { + "i128": "1" + }, + { + "u64": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "101" + }, + { + "i128": "1" + }, + { + "u64": "1001" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "102" + }, + { + "i128": "1" + }, + { + "u64": "1002" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "103" + }, + { + "i128": "1" + }, + { + "u64": "1003" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "104" + }, + { + "i128": "1" + }, + { + "u64": "1004" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "History" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "104" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1004" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "103" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1003" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "102" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1002" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "101" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1001" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1000" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_history_isolated_per_invoice.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_history_isolated_per_invoice.1.json new file mode 100644 index 00000000..078cf8b8 --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_history_isolated_per_invoice.1.json @@ -0,0 +1,296 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "100" + }, + { + "i128": "1" + }, + { + "u64": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0202020202020202020202020202020202020202020202020202020202020202" + }, + { + "i128": "999" + }, + { + "i128": "1" + }, + { + "u64": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "History" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1000" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "History" + }, + { + "bytes": "0202020202020202020202020202020202020202020202020202020202020202" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "999" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1000" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_history_pruned_beyond_100_trades.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_history_pruned_beyond_100_trades.1.json new file mode 100644 index 00000000..22c35f32 --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_history_pruned_beyond_100_trades.1.json @@ -0,0 +1,7956 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1000" + }, + { + "i128": "1" + }, + { + "u64": "0" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1001" + }, + { + "i128": "1" + }, + { + "u64": "1" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1002" + }, + { + "i128": "1" + }, + { + "u64": "2" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1003" + }, + { + "i128": "1" + }, + { + "u64": "3" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1004" + }, + { + "i128": "1" + }, + { + "u64": "4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1005" + }, + { + "i128": "1" + }, + { + "u64": "5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1006" + }, + { + "i128": "1" + }, + { + "u64": "6" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1007" + }, + { + "i128": "1" + }, + { + "u64": "7" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1008" + }, + { + "i128": "1" + }, + { + "u64": "8" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1009" + }, + { + "i128": "1" + }, + { + "u64": "9" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1010" + }, + { + "i128": "1" + }, + { + "u64": "10" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1011" + }, + { + "i128": "1" + }, + { + "u64": "11" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1012" + }, + { + "i128": "1" + }, + { + "u64": "12" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1013" + }, + { + "i128": "1" + }, + { + "u64": "13" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1014" + }, + { + "i128": "1" + }, + { + "u64": "14" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1015" + }, + { + "i128": "1" + }, + { + "u64": "15" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1016" + }, + { + "i128": "1" + }, + { + "u64": "16" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1017" + }, + { + "i128": "1" + }, + { + "u64": "17" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1018" + }, + { + "i128": "1" + }, + { + "u64": "18" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1019" + }, + { + "i128": "1" + }, + { + "u64": "19" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1020" + }, + { + "i128": "1" + }, + { + "u64": "20" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1021" + }, + { + "i128": "1" + }, + { + "u64": "21" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1022" + }, + { + "i128": "1" + }, + { + "u64": "22" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1023" + }, + { + "i128": "1" + }, + { + "u64": "23" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1024" + }, + { + "i128": "1" + }, + { + "u64": "24" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1025" + }, + { + "i128": "1" + }, + { + "u64": "25" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1026" + }, + { + "i128": "1" + }, + { + "u64": "26" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1027" + }, + { + "i128": "1" + }, + { + "u64": "27" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1028" + }, + { + "i128": "1" + }, + { + "u64": "28" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1029" + }, + { + "i128": "1" + }, + { + "u64": "29" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1030" + }, + { + "i128": "1" + }, + { + "u64": "30" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1031" + }, + { + "i128": "1" + }, + { + "u64": "31" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1032" + }, + { + "i128": "1" + }, + { + "u64": "32" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1033" + }, + { + "i128": "1" + }, + { + "u64": "33" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1034" + }, + { + "i128": "1" + }, + { + "u64": "34" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1035" + }, + { + "i128": "1" + }, + { + "u64": "35" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1036" + }, + { + "i128": "1" + }, + { + "u64": "36" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1037" + }, + { + "i128": "1" + }, + { + "u64": "37" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1038" + }, + { + "i128": "1" + }, + { + "u64": "38" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1039" + }, + { + "i128": "1" + }, + { + "u64": "39" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1040" + }, + { + "i128": "1" + }, + { + "u64": "40" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1041" + }, + { + "i128": "1" + }, + { + "u64": "41" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1042" + }, + { + "i128": "1" + }, + { + "u64": "42" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1043" + }, + { + "i128": "1" + }, + { + "u64": "43" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1044" + }, + { + "i128": "1" + }, + { + "u64": "44" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1045" + }, + { + "i128": "1" + }, + { + "u64": "45" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1046" + }, + { + "i128": "1" + }, + { + "u64": "46" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1047" + }, + { + "i128": "1" + }, + { + "u64": "47" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1048" + }, + { + "i128": "1" + }, + { + "u64": "48" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1049" + }, + { + "i128": "1" + }, + { + "u64": "49" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1050" + }, + { + "i128": "1" + }, + { + "u64": "50" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1051" + }, + { + "i128": "1" + }, + { + "u64": "51" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1052" + }, + { + "i128": "1" + }, + { + "u64": "52" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1053" + }, + { + "i128": "1" + }, + { + "u64": "53" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1054" + }, + { + "i128": "1" + }, + { + "u64": "54" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1055" + }, + { + "i128": "1" + }, + { + "u64": "55" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1056" + }, + { + "i128": "1" + }, + { + "u64": "56" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1057" + }, + { + "i128": "1" + }, + { + "u64": "57" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1058" + }, + { + "i128": "1" + }, + { + "u64": "58" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1059" + }, + { + "i128": "1" + }, + { + "u64": "59" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1060" + }, + { + "i128": "1" + }, + { + "u64": "60" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1061" + }, + { + "i128": "1" + }, + { + "u64": "61" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1062" + }, + { + "i128": "1" + }, + { + "u64": "62" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1063" + }, + { + "i128": "1" + }, + { + "u64": "63" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1064" + }, + { + "i128": "1" + }, + { + "u64": "64" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1065" + }, + { + "i128": "1" + }, + { + "u64": "65" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1066" + }, + { + "i128": "1" + }, + { + "u64": "66" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1067" + }, + { + "i128": "1" + }, + { + "u64": "67" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1068" + }, + { + "i128": "1" + }, + { + "u64": "68" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1069" + }, + { + "i128": "1" + }, + { + "u64": "69" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1070" + }, + { + "i128": "1" + }, + { + "u64": "70" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1071" + }, + { + "i128": "1" + }, + { + "u64": "71" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1072" + }, + { + "i128": "1" + }, + { + "u64": "72" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1073" + }, + { + "i128": "1" + }, + { + "u64": "73" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1074" + }, + { + "i128": "1" + }, + { + "u64": "74" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1075" + }, + { + "i128": "1" + }, + { + "u64": "75" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1076" + }, + { + "i128": "1" + }, + { + "u64": "76" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1077" + }, + { + "i128": "1" + }, + { + "u64": "77" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1078" + }, + { + "i128": "1" + }, + { + "u64": "78" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1079" + }, + { + "i128": "1" + }, + { + "u64": "79" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1080" + }, + { + "i128": "1" + }, + { + "u64": "80" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1081" + }, + { + "i128": "1" + }, + { + "u64": "81" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1082" + }, + { + "i128": "1" + }, + { + "u64": "82" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1083" + }, + { + "i128": "1" + }, + { + "u64": "83" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1084" + }, + { + "i128": "1" + }, + { + "u64": "84" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1085" + }, + { + "i128": "1" + }, + { + "u64": "85" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1086" + }, + { + "i128": "1" + }, + { + "u64": "86" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1087" + }, + { + "i128": "1" + }, + { + "u64": "87" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1088" + }, + { + "i128": "1" + }, + { + "u64": "88" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1089" + }, + { + "i128": "1" + }, + { + "u64": "89" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1090" + }, + { + "i128": "1" + }, + { + "u64": "90" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1091" + }, + { + "i128": "1" + }, + { + "u64": "91" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1092" + }, + { + "i128": "1" + }, + { + "u64": "92" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1093" + }, + { + "i128": "1" + }, + { + "u64": "93" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1094" + }, + { + "i128": "1" + }, + { + "u64": "94" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1095" + }, + { + "i128": "1" + }, + { + "u64": "95" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1096" + }, + { + "i128": "1" + }, + { + "u64": "96" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1097" + }, + { + "i128": "1" + }, + { + "u64": "97" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1098" + }, + { + "i128": "1" + }, + { + "u64": "98" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1099" + }, + { + "i128": "1" + }, + { + "u64": "99" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1100" + }, + { + "i128": "1" + }, + { + "u64": "100" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1101" + }, + { + "i128": "1" + }, + { + "u64": "101" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1102" + }, + { + "i128": "1" + }, + { + "u64": "102" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1103" + }, + { + "i128": "1" + }, + { + "u64": "103" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "1104" + }, + { + "i128": "1" + }, + { + "u64": "104" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "History" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1104" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "104" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1103" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "103" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1102" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "102" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1101" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "101" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1100" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "100" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1099" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "99" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1098" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "98" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1097" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "97" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1096" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "96" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1095" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "95" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1094" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "94" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1093" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "93" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1092" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "92" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1091" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "91" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1090" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "90" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1089" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "89" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1088" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "88" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1087" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "87" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1086" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "86" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1085" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "85" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1084" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "84" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1083" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "83" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1082" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "82" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1081" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "81" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1080" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "80" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1079" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "79" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1078" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "78" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1077" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "77" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1076" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "76" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1075" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "75" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1074" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "74" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1073" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "73" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1072" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "72" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1071" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "71" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1070" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "70" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1069" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "69" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1068" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "68" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1067" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "67" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1066" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "66" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1065" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "65" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1064" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "64" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1063" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "63" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1062" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "62" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1061" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "61" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1060" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "60" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1059" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "59" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1058" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "58" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1057" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "57" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1056" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "56" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1055" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "55" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1054" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "54" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1053" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "53" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1052" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "52" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1051" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "51" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1050" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "50" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1049" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "49" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1048" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "48" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1047" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "47" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1046" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "46" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1045" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "45" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1044" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "44" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1043" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "43" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1042" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "42" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1041" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "41" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1040" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "40" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1039" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "39" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1038" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "38" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1037" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "37" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1036" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "36" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1035" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "35" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1034" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "34" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1033" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "33" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1032" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "32" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1031" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "31" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1030" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "30" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1029" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "29" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1028" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "28" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1027" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "27" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1026" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "26" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1025" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "25" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1024" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "24" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1023" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "23" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1022" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "22" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1021" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "21" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1020" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "20" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1019" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "19" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1018" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "18" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1017" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "17" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1016" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "16" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1015" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "15" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1014" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "14" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1013" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "13" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1012" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "12" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1011" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "11" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1010" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "10" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1009" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "9" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1008" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "8" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1007" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "7" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1006" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "6" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "1005" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "5" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "76060705166808367" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "115220454072064130" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "124590656928745377" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "300033532921919907" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "394263859078419540" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "395965415359800683" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "481950710878307615" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "544730322382084885" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "649072984189975589" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "670404547506884812" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "767083961780241525" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "875319255151014454" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1060519300191340491" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1161004259517476189" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1166692687884080826" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1194852393571756375" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1242168959743744263" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1273663306374918439" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1301173170172112462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1345255804540566779" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1501277168746644712" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1506441561184340186" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1614739035918781831" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1690253666352074432" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1768924605727919950" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1967922937664261543" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2140788761963629343" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2254425974100219774" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2260266285686479847" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2307661404550649928" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2526474023416127439" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2578412842719982537" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2623024502929126324" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2733761617737370087" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2781962168096793370" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2841415490237507697" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2891388370666955040" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "2917827370713594154" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3126073502131104533" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3195544978474815821" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3312139281147456071" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3313549020784837764" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3507645618223554847" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3736142932239307322" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3791811173315715839" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3888397324562915271" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3945433670868351223" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "3972104438082304464" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4211405827341991149" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4271701834903804982" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4553542552662768400" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4571470874178140630" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4601299207353310938" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4677765900193036446" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4822409645871993625" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4900321175033996277" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "4914054227674050081" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5012940724606903311" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5043854608229809201" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5148037999226383026" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5219976416919672547" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5322562311059672449" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5536345977105687142" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5567623040284808000" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5670621023751100817" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5806905060045992000" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5994256439390011320" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6006104520346379553" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6054449652355741849" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6208800374416201873" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6233550795020492710" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6277191135259896685" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6306546209684867670" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6310153727739411520" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6369051681840606601" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6391496069076573377" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6517132746326325848" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6875503646996515520" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "7270604957039011794" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "7462478058564425762" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "7542349592066956260" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "7542511690552384870" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "7564072809757355283" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "7687354978218273323" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "7935298921545310989" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8067048471933141837" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8077058277077262192" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8079234564129527112" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8157382300544000078" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8370022561469687789" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8375915698557174338" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8582780626144801259" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8754220119846337199" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8799288422285703394" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8840537117088365198" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8941506213304483187" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "9085653633391546739" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "9203650180228785090" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "9219847003023114248" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_initialize_rejects_zero_address.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_initialize_rejects_zero_address.1.json new file mode 100644 index 00000000..b82a922e --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_initialize_rejects_zero_address.1.json @@ -0,0 +1,62 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_initialize_sets_admin_and_recorder.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_initialize_sets_admin_and_recorder.1.json new file mode 100644 index 00000000..9086e1f1 --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_initialize_sets_admin_and_recorder.1.json @@ -0,0 +1,88 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_record_trade_and_get_last_price.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_record_trade_and_get_last_price.1.json new file mode 100644 index 00000000..6a70cd1a --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_record_trade_and_get_last_price.1.json @@ -0,0 +1,268 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "100" + }, + { + "i128": "5" + }, + { + "u64": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "150" + }, + { + "i128": "3" + }, + { + "u64": "2000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "History" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "3" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "150" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "2000" + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "5" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1000" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_record_trade_emits_trade_recorded_event.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_record_trade_emits_trade_recorded_event.1.json new file mode 100644 index 00000000..0e3faab6 --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_record_trade_emits_trade_recorded_event.1.json @@ -0,0 +1,224 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_trade", + "args": [ + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "i128": "100" + }, + { + "i128": "5" + }, + { + "u64": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "History" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "5" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "1000" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "TradeRecorded" + }, + { + "bytes": "0101010101010101010101010101010101010101010101010101010101010101" + } + ], + "data": { + "vec": [ + { + "i128": "100" + }, + { + "i128": "5" + }, + { + "u64": "1000" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_record_trade_rejects_non_positive_price_or_amount.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_record_trade_rejects_non_positive_price_or_amount.1.json new file mode 100644 index 00000000..870dc5c8 --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_record_trade_rejects_non_positive_price_or_amount.1.json @@ -0,0 +1,89 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/secondary-trade-history/test_snapshots/test/test_set_recorder_admin_only.1.json b/contracts/secondary-trade-history/test_snapshots/test/test_set_recorder_admin_only.1.json new file mode 100644 index 00000000..391169f4 --- /dev/null +++ b/contracts/secondary-trade-history/test_snapshots/test/test_set_recorder_admin_only.1.json @@ -0,0 +1,130 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_recorder", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Recorder" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file From 9f7bb5063e0d09e401470e842f5f9e8e250d7603 Mon Sep 17 00:00:00 2001 From: Mawuli Ejere Date: Sat, 24 Oct 2026 11:58:33 +0100 Subject: [PATCH 2/3] feat(treasury-management): add platform treasury management contract for fee allocation (#644) --- contracts/treasury-management/Cargo.toml | 16 + contracts/treasury-management/src/errors.rs | 26 + contracts/treasury-management/src/events.rs | 24 + contracts/treasury-management/src/lib.rs | 165 ++++ contracts/treasury-management/src/storage.rs | 110 +++ contracts/treasury-management/src/test.rs | 279 +++++++ contracts/treasury-management/src/types.rs | 48 ++ ...test_allocate_rejects_empty_purpose.1.json | 172 +++++ ...locate_rejects_insufficient_balance.1.json | 172 +++++ .../test_allocate_rejects_non_admin.1.json | 172 +++++ ...te_rejects_zero_address_destination.1.json | 172 +++++ ...te_routes_funds_and_reduces_balance.1.json | 292 +++++++ .../test/test_cannot_initialize_twice.1.json | 87 +++ .../test_fee_received_event_emitted.1.json | 195 +++++ .../test_funds_allocated_event_emitted.1.json | 322 ++++++++ ...st_get_allocation_history_paginated.1.json | 728 ++++++++++++++++++ ...itialize_rejects_zero_address_admin.1.json | 61 ++ .../test/test_initialize_sets_admin.1.json | 87 +++ ...st_receive_fee_attributed_to_source.1.json | 286 +++++++ ...ive_fee_rejects_non_positive_amount.1.json | 88 +++ 20 files changed, 3502 insertions(+) create mode 100644 contracts/treasury-management/Cargo.toml create mode 100644 contracts/treasury-management/src/errors.rs create mode 100644 contracts/treasury-management/src/events.rs create mode 100644 contracts/treasury-management/src/lib.rs create mode 100644 contracts/treasury-management/src/storage.rs create mode 100644 contracts/treasury-management/src/test.rs create mode 100644 contracts/treasury-management/src/types.rs create mode 100644 contracts/treasury-management/test_snapshots/test/test_allocate_rejects_empty_purpose.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_allocate_rejects_insufficient_balance.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_allocate_rejects_non_admin.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_allocate_rejects_zero_address_destination.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_allocate_routes_funds_and_reduces_balance.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_cannot_initialize_twice.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_fee_received_event_emitted.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_funds_allocated_event_emitted.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_get_allocation_history_paginated.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_initialize_rejects_zero_address_admin.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_initialize_sets_admin.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_receive_fee_attributed_to_source.1.json create mode 100644 contracts/treasury-management/test_snapshots/test/test_receive_fee_rejects_non_positive_amount.1.json diff --git a/contracts/treasury-management/Cargo.toml b/contracts/treasury-management/Cargo.toml new file mode 100644 index 00000000..68d53c25 --- /dev/null +++ b/contracts/treasury-management/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "treasury-management" +version = "0.1.0" +edition = "2021" +# Deployed as WASM, never published to crates.io. +publish = false +description = "StellarSettle platform treasury management contract for fee allocation and withdrawal" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +soroban-sdk = { workspace = true } + +[dev-dependencies] +soroban-sdk = { workspace = true, features = ["testutils"] } diff --git a/contracts/treasury-management/src/errors.rs b/contracts/treasury-management/src/errors.rs new file mode 100644 index 00000000..e17d7105 --- /dev/null +++ b/contracts/treasury-management/src/errors.rs @@ -0,0 +1,26 @@ +//! Error types for the platform treasury management contract. + +use soroban_sdk::contracterror; + +/// Errors that can occur during contract execution. +#[contracterror] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[repr(u32)] +pub enum Error { + /// Contract has already been initialized. + AlreadyInit = 1, + /// Contract has not been initialized. + NotInit = 2, + /// Caller is not the admin. + Unauthorized = 3, + /// Address is the zero address (all-zero 32-byte key). + InvalidAddress = 4, + /// amount must be strictly positive. + InvalidAmount = 5, + /// allocate requested more than the current total balance. + InsufficientBalance = 6, + /// purpose string must not be empty. + InvalidPurpose = 7, + /// Arithmetic overflow while updating a balance or count. + Overflow = 8, +} diff --git a/contracts/treasury-management/src/events.rs b/contracts/treasury-management/src/events.rs new file mode 100644 index 00000000..e3abd5fa --- /dev/null +++ b/contracts/treasury-management/src/events.rs @@ -0,0 +1,24 @@ +#![allow(deprecated)] +//! Events emitted by the platform treasury management contract. + +use soroban_sdk::{Address, Env, String, Symbol}; + +/// Emitted when the contract is initialized. +pub fn initialized(env: &Env, admin: &Address) { + let topics = (Symbol::new(env, "initialized"),); + env.events().publish(topics, admin.clone()); +} + +/// Emitted each time a fee source contributes funds. +/// Topics: (FeeReceived, source); Data: amount. +pub fn fee_received(env: &Env, source: &Address, amount: i128) { + let topics = (Symbol::new(env, "FeeReceived"), source.clone()); + env.events().publish(topics, amount); +} + +/// Emitted each time the admin allocates funds out of the treasury. +/// Topics: (FundsAllocated, destination); Data: (amount, purpose). +pub fn funds_allocated(env: &Env, destination: &Address, amount: i128, purpose: &String) { + let topics = (Symbol::new(env, "FundsAllocated"), destination.clone()); + env.events().publish(topics, (amount, purpose.clone())); +} diff --git a/contracts/treasury-management/src/lib.rs b/contracts/treasury-management/src/lib.rs new file mode 100644 index 00000000..25924ee0 --- /dev/null +++ b/contracts/treasury-management/src/lib.rs @@ -0,0 +1,165 @@ +//! Platform treasury management contract for StellarSettle. +//! +//! Consolidates protocol fee inflows from every fee-collecting contract, +//! tracks balances per fee source, and lets the admin allocate funds to +//! platform operations, grants, and reserves with a paginated audit log. + +#![no_std] + +mod errors; +mod events; +mod storage; +mod types; + +pub use types::{AllocationRecord, TreasuryBalance}; + +use soroban_sdk::{contract, contractimpl, Address, Env, String, Vec}; + +use errors::Error; + +/// Reject the zero address (all-zero 32-byte Ed25519 key). +fn ensure_non_zero_address(env: &Env, address: &Address) -> Result<(), Error> { + let zero_str = String::from_str( + env, + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", + ); + let zero = Address::from_string(&zero_str); + if *address == zero { + return Err(Error::InvalidAddress); + } + Ok(()) +} + +#[contract] +pub struct TreasuryManagement; + +#[contractimpl] +impl TreasuryManagement { + /// Initialize the contract with the admin allowed to call `allocate`. + pub fn initialize(env: Env, admin: Address) -> Result<(), Error> { + ensure_non_zero_address(&env, &admin)?; + if storage::get_admin(&env).is_some() { + return Err(Error::AlreadyInit); + } + storage::set_admin(&env, &admin); + storage::set_total_balance(&env, 0); + events::initialized(&env, &admin); + Ok(()) + } + + /// Called by any fee-collecting contract to attribute `amount` to + /// `source`. This contract does not itself move tokens: the caller is + /// expected to have already transferred `amount` of the protocol's + /// fee token to this contract's address before calling, matching how + /// the other fee-collecting contracts in this workspace separate + /// token movement from balance bookkeeping. + pub fn receive_fee(env: Env, source: Address, amount: i128) -> Result<(), Error> { + source.require_auth(); + if amount <= 0 { + return Err(Error::InvalidAmount); + } + storage::get_admin(&env).ok_or(Error::NotInit)?; + + storage::credit_source(&env, &source, amount); + let total = storage::get_total_balance(&env); + storage::set_total_balance(&env, total.checked_add(amount).ok_or(Error::Overflow)?); + + events::fee_received(&env, &source, amount); + Ok(()) + } + + /// Admin-only: route `amount` of treasury funds to `destination` for + /// `purpose` (e.g. "operations", "grant:Q3-community-fund", + /// "reserve"). Records the allocation in the paginated history log. + /// + /// Like `receive_fee`, this contract tracks the allocation as + /// bookkeeping; the admin (or a caller the admin authorizes) is + /// responsible for the actual token transfer to `destination`. + pub fn allocate( + env: Env, + admin: Address, + destination: Address, + amount: i128, + purpose: String, + ) -> Result { + let stored_admin = storage::get_admin(&env).ok_or(Error::NotInit)?; + if admin != stored_admin { + return Err(Error::Unauthorized); + } + admin.require_auth(); + ensure_non_zero_address(&env, &destination)?; + if amount <= 0 { + return Err(Error::InvalidAmount); + } + if purpose.is_empty() { + return Err(Error::InvalidPurpose); + } + + let total = storage::get_total_balance(&env); + if amount > total { + return Err(Error::InsufficientBalance); + } + storage::set_total_balance(&env, total - amount); + + let record = AllocationRecord { + destination: destination.clone(), + amount, + purpose: purpose.clone(), + timestamp: env.ledger().timestamp(), + }; + let index = storage::push_allocation(&env, &record); + + events::funds_allocated(&env, &destination, amount, &purpose); + Ok(index) + } + + /// View: total treasury balance and a per-source breakdown. + pub fn get_treasury_balance(env: Env) -> TreasuryBalance { + let total = storage::get_total_balance(&env); + let known_sources = storage::get_known_sources(&env); + let mut sources = Vec::new(&env); + let mut amounts = Vec::new(&env); + for source in known_sources.iter() { + sources.push_back(source.clone()); + amounts.push_back(storage::get_source_balance(&env, &source)); + } + TreasuryBalance { + total, + sources, + amounts, + } + } + + /// View: paginated allocation log, oldest-first within the page. + /// `offset` is the index of the first record to return; `limit` caps + /// how many are returned. Returns fewer than `limit` records once the + /// end of the log is reached, and an empty Vec once `offset` is past + /// the end. + pub fn get_allocation_history(env: Env, offset: u32, limit: u32) -> Vec { + let count = storage::get_allocation_count(&env); + let mut result = Vec::new(&env); + if offset >= count { + return result; + } + let end = core::cmp::min(offset.saturating_add(limit), count); + for index in offset..end { + if let Some(record) = storage::get_allocation(&env, index) { + result.push_back(record); + } + } + result + } + + /// View: total number of allocation records ever written. + pub fn get_allocation_count(env: Env) -> u32 { + storage::get_allocation_count(&env) + } + + /// View: return the current admin. + pub fn get_admin(env: Env) -> Result { + storage::get_admin(&env).ok_or(Error::NotInit) + } +} + +#[cfg(test)] +mod test; diff --git a/contracts/treasury-management/src/storage.rs b/contracts/treasury-management/src/storage.rs new file mode 100644 index 00000000..f0241363 --- /dev/null +++ b/contracts/treasury-management/src/storage.rs @@ -0,0 +1,110 @@ +//! Storage helpers for the platform treasury management contract. + +use soroban_sdk::{Address, Env, Vec}; + +use crate::types::{AllocationRecord, StorageKey}; + +/// Ledgers below which a persistent entry's TTL is extended (~7 days at 5s/ledger). +pub const TTL_THRESHOLD: u32 = 120_960; +/// Minimum TTL extension in ledger units (~60 days at 5s/ledger). +pub const MIN_TTL_EXTEND: u32 = 1_036_800; + +pub fn set_admin(env: &Env, admin: &Address) { + env.storage().instance().set(&StorageKey::Admin, admin); + env.storage() + .instance() + .extend_ttl(TTL_THRESHOLD, MIN_TTL_EXTEND); +} + +pub fn get_admin(env: &Env) -> Option
{ + env.storage() + .instance() + .extend_ttl(TTL_THRESHOLD, MIN_TTL_EXTEND); + env.storage().instance().get(&StorageKey::Admin) +} + +pub fn get_total_balance(env: &Env) -> i128 { + env.storage() + .instance() + .get(&StorageKey::TotalBalance) + .unwrap_or(0) +} + +pub fn set_total_balance(env: &Env, amount: i128) { + env.storage() + .instance() + .set(&StorageKey::TotalBalance, &amount); +} + +pub fn get_known_sources(env: &Env) -> Vec
{ + env.storage() + .instance() + .get(&StorageKey::KnownSources) + .unwrap_or(Vec::new(env)) +} + +/// Append `source` to the known-sources list if it isn't already present. +fn remember_source(env: &Env, source: &Address) { + let mut sources = get_known_sources(env); + if !sources.contains(source) { + sources.push_back(source.clone()); + env.storage() + .instance() + .set(&StorageKey::KnownSources, &sources); + } +} + +pub fn get_source_balance(env: &Env, source: &Address) -> i128 { + let key = StorageKey::SourceBalance(source.clone()); + let data = env.storage().persistent().get(&key); + if data.is_some() { + env.storage() + .persistent() + .extend_ttl(&key, TTL_THRESHOLD, MIN_TTL_EXTEND); + } + data.unwrap_or(0) +} + +/// Record that `source` contributed `amount`, updating its per-source +/// balance, the running total, and the known-sources list. +pub fn credit_source(env: &Env, source: &Address, amount: i128) { + remember_source(env, source); + let key = StorageKey::SourceBalance(source.clone()); + let balance = get_source_balance(env, source); + env.storage().persistent().set(&key, &(balance + amount)); + env.storage() + .persistent() + .extend_ttl(&key, TTL_THRESHOLD, MIN_TTL_EXTEND); +} + +pub fn get_allocation_count(env: &Env) -> u32 { + env.storage() + .instance() + .get(&StorageKey::AllocationCount) + .unwrap_or(0) +} + +pub fn get_allocation(env: &Env, index: u32) -> Option { + let key = StorageKey::Allocation(index); + let data = env.storage().persistent().get(&key); + if data.is_some() { + env.storage() + .persistent() + .extend_ttl(&key, TTL_THRESHOLD, MIN_TTL_EXTEND); + } + data +} + +/// Append a new allocation record, returning its assigned index. +pub fn push_allocation(env: &Env, record: &AllocationRecord) -> u32 { + let index = get_allocation_count(env); + let key = StorageKey::Allocation(index); + env.storage().persistent().set(&key, record); + env.storage() + .persistent() + .extend_ttl(&key, TTL_THRESHOLD, MIN_TTL_EXTEND); + env.storage() + .instance() + .set(&StorageKey::AllocationCount, &(index + 1)); + index +} diff --git a/contracts/treasury-management/src/test.rs b/contracts/treasury-management/src/test.rs new file mode 100644 index 00000000..77f18dab --- /dev/null +++ b/contracts/treasury-management/src/test.rs @@ -0,0 +1,279 @@ +#![cfg(test)] +#![allow(deprecated)] + +use soroban_sdk::testutils::{Address as _, Events}; +use soroban_sdk::{Address, Env, String, Symbol, TryFromVal, TryIntoVal, Val, Vec}; + +use crate::{Error, TreasuryManagement, TreasuryManagementClient}; + +fn zero_address(env: &Env) -> Address { + Address::from_string(&String::from_str( + env, + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", + )) +} + +fn setup<'a>(env: &Env) -> (Address, TreasuryManagementClient<'a>) { + env.mock_all_auths(); + let contract_id = env.register(TreasuryManagement, ()); + let client = TreasuryManagementClient::new(env, &contract_id); + let admin = Address::generate(env); + client.initialize(&admin); + (admin, client) +} + +fn last_event(env: &Env) -> (Vec, Val) { + let all = env.events().all(); + let events = all.events(); + let last = events.last().expect("no events emitted"); + let soroban_sdk::xdr::ContractEventBody::V0(v0) = &last.body; + let topics = Vec::::try_from_val( + env, + &soroban_sdk::xdr::ScVal::Vec(Some(v0.topics.clone().into())), + ) + .unwrap(); + let data = Val::try_from_val(env, &v0.data).unwrap(); + (topics, data) +} + +#[test] +fn test_initialize_sets_admin() { + let env = Env::default(); + let (admin, client) = setup(&env); + assert_eq!(client.get_admin(), admin); +} + +#[test] +fn test_cannot_initialize_twice() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register(TreasuryManagement, ()); + let client = TreasuryManagementClient::new(&env, &contract_id); + let admin = Address::generate(&env); + client.initialize(&admin); + assert_eq!(client.try_initialize(&admin), Err(Ok(Error::AlreadyInit))); +} + +#[test] +fn test_initialize_rejects_zero_address_admin() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register(TreasuryManagement, ()); + let client = TreasuryManagementClient::new(&env, &contract_id); + assert_eq!( + client.try_initialize(&zero_address(&env)), + Err(Ok(Error::InvalidAddress)) + ); +} + +#[test] +fn test_receive_fee_attributed_to_source() { + let env = Env::default(); + let (_admin, client) = setup(&env); + let source_a = Address::generate(&env); + let source_b = Address::generate(&env); + + client.receive_fee(&source_a, &1000); + client.receive_fee(&source_b, &500); + client.receive_fee(&source_a, &200); + + let balance = client.get_treasury_balance(); + assert_eq!(balance.total, 1700); + assert_eq!(balance.sources.len(), 2); + + // Find each source's amount regardless of insertion order in the pair + // of parallel vectors, then confirm each is attributed correctly. + let mut found_a = None; + let mut found_b = None; + for i in 0..balance.sources.len() { + let src = balance.sources.get(i).unwrap(); + let amt = balance.amounts.get(i).unwrap(); + if src == source_a { + found_a = Some(amt); + } else if src == source_b { + found_b = Some(amt); + } + } + assert_eq!(found_a, Some(1200)); + assert_eq!(found_b, Some(500)); +} + +#[test] +fn test_receive_fee_rejects_non_positive_amount() { + let env = Env::default(); + let (_admin, client) = setup(&env); + let source = Address::generate(&env); + + assert_eq!( + client.try_receive_fee(&source, &0), + Err(Ok(Error::InvalidAmount)) + ); + assert_eq!( + client.try_receive_fee(&source, &-5), + Err(Ok(Error::InvalidAmount)) + ); +} + +#[test] +fn test_allocate_routes_funds_and_reduces_balance() { + let env = Env::default(); + let (admin, client) = setup(&env); + let source = Address::generate(&env); + let destination = Address::generate(&env); + + client.receive_fee(&source, &1000); + let index = client.allocate( + &admin, + &destination, + &300, + &String::from_str(&env, "operations"), + ); + assert_eq!(index, 0); + + assert_eq!(client.get_treasury_balance().total, 700); +} + +#[test] +fn test_allocate_rejects_insufficient_balance() { + let env = Env::default(); + let (admin, client) = setup(&env); + let source = Address::generate(&env); + let destination = Address::generate(&env); + + client.receive_fee(&source, &100); + assert_eq!( + client.try_allocate(&admin, &destination, &200, &String::from_str(&env, "grant")), + Err(Ok(Error::InsufficientBalance)) + ); +} + +#[test] +fn test_allocate_rejects_non_admin() { + let env = Env::default(); + let (_admin, client) = setup(&env); + let not_admin = Address::generate(&env); + let source = Address::generate(&env); + let destination = Address::generate(&env); + + client.receive_fee(&source, &1000); + assert_eq!( + client.try_allocate( + ¬_admin, + &destination, + &100, + &String::from_str(&env, "reserve") + ), + Err(Ok(Error::Unauthorized)) + ); +} + +#[test] +fn test_allocate_rejects_empty_purpose() { + let env = Env::default(); + let (admin, client) = setup(&env); + let source = Address::generate(&env); + let destination = Address::generate(&env); + + client.receive_fee(&source, &1000); + assert_eq!( + client.try_allocate(&admin, &destination, &100, &String::from_str(&env, "")), + Err(Ok(Error::InvalidPurpose)) + ); +} + +#[test] +fn test_allocate_rejects_zero_address_destination() { + let env = Env::default(); + let (admin, client) = setup(&env); + let source = Address::generate(&env); + + client.receive_fee(&source, &1000); + assert_eq!( + client.try_allocate( + &admin, + &zero_address(&env), + &100, + &String::from_str(&env, "reserve") + ), + Err(Ok(Error::InvalidAddress)) + ); +} + +#[test] +fn test_get_allocation_history_paginated() { + let env = Env::default(); + let (admin, client) = setup(&env); + let source = Address::generate(&env); + client.receive_fee(&source, &10_000); + + for i in 0..5u32 { + let destination = Address::generate(&env); + client.allocate( + &admin, + &destination, + &(100 + i as i128), + &String::from_str(&env, "grant"), + ); + } + + assert_eq!(client.get_allocation_count(), 5); + + let page1 = client.get_allocation_history(&0, &2); + assert_eq!(page1.len(), 2); + assert_eq!(page1.get(0).unwrap().amount, 100); + assert_eq!(page1.get(1).unwrap().amount, 101); + + let page2 = client.get_allocation_history(&2, &2); + assert_eq!(page2.len(), 2); + assert_eq!(page2.get(0).unwrap().amount, 102); + assert_eq!(page2.get(1).unwrap().amount, 103); + + // Last page has fewer than `limit` remaining records. + let page3 = client.get_allocation_history(&4, &2); + assert_eq!(page3.len(), 1); + assert_eq!(page3.get(0).unwrap().amount, 104); + + // Past the end returns empty, not an error. + let page4 = client.get_allocation_history(&10, &2); + assert_eq!(page4.len(), 0); +} + +#[test] +fn test_fee_received_event_emitted() { + let env = Env::default(); + let (_admin, client) = setup(&env); + let source = Address::generate(&env); + + client.receive_fee(&source, &1000); + + let (topics, data) = last_event(&env); + assert_eq!(topics.len(), 2); + let event_name: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(event_name, Symbol::new(&env, "FeeReceived")); + let amount: i128 = data.try_into_val(&env).unwrap(); + assert_eq!(amount, 1000); +} + +#[test] +fn test_funds_allocated_event_emitted() { + let env = Env::default(); + let (admin, client) = setup(&env); + let source = Address::generate(&env); + let destination = Address::generate(&env); + + client.receive_fee(&source, &1000); + client.allocate( + &admin, + &destination, + &250, + &String::from_str(&env, "operations"), + ); + + let (topics, data) = last_event(&env); + assert_eq!(topics.len(), 2); + let event_name: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(event_name, Symbol::new(&env, "FundsAllocated")); + let (amount, purpose): (i128, String) = data.try_into_val(&env).unwrap(); + assert_eq!(amount, 250); + assert_eq!(purpose, String::from_str(&env, "operations")); +} diff --git a/contracts/treasury-management/src/types.rs b/contracts/treasury-management/src/types.rs new file mode 100644 index 00000000..6efabaa4 --- /dev/null +++ b/contracts/treasury-management/src/types.rs @@ -0,0 +1,48 @@ +//! Data types for the platform treasury management contract. + +use soroban_sdk::{contracttype, Address, String}; + +/// Storage key enum for instance and persistent storage. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum StorageKey { + /// Instance: contract admin. + Admin, + /// Instance: running total across all sources. + TotalBalance, + /// Instance: ordered, deduplicated list of every source address that + /// has ever called `receive_fee`, used to build the per-source + /// breakdown in `get_treasury_balance` (storage has no key + /// enumeration, so the set of known sources must be tracked + /// explicitly). + KnownSources, + /// Persistent: current balance attributed to one fee source. + SourceBalance(Address), + /// Instance: number of allocation records ever written, used as + /// both the next record's index and the paginated log's length. + AllocationCount, + /// Persistent: one allocation record by its index. + Allocation(u32), +} + +/// One historical allocation of treasury funds to a destination. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct AllocationRecord { + pub destination: Address, + pub amount: i128, + pub purpose: String, + pub timestamp: u64, +} + +/// Result of `get_treasury_balance`: the total balance and a per-source +/// breakdown, returned as parallel vectors since `Map` with an `Address` +/// key is not directly returnable the same way across every soroban-sdk +/// client binding, while parallel vectors are. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct TreasuryBalance { + pub total: i128, + pub sources: soroban_sdk::Vec
, + pub amounts: soroban_sdk::Vec, +} diff --git a/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_empty_purpose.1.json b/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_empty_purpose.1.json new file mode 100644 index 00000000..953c2dbd --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_empty_purpose.1.json @@ -0,0 +1,172 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "KnownSources" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "1000" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_insufficient_balance.1.json b/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_insufficient_balance.1.json new file mode 100644 index 00000000..b8dba44e --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_insufficient_balance.1.json @@ -0,0 +1,172 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "100" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "100" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "KnownSources" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "100" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_non_admin.1.json b/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_non_admin.1.json new file mode 100644 index 00000000..d2150940 --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_non_admin.1.json @@ -0,0 +1,172 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "KnownSources" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "1000" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_zero_address_destination.1.json b/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_zero_address_destination.1.json new file mode 100644 index 00000000..9570d5eb --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_allocate_rejects_zero_address_destination.1.json @@ -0,0 +1,172 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "KnownSources" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "1000" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_allocate_routes_funds_and_reduces_balance.1.json b/contracts/treasury-management/test_snapshots/test/test_allocate_routes_funds_and_reduces_balance.1.json new file mode 100644 index 00000000..835eb829 --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_allocate_routes_funds_and_reduces_balance.1.json @@ -0,0 +1,292 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "allocate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": "300" + }, + { + "string": "operations" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Allocation" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "300" + } + }, + { + "key": { + "symbol": "destination" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "purpose" + }, + "val": { + "string": "operations" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AllocationCount" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "KnownSources" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "700" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_cannot_initialize_twice.1.json b/contracts/treasury-management/test_snapshots/test/test_cannot_initialize_twice.1.json new file mode 100644 index 00000000..bdb4dab9 --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_cannot_initialize_twice.1.json @@ -0,0 +1,87 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_fee_received_event_emitted.1.json b/contracts/treasury-management/test_snapshots/test/test_fee_received_event_emitted.1.json new file mode 100644 index 00000000..ec97ccd8 --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_fee_received_event_emitted.1.json @@ -0,0 +1,195 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "KnownSources" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "1000" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "FeeReceived" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ], + "data": { + "i128": "1000" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_funds_allocated_event_emitted.1.json b/contracts/treasury-management/test_snapshots/test/test_funds_allocated_event_emitted.1.json new file mode 100644 index 00000000..fc33c179 --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_funds_allocated_event_emitted.1.json @@ -0,0 +1,322 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "allocate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": "250" + }, + { + "string": "operations" + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Allocation" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "250" + } + }, + { + "key": { + "symbol": "destination" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "purpose" + }, + "val": { + "string": "operations" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AllocationCount" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "KnownSources" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "750" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "FundsAllocated" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ], + "data": { + "vec": [ + { + "i128": "250" + }, + { + "string": "operations" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_get_allocation_history_paginated.1.json b/contracts/treasury-management/test_snapshots/test/test_get_allocation_history_paginated.1.json new file mode 100644 index 00000000..25965b26 --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_get_allocation_history_paginated.1.json @@ -0,0 +1,728 @@ +{ + "generators": { + "address": 8, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "10000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "allocate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": "100" + }, + { + "string": "grant" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "allocate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": "101" + }, + { + "string": "grant" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "allocate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "102" + }, + { + "string": "grant" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "allocate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": "103" + }, + { + "string": "grant" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "allocate", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": "104" + }, + { + "string": "grant" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Allocation" + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "destination" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "purpose" + }, + "val": { + "string": "grant" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Allocation" + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "101" + } + }, + { + "key": { + "symbol": "destination" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "purpose" + }, + "val": { + "string": "grant" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Allocation" + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "102" + } + }, + { + "key": { + "symbol": "destination" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "purpose" + }, + "val": { + "string": "grant" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Allocation" + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "103" + } + }, + { + "key": { + "symbol": "destination" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "purpose" + }, + "val": { + "string": "grant" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Allocation" + }, + { + "u32": 4 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "104" + } + }, + { + "key": { + "symbol": "destination" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "purpose" + }, + "val": { + "string": "grant" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": "0" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "10000" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AllocationCount" + } + ] + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "vec": [ + { + "symbol": "KnownSources" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "9490" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_initialize_rejects_zero_address_admin.1.json b/contracts/treasury-management/test_snapshots/test/test_initialize_rejects_zero_address_admin.1.json new file mode 100644 index 00000000..f6d4079e --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_initialize_rejects_zero_address_admin.1.json @@ -0,0 +1,61 @@ +{ + "generators": { + "address": 1, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_initialize_sets_admin.1.json b/contracts/treasury-management/test_snapshots/test/test_initialize_sets_admin.1.json new file mode 100644 index 00000000..bdb4dab9 --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_initialize_sets_admin.1.json @@ -0,0 +1,87 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_receive_fee_attributed_to_source.1.json b/contracts/treasury-management/test_snapshots/test/test_receive_fee_attributed_to_source.1.json new file mode 100644 index 00000000..38dffd11 --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_receive_fee_attributed_to_source.1.json @@ -0,0 +1,286 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "receive_fee", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "200" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1200" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "SourceBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "KnownSources" + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "1700" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/treasury-management/test_snapshots/test/test_receive_fee_rejects_non_positive_amount.1.json b/contracts/treasury-management/test_snapshots/test/test_receive_fee_rejects_non_positive_amount.1.json new file mode 100644 index 00000000..a4a084a3 --- /dev/null +++ b/contracts/treasury-management/test_snapshots/test/test_receive_fee_rejects_non_positive_amount.1.json @@ -0,0 +1,88 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalBalance" + } + ] + }, + "val": { + "i128": "0" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file From e756b85c1c5d5351b4b5a51a8675777b62ba5575 Mon Sep 17 00:00:00 2001 From: Mawuli Ejere Date: Sat, 24 Oct 2026 11:58:37 +0100 Subject: [PATCH 3/3] feat(invoice-issuer-verification): add issuer verification badge contract for trust signalling (#645) --- .../invoice-issuer-verification/Cargo.toml | 16 + .../invoice-issuer-verification/src/errors.rs | 22 ++ .../invoice-issuer-verification/src/events.rs | 32 ++ .../invoice-issuer-verification/src/lib.rs | 131 ++++++++ .../src/storage.rs | 52 +++ .../invoice-issuer-verification/src/test.rs | 311 ++++++++++++++++++ .../invoice-issuer-verification/src/types.rs | 51 +++ .../test/test_cannot_initialize_twice.1.json | 75 +++++ ...d_verification_returns_not_verified.1.json | 167 ++++++++++ .../test/test_grant_and_is_verified.1.json | 167 ++++++++++ ...nt_emits_verification_granted_event.1.json | 197 +++++++++++ ...st_grant_rejects_expiry_in_the_past.1.json | 75 +++++ ...t_grant_rejects_zero_address_issuer.1.json | 75 +++++ ...itialize_rejects_zero_address_admin.1.json | 61 ++++ .../test/test_initialize_sets_admin.1.json | 75 +++++ ...fied_false_for_never_granted_issuer.1.json | 75 +++++ ...non_admin_cannot_grant_verification.1.json | 75 +++++ ...on_admin_cannot_revoke_verification.1.json | 168 ++++++++++ ...ng_overwrites_prior_tier_and_expiry.1.json | 215 ++++++++++++ ...ke_emits_verification_revoked_event.1.json | 186 +++++++++++ ...est_revoke_fails_when_never_granted.1.json | 75 +++++ ...voke_immediately_invalidates_issuer.1.json | 166 ++++++++++ 22 files changed, 2467 insertions(+) create mode 100644 contracts/invoice-issuer-verification/Cargo.toml create mode 100644 contracts/invoice-issuer-verification/src/errors.rs create mode 100644 contracts/invoice-issuer-verification/src/events.rs create mode 100644 contracts/invoice-issuer-verification/src/lib.rs create mode 100644 contracts/invoice-issuer-verification/src/storage.rs create mode 100644 contracts/invoice-issuer-verification/src/test.rs create mode 100644 contracts/invoice-issuer-verification/src/types.rs create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_cannot_initialize_twice.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_expired_verification_returns_not_verified.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_grant_and_is_verified.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_grant_emits_verification_granted_event.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_grant_rejects_expiry_in_the_past.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_grant_rejects_zero_address_issuer.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_initialize_rejects_zero_address_admin.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_initialize_sets_admin.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_is_verified_false_for_never_granted_issuer.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_non_admin_cannot_grant_verification.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_non_admin_cannot_revoke_verification.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_re_granting_overwrites_prior_tier_and_expiry.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_emits_verification_revoked_event.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_fails_when_never_granted.1.json create mode 100644 contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_immediately_invalidates_issuer.1.json diff --git a/contracts/invoice-issuer-verification/Cargo.toml b/contracts/invoice-issuer-verification/Cargo.toml new file mode 100644 index 00000000..08e81b03 --- /dev/null +++ b/contracts/invoice-issuer-verification/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "invoice-issuer-verification" +version = "0.1.0" +edition = "2021" +# Deployed as WASM, never published to crates.io. +publish = false +description = "StellarSettle invoice issuer verification badge contract" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +soroban-sdk = { workspace = true } + +[dev-dependencies] +soroban-sdk = { workspace = true, features = ["testutils"] } diff --git a/contracts/invoice-issuer-verification/src/errors.rs b/contracts/invoice-issuer-verification/src/errors.rs new file mode 100644 index 00000000..4d20f65d --- /dev/null +++ b/contracts/invoice-issuer-verification/src/errors.rs @@ -0,0 +1,22 @@ +//! Error types for the invoice issuer verification badge contract. + +use soroban_sdk::contracterror; + +/// Errors that can occur during contract execution. +#[contracterror] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[repr(u32)] +pub enum Error { + /// Contract has already been initialized. + AlreadyInit = 1, + /// Contract has not been initialized. + NotInit = 2, + /// Caller is not the admin. + Unauthorized = 3, + /// Address is the zero address (all-zero 32-byte key). + InvalidAddress = 4, + /// expiry_timestamp must be in the future relative to the current ledger time. + InvalidExpiry = 5, + /// No verification record exists for this issuer. + NotVerified = 6, +} diff --git a/contracts/invoice-issuer-verification/src/events.rs b/contracts/invoice-issuer-verification/src/events.rs new file mode 100644 index 00000000..4c27092e --- /dev/null +++ b/contracts/invoice-issuer-verification/src/events.rs @@ -0,0 +1,32 @@ +#![allow(deprecated)] +//! Events emitted by the invoice issuer verification badge contract. + +use soroban_sdk::{Address, Env, Symbol}; + +use crate::types::VerificationTier; + +/// Emitted when the contract is initialized. +pub fn initialized(env: &Env, admin: &Address) { + let topics = (Symbol::new(env, "initialized"),); + env.events().publish(topics, admin.clone()); +} + +/// Emitted when an issuer is granted (or re-granted) verification. +/// Topics: (VerificationGranted, issuer); Data: (tier, expiry_timestamp). +pub fn verification_granted( + env: &Env, + issuer: &Address, + tier: VerificationTier, + expiry_timestamp: u64, +) { + let topics = (Symbol::new(env, "VerificationGranted"), issuer.clone()); + env.events() + .publish(topics, (tier as u32, expiry_timestamp)); +} + +/// Emitted when an issuer's verification is revoked. +/// Topics: (VerificationRevoked, issuer); Data: (). +pub fn verification_revoked(env: &Env, issuer: &Address) { + let topics = (Symbol::new(env, "VerificationRevoked"), issuer.clone()); + env.events().publish(topics, ()); +} diff --git a/contracts/invoice-issuer-verification/src/lib.rs b/contracts/invoice-issuer-verification/src/lib.rs new file mode 100644 index 00000000..fc5dca19 --- /dev/null +++ b/contracts/invoice-issuer-verification/src/lib.rs @@ -0,0 +1,131 @@ +//! Invoice issuer verification badge contract for StellarSettle. +//! +//! The admin grants a verification tier to an issuer wallet after it has +//! passed off-chain due diligence. The badge, visible via `is_verified`, is +//! a trust signal displayed alongside an issuer's invoices to investors. +//! Verification expires automatically at `expiry_timestamp` and can also be +//! revoked immediately by the admin before that. + +#![no_std] + +mod errors; +mod events; +mod storage; +mod types; + +pub use types::{VerificationRecord, VerificationStatus, VerificationTier}; + +use soroban_sdk::{contract, contractimpl, Address, Env, String}; + +use errors::Error; + +/// Reject the zero address (all-zero 32-byte Ed25519 key). +fn ensure_non_zero_address(env: &Env, address: &Address) -> Result<(), Error> { + let zero_str = String::from_str( + env, + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", + ); + let zero = Address::from_string(&zero_str); + if *address == zero { + return Err(Error::InvalidAddress); + } + Ok(()) +} + +#[contract] +pub struct InvoiceIssuerVerification; + +#[contractimpl] +impl InvoiceIssuerVerification { + /// Initialize the contract with the admin allowed to grant/revoke verification. + pub fn initialize(env: Env, admin: Address) -> Result<(), Error> { + ensure_non_zero_address(&env, &admin)?; + if storage::get_admin(&env).is_some() { + return Err(Error::AlreadyInit); + } + storage::set_admin(&env, &admin); + events::initialized(&env, &admin); + Ok(()) + } + + /// Admin-only: grant (or re-grant, overwriting any existing record) + /// a verification tier to `issuer_wallet`, valid until `expiry_timestamp`. + pub fn grant_verification( + env: Env, + admin: Address, + issuer_wallet: Address, + tier: VerificationTier, + expiry_timestamp: u64, + ) -> Result<(), Error> { + let stored_admin = storage::get_admin(&env).ok_or(Error::NotInit)?; + if admin != stored_admin { + return Err(Error::Unauthorized); + } + admin.require_auth(); + ensure_non_zero_address(&env, &issuer_wallet)?; + + if expiry_timestamp <= env.ledger().timestamp() { + return Err(Error::InvalidExpiry); + } + + let record = VerificationRecord { + tier, + expiry_timestamp, + }; + storage::set_verification(&env, &issuer_wallet, &record); + events::verification_granted(&env, &issuer_wallet, tier, expiry_timestamp); + Ok(()) + } + + /// Admin-only: immediately revoke `issuer_wallet`'s verification, + /// regardless of its current expiry. `is_verified` returns false for + /// this wallet right after this call, in the same transaction. + pub fn revoke_verification( + env: Env, + admin: Address, + issuer_wallet: Address, + ) -> Result<(), Error> { + let stored_admin = storage::get_admin(&env).ok_or(Error::NotInit)?; + if admin != stored_admin { + return Err(Error::Unauthorized); + } + admin.require_auth(); + + if storage::get_verification(&env, &issuer_wallet).is_none() { + return Err(Error::NotVerified); + } + storage::remove_verification(&env, &issuer_wallet); + events::verification_revoked(&env, &issuer_wallet); + Ok(()) + } + + /// View: whether `issuer_wallet` currently holds a non-expired + /// verification, and if so, its tier and expiry. A verification whose + /// `expiry_timestamp` is at or before the current ledger time is + /// treated as not verified without needing a separate expiry call — + /// expiry is read-time, not an action that mutates storage. + pub fn is_verified(env: Env, issuer_wallet: Address) -> VerificationStatus { + match storage::get_verification(&env, &issuer_wallet) { + Some(record) if record.expiry_timestamp > env.ledger().timestamp() => { + VerificationStatus { + verified: true, + tier: record.tier, + expiry_timestamp: record.expiry_timestamp, + } + } + _ => VerificationStatus { + verified: false, + tier: VerificationTier::BasicVerified, + expiry_timestamp: 0, + }, + } + } + + /// View: return the current admin. + pub fn get_admin(env: Env) -> Result { + storage::get_admin(&env).ok_or(Error::NotInit) + } +} + +#[cfg(test)] +mod test; diff --git a/contracts/invoice-issuer-verification/src/storage.rs b/contracts/invoice-issuer-verification/src/storage.rs new file mode 100644 index 00000000..4885a3c3 --- /dev/null +++ b/contracts/invoice-issuer-verification/src/storage.rs @@ -0,0 +1,52 @@ +//! Storage helpers for the invoice issuer verification badge contract. + +use soroban_sdk::{Address, Env}; + +use crate::types::{StorageKey, VerificationRecord}; + +/// Ledgers below which a persistent entry's TTL is extended (~7 days at 5s/ledger). +pub const TTL_THRESHOLD: u32 = 120_960; +/// Minimum TTL extension in ledger units (~60 days at 5s/ledger). +pub const MIN_TTL_EXTEND: u32 = 1_036_800; + +pub fn set_admin(env: &Env, admin: &Address) { + env.storage().instance().set(&StorageKey::Admin, admin); + env.storage() + .instance() + .extend_ttl(TTL_THRESHOLD, MIN_TTL_EXTEND); +} + +pub fn get_admin(env: &Env) -> Option
{ + env.storage() + .instance() + .extend_ttl(TTL_THRESHOLD, MIN_TTL_EXTEND); + env.storage().instance().get(&StorageKey::Admin) +} + +/// Load the verification record stored for `issuer`, or `None` if it was +/// never granted (or was revoked). +pub fn get_verification(env: &Env, issuer: &Address) -> Option { + let key = StorageKey::Verification(issuer.clone()); + let data = env.storage().persistent().get(&key); + if data.is_some() { + env.storage() + .persistent() + .extend_ttl(&key, TTL_THRESHOLD, MIN_TTL_EXTEND); + } + data +} + +/// Save (or overwrite) the verification record for `issuer`. +pub fn set_verification(env: &Env, issuer: &Address, record: &VerificationRecord) { + let key = StorageKey::Verification(issuer.clone()); + env.storage().persistent().set(&key, record); + env.storage() + .persistent() + .extend_ttl(&key, TTL_THRESHOLD, MIN_TTL_EXTEND); +} + +/// Remove the verification record for `issuer` entirely (used by revoke). +pub fn remove_verification(env: &Env, issuer: &Address) { + let key = StorageKey::Verification(issuer.clone()); + env.storage().persistent().remove(&key); +} diff --git a/contracts/invoice-issuer-verification/src/test.rs b/contracts/invoice-issuer-verification/src/test.rs new file mode 100644 index 00000000..195685cd --- /dev/null +++ b/contracts/invoice-issuer-verification/src/test.rs @@ -0,0 +1,311 @@ +#![cfg(test)] +#![allow(deprecated)] + +use soroban_sdk::testutils::{Address as _, Events, Ledger}; +use soroban_sdk::{Address, Env, String, Symbol, TryFromVal, TryIntoVal, Val, Vec}; + +use crate::types::VerificationTier; +use crate::{Error, InvoiceIssuerVerification, InvoiceIssuerVerificationClient}; + +fn zero_address(env: &Env) -> Address { + Address::from_string(&String::from_str( + env, + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", + )) +} + +fn setup<'a>(env: &Env) -> (Address, InvoiceIssuerVerificationClient<'a>) { + env.mock_all_auths(); + let contract_id = env.register(InvoiceIssuerVerification, ()); + let client = InvoiceIssuerVerificationClient::new(env, &contract_id); + let admin = Address::generate(env); + client.initialize(&admin); + (admin, client) +} + +/// Returns the topics and data of the most recently emitted event on `env`, +/// decoded from its raw XDR form. +fn last_event(env: &Env) -> (Vec, Val) { + let all = env.events().all(); + let events = all.events(); + let last = events.last().expect("no events emitted"); + let soroban_sdk::xdr::ContractEventBody::V0(v0) = &last.body; + let topics = Vec::::try_from_val( + env, + &soroban_sdk::xdr::ScVal::Vec(Some(v0.topics.clone().into())), + ) + .unwrap(); + let data = Val::try_from_val(env, &v0.data).unwrap(); + (topics, data) +} + +#[test] +fn test_initialize_sets_admin() { + let env = Env::default(); + let (admin, client) = setup(&env); + assert_eq!(client.get_admin(), admin); +} + +#[test] +fn test_cannot_initialize_twice() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register(InvoiceIssuerVerification, ()); + let client = InvoiceIssuerVerificationClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + client.initialize(&admin); + assert_eq!(client.try_initialize(&admin), Err(Ok(Error::AlreadyInit))); +} + +#[test] +fn test_initialize_rejects_zero_address_admin() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register(InvoiceIssuerVerification, ()); + let client = InvoiceIssuerVerificationClient::new(&env, &contract_id); + + assert_eq!( + client.try_initialize(&zero_address(&env)), + Err(Ok(Error::InvalidAddress)) + ); +} + +#[test] +fn test_grant_and_is_verified() { + let env = Env::default(); + let (_admin, client) = setup(&env); + let issuer = Address::generate(&env); + + let now = env.ledger().timestamp(); + client.grant_verification( + &_admin, + &issuer, + &VerificationTier::EnhancedVerified, + &(now + 1000), + ); + + let status = client.is_verified(&issuer); + assert!(status.verified); + assert_eq!(status.tier, VerificationTier::EnhancedVerified); + assert_eq!(status.expiry_timestamp, now + 1000); +} + +#[test] +fn test_is_verified_false_for_never_granted_issuer() { + let env = Env::default(); + let (_admin, client) = setup(&env); + let issuer = Address::generate(&env); + + let status = client.is_verified(&issuer); + assert!(!status.verified); + assert_eq!(status.tier, VerificationTier::BasicVerified); + assert_eq!(status.expiry_timestamp, 0); +} + +#[test] +fn test_expired_verification_returns_not_verified() { + let env = Env::default(); + let (_admin, client) = setup(&env); + let issuer = Address::generate(&env); + + let now = env.ledger().timestamp(); + client.grant_verification( + &_admin, + &issuer, + &VerificationTier::BasicVerified, + &(now + 100), + ); + + // Advance ledger time past expiry. + env.ledger().set_timestamp(now + 200); + + let status = client.is_verified(&issuer); + assert!(!status.verified); + assert_eq!(status.tier, VerificationTier::BasicVerified); + assert_eq!(status.expiry_timestamp, 0); +} + +#[test] +fn test_grant_rejects_expiry_in_the_past() { + let env = Env::default(); + let (_admin, client) = setup(&env); + let issuer = Address::generate(&env); + + let now = env.ledger().timestamp(); + // Advance so that `now` itself is in the past relative to the ledger + // when we try to grant with that stale timestamp as expiry. + env.ledger().set_timestamp(now + 100); + + assert_eq!( + client.try_grant_verification(&_admin, &issuer, &VerificationTier::BasicVerified, &now), + Err(Ok(Error::InvalidExpiry)) + ); +} + +#[test] +fn test_grant_rejects_zero_address_issuer() { + let env = Env::default(); + let (admin, client) = setup(&env); + let now = env.ledger().timestamp(); + + assert_eq!( + client.try_grant_verification( + &admin, + &zero_address(&env), + &VerificationTier::BasicVerified, + &(now + 1000) + ), + Err(Ok(Error::InvalidAddress)) + ); +} + +#[test] +fn test_non_admin_cannot_grant_verification() { + let env = Env::default(); + let (_admin, client) = setup(&env); + let not_admin = Address::generate(&env); + let issuer = Address::generate(&env); + let now = env.ledger().timestamp(); + + assert_eq!( + client.try_grant_verification( + ¬_admin, + &issuer, + &VerificationTier::BasicVerified, + &(now + 1000) + ), + Err(Ok(Error::Unauthorized)) + ); +} + +#[test] +fn test_revoke_immediately_invalidates_issuer() { + let env = Env::default(); + let (admin, client) = setup(&env); + let issuer = Address::generate(&env); + let now = env.ledger().timestamp(); + + client.grant_verification( + &admin, + &issuer, + &VerificationTier::Institutional, + &(now + 10_000), + ); + assert!(client.is_verified(&issuer).verified); + + client.revoke_verification(&admin, &issuer); + + let status = client.is_verified(&issuer); + assert!(!status.verified); + assert_eq!(status.tier, VerificationTier::BasicVerified); +} + +#[test] +fn test_non_admin_cannot_revoke_verification() { + let env = Env::default(); + let (admin, client) = setup(&env); + let not_admin = Address::generate(&env); + let issuer = Address::generate(&env); + let now = env.ledger().timestamp(); + + client.grant_verification( + &admin, + &issuer, + &VerificationTier::BasicVerified, + &(now + 1000), + ); + + assert_eq!( + client.try_revoke_verification(¬_admin, &issuer), + Err(Ok(Error::Unauthorized)) + ); + // Still verified, since the unauthorized revoke must not have taken effect. + assert!(client.is_verified(&issuer).verified); +} + +#[test] +fn test_revoke_fails_when_never_granted() { + let env = Env::default(); + let (admin, client) = setup(&env); + let issuer = Address::generate(&env); + + assert_eq!( + client.try_revoke_verification(&admin, &issuer), + Err(Ok(Error::NotVerified)) + ); +} + +#[test] +fn test_grant_emits_verification_granted_event() { + let env = Env::default(); + let (admin, client) = setup(&env); + let issuer = Address::generate(&env); + let now = env.ledger().timestamp(); + + client.grant_verification( + &admin, + &issuer, + &VerificationTier::Institutional, + &(now + 500), + ); + + let (topics, data) = last_event(&env); + assert_eq!(topics.len(), 2); + let event_name: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(event_name, Symbol::new(&env, "VerificationGranted")); + let event_issuer: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + assert_eq!(event_issuer, issuer); + let (tier, expiry): (u32, u64) = data.try_into_val(&env).unwrap(); + assert_eq!(tier, VerificationTier::Institutional as u32); + assert_eq!(expiry, now + 500); +} + +#[test] +fn test_revoke_emits_verification_revoked_event() { + let env = Env::default(); + let (admin, client) = setup(&env); + let issuer = Address::generate(&env); + let now = env.ledger().timestamp(); + + client.grant_verification( + &admin, + &issuer, + &VerificationTier::BasicVerified, + &(now + 500), + ); + client.revoke_verification(&admin, &issuer); + + let (topics, _data) = last_event(&env); + assert_eq!(topics.len(), 2); + let event_name: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap(); + assert_eq!(event_name, Symbol::new(&env, "VerificationRevoked")); + let event_issuer: Address = topics.get(1).unwrap().try_into_val(&env).unwrap(); + assert_eq!(event_issuer, issuer); +} + +#[test] +fn test_re_granting_overwrites_prior_tier_and_expiry() { + let env = Env::default(); + let (admin, client) = setup(&env); + let issuer = Address::generate(&env); + let now = env.ledger().timestamp(); + + client.grant_verification( + &admin, + &issuer, + &VerificationTier::BasicVerified, + &(now + 100), + ); + client.grant_verification( + &admin, + &issuer, + &VerificationTier::Institutional, + &(now + 9999), + ); + + let status = client.is_verified(&issuer); + assert!(status.verified); + assert_eq!(status.tier, VerificationTier::Institutional); + assert_eq!(status.expiry_timestamp, now + 9999); +} diff --git a/contracts/invoice-issuer-verification/src/types.rs b/contracts/invoice-issuer-verification/src/types.rs new file mode 100644 index 00000000..d3fcd25c --- /dev/null +++ b/contracts/invoice-issuer-verification/src/types.rs @@ -0,0 +1,51 @@ +//! Data types for the invoice issuer verification badge contract. + +use soroban_sdk::{contracttype, Address}; + +/// Storage key enum for instance and persistent storage. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum StorageKey { + /// Instance: contract admin. + Admin, + /// Persistent: verification record for an issuer wallet. + Verification(Address), +} + +/// Verification tier granted to an issuer after due diligence. +#[contracttype] +#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)] +#[repr(u32)] +pub enum VerificationTier { + /// Baseline KYC/KYB checks passed. + BasicVerified = 0, + /// Additional document and financial review passed. + EnhancedVerified = 1, + /// Institutional-grade due diligence passed (e.g. regulated entity). + Institutional = 2, +} + +/// A verification record stored for one issuer wallet. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct VerificationRecord { + pub tier: VerificationTier, + /// Unix timestamp after which this verification is no longer valid. + pub expiry_timestamp: u64, +} + +/// Result of `is_verified`: whether the issuer currently holds a +/// non-expired verification, and if so, its tier and expiry. +/// +/// `tier`/`expiry_timestamp` are only meaningful when `verified` is true; +/// when `verified` is false they are `VerificationTier::BasicVerified` and +/// `0` respectively (sentinel values, not a real grant), since +/// `Option` cannot currently round-trip through +/// `#[contracttype]`'s generated `ScVal` conversion for a custom enum. +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct VerificationStatus { + pub verified: bool, + pub tier: VerificationTier, + pub expiry_timestamp: u64, +} diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_cannot_initialize_twice.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_cannot_initialize_twice.1.json new file mode 100644 index 00000000..7e8103d1 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_cannot_initialize_twice.1.json @@ -0,0 +1,75 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_expired_verification_returns_not_verified.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_expired_verification_returns_not_verified.1.json new file mode 100644 index 00000000..f8d2df43 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_expired_verification_returns_not_verified.1.json @@ -0,0 +1,167 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "grant_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + }, + { + "u64": "100" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 200, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Verification" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "expiry_timestamp" + }, + "val": { + "u64": "100" + } + }, + { + "key": { + "symbol": "tier" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_and_is_verified.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_and_is_verified.1.json new file mode 100644 index 00000000..66d661e8 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_and_is_verified.1.json @@ -0,0 +1,167 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "grant_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 1 + }, + { + "u64": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Verification" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "expiry_timestamp" + }, + "val": { + "u64": "1000" + } + }, + { + "key": { + "symbol": "tier" + }, + "val": { + "u32": 1 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_emits_verification_granted_event.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_emits_verification_granted_event.1.json new file mode 100644 index 00000000..1039913d --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_emits_verification_granted_event.1.json @@ -0,0 +1,197 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "grant_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 2 + }, + { + "u64": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Verification" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "expiry_timestamp" + }, + "val": { + "u64": "500" + } + }, + { + "key": { + "symbol": "tier" + }, + "val": { + "u32": 2 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "VerificationGranted" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ], + "data": { + "vec": [ + { + "u32": 2 + }, + { + "u64": "500" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_rejects_expiry_in_the_past.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_rejects_expiry_in_the_past.1.json new file mode 100644 index 00000000..d3886fe6 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_rejects_expiry_in_the_past.1.json @@ -0,0 +1,75 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "sequence_number": 0, + "timestamp": 100, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_rejects_zero_address_issuer.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_rejects_zero_address_issuer.1.json new file mode 100644 index 00000000..7e8103d1 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_grant_rejects_zero_address_issuer.1.json @@ -0,0 +1,75 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_initialize_rejects_zero_address_admin.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_initialize_rejects_zero_address_admin.1.json new file mode 100644 index 00000000..f6d4079e --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_initialize_rejects_zero_address_admin.1.json @@ -0,0 +1,61 @@ +{ + "generators": { + "address": 1, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_initialize_sets_admin.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_initialize_sets_admin.1.json new file mode 100644 index 00000000..7e8103d1 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_initialize_sets_admin.1.json @@ -0,0 +1,75 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_is_verified_false_for_never_granted_issuer.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_is_verified_false_for_never_granted_issuer.1.json new file mode 100644 index 00000000..37e77575 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_is_verified_false_for_never_granted_issuer.1.json @@ -0,0 +1,75 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_non_admin_cannot_grant_verification.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_non_admin_cannot_grant_verification.1.json new file mode 100644 index 00000000..3203b696 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_non_admin_cannot_grant_verification.1.json @@ -0,0 +1,75 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_non_admin_cannot_revoke_verification.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_non_admin_cannot_revoke_verification.1.json new file mode 100644 index 00000000..6a4dd194 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_non_admin_cannot_revoke_verification.1.json @@ -0,0 +1,168 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "grant_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "u32": 0 + }, + { + "u64": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Verification" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "expiry_timestamp" + }, + "val": { + "u64": "1000" + } + }, + { + "key": { + "symbol": "tier" + }, + "val": { + "u32": 0 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_re_granting_overwrites_prior_tier_and_expiry.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_re_granting_overwrites_prior_tier_and_expiry.1.json new file mode 100644 index 00000000..9041dc0f --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_re_granting_overwrites_prior_tier_and_expiry.1.json @@ -0,0 +1,215 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "grant_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + }, + { + "u64": "100" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "grant_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 2 + }, + { + "u64": "9999" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Verification" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "expiry_timestamp" + }, + "val": { + "u64": "9999" + } + }, + { + "key": { + "symbol": "tier" + }, + "val": { + "u32": 2 + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_emits_verification_revoked_event.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_emits_verification_revoked_event.1.json new file mode 100644 index 00000000..570abf72 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_emits_verification_revoked_event.1.json @@ -0,0 +1,186 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "grant_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + }, + { + "u64": "500" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "revoke_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "VerificationRevoked" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ], + "data": "void" + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_fails_when_never_granted.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_fails_when_never_granted.1.json new file mode 100644 index 00000000..37e77575 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_fails_when_never_granted.1.json @@ -0,0 +1,75 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_immediately_invalidates_issuer.1.json b/contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_immediately_invalidates_issuer.1.json new file mode 100644 index 00000000..cf11f323 --- /dev/null +++ b/contracts/invoice-issuer-verification/test_snapshots/test/test_revoke_immediately_invalidates_issuer.1.json @@ -0,0 +1,166 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "grant_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 2 + }, + { + "u64": "10000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "revoke_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 27, + "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": [ + { + "entry": { + "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": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1036800 + } + ] + }, + "events": [] +} \ No newline at end of file