From 809de2bfc5043f0b9766588b0c0c99da08e575c0 Mon Sep 17 00:00:00 2001 From: Tu Pham Date: Mon, 25 May 2026 17:25:08 +0700 Subject: [PATCH] feat: add typed escrow storage helpers --- contracts/escrow/src/lib.rs | 94 +-- contracts/escrow/src/storage.rs | 222 +++++ contracts/escrow/src/test.rs | 32 +- ...in_and_fee_config_helpers_roundtrip.1.json | 103 +++ ...nter_helper_allocates_monotonic_ids.1.json | 74 ++ .../test/escrow_helpers_roundtrip.1.json | 144 ++++ ...or_and_buyer_indexes_accumulate_ids.1.json | 103 +++ .../test/test_auto_release.1.json | 38 + ...st_auto_release_before_window_fails.1.json | 38 + .../test/test_confirm_delivery.1.json | 38 + .../test/test_create_escrow.1.json | 19 + .../test/test_fund_escrow.1.json | 38 + .../test_fund_non_pending_escrow_fails.1.json | 38 + .../test/test_multiple_escrows.1.json | 44 + ...se_and_resolve_dispute_refund_buyer.1.json | 38 + ...d_resolve_dispute_release_to_seller.1.json | 38 + .../test/test_vendor_and_buyer_indexes.1.json | 757 ++++++++++++++++++ 17 files changed, 1791 insertions(+), 67 deletions(-) create mode 100644 contracts/escrow/src/storage.rs create mode 100644 contracts/escrow/test_snapshots/storage/test/admin_and_fee_config_helpers_roundtrip.1.json create mode 100644 contracts/escrow/test_snapshots/storage/test/counter_helper_allocates_monotonic_ids.1.json create mode 100644 contracts/escrow/test_snapshots/storage/test/escrow_helpers_roundtrip.1.json create mode 100644 contracts/escrow/test_snapshots/storage/test/vendor_and_buyer_indexes_accumulate_ids.1.json create mode 100644 contracts/escrow/test_snapshots/test/test_vendor_and_buyer_indexes.1.json diff --git a/contracts/escrow/src/lib.rs b/contracts/escrow/src/lib.rs index 0570e9c9..dcff6bb7 100644 --- a/contracts/escrow/src/lib.rs +++ b/contracts/escrow/src/lib.rs @@ -1,11 +1,8 @@ #![no_std] -use soroban_sdk::{contract, contractimpl, contracttype, token, Address, Env}; +use soroban_sdk::{contract, contractimpl, contracttype, token, Address, Env, Vec}; -#[contracttype] -pub enum DataKey { - Escrow(u32), - EscrowCount, -} +pub mod storage; +pub use storage::{DataKey, FeeConfig}; #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] @@ -46,15 +43,10 @@ impl Escrow { ) -> u32 { seller.require_auth(); - let mut count: u32 = env - .storage() - .instance() - .get(&DataKey::EscrowCount) - .unwrap_or(0); - count += 1; + let escrow_id = storage::next_escrow_id(&env); let escrow = EscrowData { - seller, + seller: seller.clone(), buyer: None, resolver, token, @@ -64,25 +56,17 @@ impl Escrow { state: EscrowState::Pending, }; - env.storage() - .instance() - .set(&DataKey::Escrow(count), &escrow); - env.storage() - .instance() - .set(&DataKey::EscrowCount, &count); + storage::write_escrow(&env, escrow_id, &escrow); + storage::append_vendor_escrow(&env, &seller, escrow_id); - env.events().publish(("create_escrow",), count); - count + env.events().publish(("create_escrow",), escrow_id); + escrow_id } pub fn fund_escrow(env: Env, escrow_id: u32, buyer: Address) { buyer.require_auth(); - let mut escrow: EscrowData = env - .storage() - .instance() - .get(&DataKey::Escrow(escrow_id)) - .expect("escrow not found"); + let mut escrow: EscrowData = storage::require_escrow(&env, escrow_id); assert!(escrow.state == EscrowState::Pending, "escrow not pending"); @@ -93,18 +77,13 @@ impl Escrow { let token_client = token::Client::new(&env, &escrow.token); token_client.transfer(&buyer, &env.current_contract_address(), &escrow.amount); - env.storage() - .instance() - .set(&DataKey::Escrow(escrow_id), &escrow); + storage::write_escrow(&env, escrow_id, &escrow); + storage::append_buyer_escrow(&env, &buyer, escrow_id); env.events().publish(("fund_escrow",), escrow_id); } pub fn confirm_delivery(env: Env, escrow_id: u32) { - let escrow: EscrowData = env - .storage() - .instance() - .get(&DataKey::Escrow(escrow_id)) - .expect("escrow not found"); + let escrow: EscrowData = storage::require_escrow(&env, escrow_id); assert!(escrow.state == EscrowState::Funded, "escrow not funded"); @@ -121,18 +100,12 @@ impl Escrow { let mut updated = escrow; updated.state = EscrowState::Completed; - env.storage() - .instance() - .set(&DataKey::Escrow(escrow_id), &updated); + storage::write_escrow(&env, escrow_id, &updated); env.events().publish(("confirm_delivery",), escrow_id); } pub fn raise_dispute(env: Env, escrow_id: u32) { - let escrow: EscrowData = env - .storage() - .instance() - .get(&DataKey::Escrow(escrow_id)) - .expect("escrow not found"); + let escrow: EscrowData = storage::require_escrow(&env, escrow_id); assert!(escrow.state == EscrowState::Funded, "escrow not funded"); @@ -142,18 +115,12 @@ impl Escrow { let mut updated = escrow; updated.state = EscrowState::Disputed; - env.storage() - .instance() - .set(&DataKey::Escrow(escrow_id), &updated); + storage::write_escrow(&env, escrow_id, &updated); env.events().publish(("raise_dispute",), escrow_id); } pub fn resolve_dispute(env: Env, escrow_id: u32, release_to_seller: bool) { - let escrow: EscrowData = env - .storage() - .instance() - .get(&DataKey::Escrow(escrow_id)) - .expect("escrow not found"); + let escrow: EscrowData = storage::require_escrow(&env, escrow_id); assert!(escrow.state == EscrowState::Disputed, "escrow not disputed"); @@ -181,19 +148,13 @@ impl Escrow { EscrowState::Refunded }; - env.storage() - .instance() - .set(&DataKey::Escrow(escrow_id), &updated); + storage::write_escrow(&env, escrow_id, &updated); env.events() .publish(("resolve_dispute",), (escrow_id, release_to_seller)); } pub fn auto_release(env: Env, escrow_id: u32) { - let escrow: EscrowData = env - .storage() - .instance() - .get(&DataKey::Escrow(escrow_id)) - .expect("escrow not found"); + let escrow: EscrowData = storage::require_escrow(&env, escrow_id); assert!(escrow.state == EscrowState::Funded, "escrow not funded"); assert!( @@ -211,17 +172,20 @@ impl Escrow { let mut updated = escrow; updated.state = EscrowState::Completed; - env.storage() - .instance() - .set(&DataKey::Escrow(escrow_id), &updated); + storage::write_escrow(&env, escrow_id, &updated); env.events().publish(("auto_release",), escrow_id); } pub fn get_escrow(env: Env, escrow_id: u32) -> EscrowData { - env.storage() - .instance() - .get(&DataKey::Escrow(escrow_id)) - .expect("escrow not found") + storage::require_escrow(&env, escrow_id) + } + + pub fn get_escrows_by_vendor(env: Env, vendor: Address) -> Vec { + storage::read_vendor_index(&env, &vendor) + } + + pub fn get_escrows_by_buyer(env: Env, buyer: Address) -> Vec { + storage::read_buyer_index(&env, &buyer) } } diff --git a/contracts/escrow/src/storage.rs b/contracts/escrow/src/storage.rs new file mode 100644 index 00000000..af05a762 --- /dev/null +++ b/contracts/escrow/src/storage.rs @@ -0,0 +1,222 @@ +use soroban_sdk::{contracttype, Address, Env, Vec}; + +use crate::EscrowData; + +#[contracttype] +pub enum DataKey { + Escrow(u32), + VendorEscrows(Address), + BuyerEscrows(Address), + EscrowCount, + Admin, + FeeConfig, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct FeeConfig { + pub recipient: Option
, + pub fee_bps: u32, +} + +impl FeeConfig { + pub fn disabled() -> Self { + Self { + recipient: None, + fee_bps: 0, + } + } +} + +// Instance storage is used for all helpers because these records are core +// contract-instance state. They must survive across ledgers with the contract, +// but they do not need temporary storage or cross-instance persistent buckets. +pub fn read_escrow(env: &Env, escrow_id: u32) -> Option { + env.storage().instance().get(&DataKey::Escrow(escrow_id)) +} + +pub fn require_escrow(env: &Env, escrow_id: u32) -> EscrowData { + read_escrow(env, escrow_id).expect("escrow not found") +} + +pub fn write_escrow(env: &Env, escrow_id: u32, escrow: &EscrowData) { + env.storage() + .instance() + .set(&DataKey::Escrow(escrow_id), escrow); +} + +pub fn read_escrow_count(env: &Env) -> u32 { + env.storage() + .instance() + .get(&DataKey::EscrowCount) + .unwrap_or(0) +} + +pub fn write_escrow_count(env: &Env, count: u32) { + env.storage().instance().set(&DataKey::EscrowCount, &count); +} + +pub fn next_escrow_id(env: &Env) -> u32 { + let next = read_escrow_count(env) + 1; + write_escrow_count(env, next); + next +} + +pub fn read_vendor_index(env: &Env, vendor: &Address) -> Vec { + env.storage() + .instance() + .get(&DataKey::VendorEscrows(vendor.clone())) + .unwrap_or_else(|| Vec::new(env)) +} + +pub fn write_vendor_index(env: &Env, vendor: &Address, escrow_ids: &Vec) { + env.storage() + .instance() + .set(&DataKey::VendorEscrows(vendor.clone()), escrow_ids); +} + +pub fn append_vendor_escrow(env: &Env, vendor: &Address, escrow_id: u32) { + let mut escrow_ids = read_vendor_index(env, vendor); + escrow_ids.push_back(escrow_id); + write_vendor_index(env, vendor, &escrow_ids); +} + +pub fn read_buyer_index(env: &Env, buyer: &Address) -> Vec { + env.storage() + .instance() + .get(&DataKey::BuyerEscrows(buyer.clone())) + .unwrap_or_else(|| Vec::new(env)) +} + +pub fn write_buyer_index(env: &Env, buyer: &Address, escrow_ids: &Vec) { + env.storage() + .instance() + .set(&DataKey::BuyerEscrows(buyer.clone()), escrow_ids); +} + +pub fn append_buyer_escrow(env: &Env, buyer: &Address, escrow_id: u32) { + let mut escrow_ids = read_buyer_index(env, buyer); + escrow_ids.push_back(escrow_id); + write_buyer_index(env, buyer, &escrow_ids); +} + +pub fn read_admin(env: &Env) -> Option
{ + env.storage().instance().get(&DataKey::Admin) +} + +pub fn write_admin(env: &Env, admin: &Address) { + env.storage().instance().set(&DataKey::Admin, admin); +} + +pub fn read_fee_config(env: &Env) -> FeeConfig { + env.storage() + .instance() + .get(&DataKey::FeeConfig) + .unwrap_or_else(FeeConfig::disabled) +} + +pub fn write_fee_config(env: &Env, config: &FeeConfig) { + env.storage().instance().set(&DataKey::FeeConfig, config); +} + +#[cfg(test)] +mod test { + use super::*; + use crate::EscrowState; + use soroban_sdk::testutils::Address as _; + + fn sample_escrow(env: &Env) -> EscrowData { + EscrowData { + seller: Address::generate(env), + buyer: None, + resolver: Address::generate(env), + token: Address::generate(env), + amount: 100, + shipping_window: 3_600, + funded_at: 0, + state: EscrowState::Pending, + } + } + + #[test] + fn escrow_helpers_roundtrip() { + let env = Env::default(); + let contract_id = env.register(crate::Escrow, ()); + let escrow = sample_escrow(&env); + + env.as_contract(&contract_id, || { + assert!(read_escrow(&env, 7).is_none()); + + write_escrow(&env, 7, &escrow); + assert_eq!(read_escrow(&env, 7), Some(escrow.clone())); + assert_eq!(require_escrow(&env, 7), escrow); + }); + } + + #[test] + fn counter_helper_allocates_monotonic_ids() { + let env = Env::default(); + let contract_id = env.register(crate::Escrow, ()); + + env.as_contract(&contract_id, || { + assert_eq!(read_escrow_count(&env), 0); + assert_eq!(next_escrow_id(&env), 1); + assert_eq!(next_escrow_id(&env), 2); + assert_eq!(read_escrow_count(&env), 2); + }); + } + + #[test] + fn vendor_and_buyer_indexes_accumulate_ids() { + let env = Env::default(); + let contract_id = env.register(crate::Escrow, ()); + let vendor = Address::generate(&env); + let buyer = Address::generate(&env); + + env.as_contract(&contract_id, || { + append_vendor_escrow(&env, &vendor, 1); + append_vendor_escrow(&env, &vendor, 3); + append_buyer_escrow(&env, &buyer, 2); + + let vendor_ids = read_vendor_index(&env, &vendor); + assert_eq!(vendor_ids.len(), 2); + assert_eq!(vendor_ids.get(0), Some(1)); + assert_eq!(vendor_ids.get(1), Some(3)); + + let buyer_ids = read_buyer_index(&env, &buyer); + assert_eq!(buyer_ids.len(), 1); + assert_eq!(buyer_ids.get(0), Some(2)); + }); + } + + #[test] + fn admin_and_fee_config_helpers_roundtrip() { + let env = Env::default(); + let contract_id = env.register(crate::Escrow, ()); + let admin = Address::generate(&env); + let recipient = Address::generate(&env); + + env.as_contract(&contract_id, || { + assert_eq!(read_admin(&env), None); + assert_eq!(read_fee_config(&env), FeeConfig::disabled()); + + write_admin(&env, &admin); + write_fee_config( + &env, + &FeeConfig { + recipient: Some(recipient.clone()), + fee_bps: 75, + }, + ); + + assert_eq!(read_admin(&env), Some(admin)); + assert_eq!( + read_fee_config(&env), + FeeConfig { + recipient: Some(recipient), + fee_bps: 75, + } + ); + }); + } +} diff --git a/contracts/escrow/src/test.rs b/contracts/escrow/src/test.rs index 3989f360..f2c6b7cc 100644 --- a/contracts/escrow/src/test.rs +++ b/contracts/escrow/src/test.rs @@ -1,7 +1,10 @@ #![cfg(test)] use super::*; -use soroban_sdk::{testutils::{Address as _, Ledger}, token, Address, Env}; +use soroban_sdk::{ + testutils::{Address as _, Ledger}, + token, Address, Env, +}; fn setup_env() -> (Env, Address, Address, Address, Address, Address) { let env = Env::default(); @@ -66,7 +69,6 @@ fn test_fund_escrow() { assert_eq!(get_balance(&env, &token, &buyer), 900); assert_eq!(get_balance(&env, &token, &contract_id), 100); - } #[test] @@ -202,3 +204,29 @@ fn test_multiple_escrows() { assert_eq!(get_balance(&env, &token, &buyer), 1700); } + +#[test] +fn test_vendor_and_buyer_indexes() { + let (env, seller, buyer, resolver, _admin, token) = setup_env(); + + let contract_id = env.register(Escrow, ()); + let client = super::EscrowClient::new(&env, &contract_id); + + mint_tokens(&env, &token, &buyer, 2000); + + let id1 = client.create_escrow(&seller, &resolver, &token, &100_i128, &3600_u64); + let id2 = client.create_escrow(&seller, &resolver, &token, &200_i128, &7200_u64); + + let vendor_ids = client.get_escrows_by_vendor(&seller); + assert_eq!(vendor_ids.len(), 2); + assert_eq!(vendor_ids.get(0), Some(id1)); + assert_eq!(vendor_ids.get(1), Some(id2)); + + assert_eq!(client.get_escrows_by_buyer(&buyer).len(), 0); + + client.fund_escrow(&id1, &buyer); + + let buyer_ids = client.get_escrows_by_buyer(&buyer); + assert_eq!(buyer_ids.len(), 1); + assert_eq!(buyer_ids.get(0), Some(id1)); +} diff --git a/contracts/escrow/test_snapshots/storage/test/admin_and_fee_config_helpers_roundtrip.1.json b/contracts/escrow/test_snapshots/storage/test/admin_and_fee_config_helpers_roundtrip.1.json new file mode 100644 index 00000000..8b2f6e41 --- /dev/null +++ b/contracts/escrow/test_snapshots/storage/test/admin_and_fee_config_helpers_roundtrip.1.json @@ -0,0 +1,103 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 25, + "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": "FeeConfig" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 75 + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + ] + } + } + } + }, + "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/escrow/test_snapshots/storage/test/counter_helper_allocates_monotonic_ids.1.json b/contracts/escrow/test_snapshots/storage/test/counter_helper_allocates_monotonic_ids.1.json new file mode 100644 index 00000000..ec5f75ce --- /dev/null +++ b/contracts/escrow/test_snapshots/storage/test/counter_helper_allocates_monotonic_ids.1.json @@ -0,0 +1,74 @@ +{ + "generators": { + "address": 1, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 25, + "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": "EscrowCount" + } + ] + }, + "val": { + "u32": 2 + } + } + ] + } + } + } + }, + "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/escrow/test_snapshots/storage/test/escrow_helpers_roundtrip.1.json b/contracts/escrow/test_snapshots/storage/test/escrow_helpers_roundtrip.1.json new file mode 100644 index 00000000..f1eb73ef --- /dev/null +++ b/contracts/escrow/test_snapshots/storage/test/escrow_helpers_roundtrip.1.json @@ -0,0 +1,144 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 25, + "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": "Escrow" + }, + { + "u32": 7 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "buyer" + }, + "val": "void" + }, + { + "key": { + "symbol": "funded_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "resolver" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "shipping_window" + }, + "val": { + "u64": "3600" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + ] + } + } + ] + } + } + } + }, + "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/escrow/test_snapshots/storage/test/vendor_and_buyer_indexes_accumulate_ids.1.json b/contracts/escrow/test_snapshots/storage/test/vendor_and_buyer_indexes_accumulate_ids.1.json new file mode 100644 index 00000000..00f93f09 --- /dev/null +++ b/contracts/escrow/test_snapshots/storage/test/vendor_and_buyer_indexes_accumulate_ids.1.json @@ -0,0 +1,103 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 25, + "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": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "vec": [ + { + "u32": 2 + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + }, + { + "u32": 3 + } + ] + } + } + ] + } + } + } + }, + "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/escrow/test_snapshots/test/test_auto_release.1.json b/contracts/escrow/test_snapshots/test/test_auto_release.1.json index 8d6b4884..0345d912 100644 --- a/contracts/escrow/test_snapshots/test/test_auto_release.1.json +++ b/contracts/escrow/test_snapshots/test/test_auto_release.1.json @@ -251,6 +251,25 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, { "key": { "vec": [ @@ -346,6 +365,25 @@ "val": { "u32": 1 } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } } ] } diff --git a/contracts/escrow/test_snapshots/test/test_auto_release_before_window_fails.1.json b/contracts/escrow/test_snapshots/test/test_auto_release_before_window_fails.1.json index 0365bf06..0c7f9adf 100644 --- a/contracts/escrow/test_snapshots/test/test_auto_release_before_window_fails.1.json +++ b/contracts/escrow/test_snapshots/test/test_auto_release_before_window_fails.1.json @@ -249,6 +249,25 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, { "key": { "vec": [ @@ -344,6 +363,25 @@ "val": { "u32": 1 } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } } ] } diff --git a/contracts/escrow/test_snapshots/test/test_confirm_delivery.1.json b/contracts/escrow/test_snapshots/test/test_confirm_delivery.1.json index 6114ca0e..b2df8914 100644 --- a/contracts/escrow/test_snapshots/test/test_confirm_delivery.1.json +++ b/contracts/escrow/test_snapshots/test/test_confirm_delivery.1.json @@ -290,6 +290,25 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, { "key": { "vec": [ @@ -385,6 +404,25 @@ "val": { "u32": 1 } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } } ] } diff --git a/contracts/escrow/test_snapshots/test/test_create_escrow.1.json b/contracts/escrow/test_snapshots/test/test_create_escrow.1.json index 0eaaae8b..188d0c23 100644 --- a/contracts/escrow/test_snapshots/test/test_create_escrow.1.json +++ b/contracts/escrow/test_snapshots/test/test_create_escrow.1.json @@ -237,6 +237,25 @@ "val": { "u32": 1 } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } } ] } diff --git a/contracts/escrow/test_snapshots/test/test_fund_escrow.1.json b/contracts/escrow/test_snapshots/test/test_fund_escrow.1.json index 83d248f5..0d1b1167 100644 --- a/contracts/escrow/test_snapshots/test/test_fund_escrow.1.json +++ b/contracts/escrow/test_snapshots/test/test_fund_escrow.1.json @@ -251,6 +251,25 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, { "key": { "vec": [ @@ -346,6 +365,25 @@ "val": { "u32": 1 } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } } ] } diff --git a/contracts/escrow/test_snapshots/test/test_fund_non_pending_escrow_fails.1.json b/contracts/escrow/test_snapshots/test/test_fund_non_pending_escrow_fails.1.json index 0365bf06..0c7f9adf 100644 --- a/contracts/escrow/test_snapshots/test/test_fund_non_pending_escrow_fails.1.json +++ b/contracts/escrow/test_snapshots/test/test_fund_non_pending_escrow_fails.1.json @@ -249,6 +249,25 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, { "key": { "vec": [ @@ -344,6 +363,25 @@ "val": { "u32": 1 } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } } ] } diff --git a/contracts/escrow/test_snapshots/test/test_multiple_escrows.1.json b/contracts/escrow/test_snapshots/test/test_multiple_escrows.1.json index 927cd4fe..67f79d23 100644 --- a/contracts/escrow/test_snapshots/test/test_multiple_escrows.1.json +++ b/contracts/escrow/test_snapshots/test/test_multiple_escrows.1.json @@ -363,6 +363,28 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + }, + { + "u32": 2 + } + ] + } + }, { "key": { "vec": [ @@ -542,6 +564,28 @@ "val": { "u32": 2 } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + }, + { + "u32": 2 + } + ] + } } ] } diff --git a/contracts/escrow/test_snapshots/test/test_raise_and_resolve_dispute_refund_buyer.1.json b/contracts/escrow/test_snapshots/test/test_raise_and_resolve_dispute_refund_buyer.1.json index 8ad4252c..8a89c6ee 100644 --- a/contracts/escrow/test_snapshots/test/test_raise_and_resolve_dispute_refund_buyer.1.json +++ b/contracts/escrow/test_snapshots/test/test_raise_and_resolve_dispute_refund_buyer.1.json @@ -331,6 +331,25 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, { "key": { "vec": [ @@ -426,6 +445,25 @@ "val": { "u32": 1 } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } } ] } diff --git a/contracts/escrow/test_snapshots/test/test_raise_and_resolve_dispute_release_to_seller.1.json b/contracts/escrow/test_snapshots/test/test_raise_and_resolve_dispute_release_to_seller.1.json index d558ae8e..1cdafb37 100644 --- a/contracts/escrow/test_snapshots/test/test_raise_and_resolve_dispute_release_to_seller.1.json +++ b/contracts/escrow/test_snapshots/test/test_raise_and_resolve_dispute_release_to_seller.1.json @@ -332,6 +332,25 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, { "key": { "vec": [ @@ -427,6 +446,25 @@ "val": { "u32": 1 } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } } ] } diff --git a/contracts/escrow/test_snapshots/test/test_vendor_and_buyer_indexes.1.json b/contracts/escrow/test_snapshots/test/test_vendor_and_buyer_indexes.1.json new file mode 100644 index 00000000..7fe1f142 --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_vendor_and_buyer_indexes.1.json @@ -0,0 +1,757 @@ +{ + "generators": { + "address": 6, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": "2000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_escrow", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "i128": "100" + }, + { + "u64": "3600" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_escrow", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "i128": "200" + }, + { + "u64": "7200" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "fund_escrow", + "args": [ + { + "u32": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": "100" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 25, + "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": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "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": "2032731177588607455" + } + }, + "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_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "BuyerEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "u32": 1 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "buyer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "funded_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "resolver" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "shipping_window" + }, + "val": { + "u64": "3600" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "vec": [ + { + "symbol": "Funded" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "u32": 2 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "200" + } + }, + { + "key": { + "symbol": "buyer" + }, + "val": "void" + }, + { + "key": { + "symbol": "funded_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "resolver" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "shipping_window" + }, + "val": { + "u64": "7200" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "EscrowCount" + } + ] + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "VendorEscrows" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "vec": [ + { + "u32": 1 + }, + { + "u32": 2 + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1900" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 120960 + }, + { + "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