diff --git a/Cargo.lock b/Cargo.lock
index 17a99f6..9aa43d8 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 5d54cae..61e63c3 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/invoice-issuer-verification/Cargo.toml b/contracts/invoice-issuer-verification/Cargo.toml
new file mode 100644
index 0000000..08e81b0
--- /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 0000000..4d20f65
--- /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 0000000..4c27092
--- /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 0000000..fc5dca1
--- /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 0000000..4885a3c
--- /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 0000000..195685c
--- /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 0000000..d3fcd25
--- /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 0000000..7e8103d
--- /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 0000000..f8d2df4
--- /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 0000000..66d661e
--- /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 0000000..1039913
--- /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 0000000..d3886fe
--- /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 0000000..7e8103d
--- /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 0000000..f6d4079
--- /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 0000000..7e8103d
--- /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 0000000..37e7757
--- /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 0000000..3203b69
--- /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 0000000..6a4dd19
--- /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 0000000..9041dc0
--- /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 0000000..570abf7
--- /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 0000000..37e7757
--- /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 0000000..cf11f32
--- /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
diff --git a/contracts/secondary-trade-history/Cargo.toml b/contracts/secondary-trade-history/Cargo.toml
new file mode 100644
index 0000000..ff999d0
--- /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 0000000..4d4ae8f
--- /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 0000000..59dac93
--- /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 0000000..0cb4174
--- /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 0000000..aacb7b3
--- /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 0000000..e2919cc
--- /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 0000000..0709109
--- /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 0000000..eee7236
--- /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 0000000..eee7236
--- /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 0000000..7a20dc3
--- /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 0000000..b29d3b7
--- /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 0000000..078cf8b
--- /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 0000000..22c35f3
--- /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 0000000..b82a922
--- /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 0000000..9086e1f
--- /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 0000000..6a70cd1
--- /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 0000000..0e3faab
--- /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 0000000..870dc5c
--- /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 0000000..391169f
--- /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
diff --git a/contracts/treasury-management/Cargo.toml b/contracts/treasury-management/Cargo.toml
new file mode 100644
index 0000000..68d53c2
--- /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 0000000..e17d710
--- /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 0000000..e3abd5f
--- /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 0000000..25924ee
--- /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 0000000..f024136
--- /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 0000000..77f18da
--- /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 0000000..6efabaa
--- /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 0000000..953c2db
--- /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 0000000..b8dba44
--- /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 0000000..d215094
--- /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 0000000..9570d5e
--- /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 0000000..835eb82
--- /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 0000000..bdb4dab
--- /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 0000000..ec97ccd
--- /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 0000000..fc33c17
--- /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 0000000..25965b2
--- /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 0000000..f6d4079
--- /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 0000000..bdb4dab
--- /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 0000000..38dffd1
--- /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 0000000..a4a084a
--- /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