From d8110ec709df1bd86840dea108c90946c4d2fc1e Mon Sep 17 00:00:00 2001 From: Godsmiracle001 Date: Sat, 28 Mar 2026 08:04:11 +0100 Subject: [PATCH] all done --- Readme.md | 12 +- contracts/invoice-escrow/src/errors.rs | 2 + contracts/invoice-escrow/src/events.rs | 29 +- contracts/invoice-escrow/src/lib.rs | 124 +- contracts/invoice-escrow/src/test.rs | 99 +- contracts/invoice-escrow/src/types.rs | 4 + ...gration_escrow_lifecycle_happy_path.1.json | 22 + .../test_integration_refund_lifecycle.1.json | 22 + ...n_token_locked_during_active_escrow.1.json | 22 + ...ncel_escrow_already_funded_rejected.1.json | 835 +++++++++ .../test_cancel_escrow_emits_event.1.json | 620 ++++++ .../test/test_cancel_escrow_happy_path.1.json | 593 ++++++ ...t_cancel_escrow_non_seller_rejected.1.json | 538 ++++++ .../test/test_create_and_fund.1.json | 14 + ..._create_escrow_duplicate_invoice_id.1.json | 14 + .../test_create_escrow_negative_amount.1.json | 14 + ..._create_escrow_requires_seller_auth.1.json | 14 + .../test_create_escrow_zero_amount.1.json | 14 + .../test/test_escrow_created_event.1.json | 14 + .../test/test_escrow_funded_event.1.json | 14 + .../test/test_escrow_refunded_event.1.json | 14 + .../test/test_fee_calculation_max_fee.1.json | 14 + .../test/test_fee_calculation_zero_fee.1.json | 14 + ...test_fund_cancelled_escrow_rejected.1.json | 593 ++++++ .../test_fund_escrow_already_funded.1.json | 14 + .../test/test_fund_escrow_not_found.1.json | 14 + .../test/test_get_escrow_data.1.json | 14 + .../test/test_get_escrow_not_found.1.json | 14 + .../test_get_escrow_status_not_found.1.json | 14 + .../test/test_initialize_twice_fails.1.json | 14 + ...st_no_refund_event_on_invalid_state.1.json | 14 + ...o_settlement_event_on_invalid_state.1.json | 14 + .../test_partial_payment_lifecycle.1.json | 14 + ...cle_operations_and_unpause_restores.1.json | 1514 +++++++++++++++ .../test/test_payment_settled_event.1.json | 14 + .../test/test_record_payment.1.json | 14 + ...test_record_payment_already_settled.1.json | 14 + ...ecord_payment_amount_exceeds_escrow.1.json | 14 + .../test_record_payment_not_funded.1.json | 14 + ...s_initial_fund_even_on_full_payment.1.json | 14 + .../test_record_payment_zero_amount.1.json | 14 + .../test/test_refund_after_due_date.1.json | 14 + .../test_refund_after_partial_payment.1.json | 14 + .../test/test_refund_already_settled.1.json | 14 + .../test/test_refund_at_due_date.1.json | 14 + .../test/test_refund_before_due_date.1.json | 14 + .../test/test_refund_not_funded.1.json | 14 + ...test_set_paused_requires_admin_auth.1.json | 121 ++ ..._payment_distributor_updates_config.1.json | 175 ++ .../test/test_update_platform_fee.1.json | 14 + ...est_update_platform_fee_invalid_bps.1.json | 14 + ...te_platform_fee_requires_admin_auth.1.json | 14 + contracts/invoice-token/src/errors.rs | 2 + contracts/invoice-token/src/events.rs | 8 + contracts/invoice-token/src/lib.rs | 39 + contracts/invoice-token/src/test.rs | 59 + contracts/invoice-token/src/types.rs | 2 + ...allowance_boundary_multiple_ledgers.1.json | 8 + ...allowance_returns_zero_when_expired.1.json | 8 + .../test/test_approve_event_emission.1.json | 8 + ...pprove_expiration_at_current_ledger.1.json | 8 + ...ove_expiration_below_current_ledger.1.json | 8 + ..._expiration_zero_amount_allows_past.1.json | 8 + ...t_approve_update_expiration_extends.1.json | 8 + ..._approve_update_expiration_shortens.1.json | 8 + .../test/test_burn_event_emission.1.json | 8 + ...n_from_allowance_and_balance_checks.1.json | 8 + .../test/test_burn_from_event_emission.1.json | 8 + ..._burn_from_expiration_above_current.1.json | 8 + ...n_from_expiration_at_current_ledger.1.json | 8 + ...n_from_expiration_one_below_current.1.json | 8 + ..._balance_allowance_and_total_supply.1.json | 8 + ...est_burn_insufficient_balance_fails.1.json | 8 + ...rn_updates_balance_and_total_supply.1.json | 8 + .../test/test_initialize_and_metadata.1.json | 8 + ...nt_authorization_and_invalid_amount.1.json | 8 + .../test/test_mint_event_emission.1.json | 8 + .../test_multiple_events_in_sequence.1.json | 8 + ...no_transfer_event_on_locked_failure.1.json | 8 + ..._sensitive_ops_and_unpause_restores.1.json | 553 ++++++ .../test/test_paused_event_emission.1.json | 249 +++ .../test_set_minter_event_emission.1.json | 8 + ...test_set_paused_requires_admin_auth.1.json | 170 ++ .../test_set_transfer_locked_by_minter.1.json | 8 + ..._set_transfer_locked_event_emission.1.json | 8 + .../test_set_transfer_locked_toggle.1.json | 8 + ..._transfer_locked_unauthorized_fails.1.json | 8 + .../test/test_transfer_event_emission.1.json | 8 + .../test_transfer_from_event_emission.1.json | 8 + ...nsfer_from_expiration_above_current.1.json | 11 + ...r_from_expiration_at_current_ledger.1.json | 11 + ...r_from_expiration_one_below_current.1.json | 11 + ...r_from_insufficient_allowance_fails.1.json | 8 + ...transfer_from_locked_admin_succeeds.1.json | 8 + ...ransfer_from_locked_non_admin_fails.1.json | 8 + ...transfer_insufficient_balance_fails.1.json | 8 + ...test_transfer_locked_admin_succeeds.1.json | 8 + ...est_transfer_locked_non_admin_fails.1.json | 8 + ...sfer_locked_with_sufficient_balance.1.json | 8 + .../test_transfer_unlocked_all_succeed.1.json | 8 + contracts/payment-distributor/src/errors.rs | 6 + contracts/payment-distributor/src/events.rs | 34 +- .../src/integration_test.rs | 324 ++-- contracts/payment-distributor/src/lib.rs | 152 +- contracts/payment-distributor/src/storage.rs | 31 +- contracts/payment-distributor/src/test.rs | 316 ++-- contracts/payment-distributor/src/types.rs | 15 + ...eps_direct_flow_without_distributor.1.json | 1378 ++++++++++++++ ...n_refund_routes_through_distributor.1.json | 1579 ++++++++++++++++ ...through_distributor_when_configured.1.json | 1580 ++++++++++++++++ ...bute_payment_rejects_created_escrow.1.json | 541 ++++++ .../test/test_double_initialize_fails.1.json | 90 + ...distribution_state_defaults_to_zero.1.json | 541 ++++++ ...ent_distribution_tracks_paid_amount.1.json | 1670 +++++++++++++++++ ...d_distribution_can_only_happen_once.1.json | 1578 ++++++++++++++++ docs/API.md | 111 +- docs/lifecycle.md | 73 +- scripts/deploy.ps1 | 15 +- scripts/deploy.sh | 13 +- scripts/smoke-test.sh | 6 +- 120 files changed, 16843 insertions(+), 436 deletions(-) create mode 100644 contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_already_funded_rejected.1.json create mode 100644 contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_emits_event.1.json create mode 100644 contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_happy_path.1.json create mode 100644 contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_non_seller_rejected.1.json create mode 100644 contracts/invoice-escrow/test_snapshots/test/test_fund_cancelled_escrow_rejected.1.json create mode 100644 contracts/invoice-escrow/test_snapshots/test/test_pause_blocks_lifecycle_operations_and_unpause_restores.1.json create mode 100644 contracts/invoice-escrow/test_snapshots/test/test_set_paused_requires_admin_auth.1.json create mode 100644 contracts/invoice-escrow/test_snapshots/test/test_set_payment_distributor_updates_config.1.json create mode 100644 contracts/invoice-token/test_snapshots/test/test_paused_blocks_sensitive_ops_and_unpause_restores.1.json create mode 100644 contracts/invoice-token/test_snapshots/test/test_paused_event_emission.1.json create mode 100644 contracts/invoice-token/test_snapshots/test/test_set_paused_requires_admin_auth.1.json create mode 100644 contracts/payment-distributor/src/types.rs create mode 100644 contracts/payment-distributor/test_snapshots/integration_test/test_integration_escrow_keeps_direct_flow_without_distributor.1.json create mode 100644 contracts/payment-distributor/test_snapshots/integration_test/test_integration_partial_payment_then_refund_routes_through_distributor.1.json create mode 100644 contracts/payment-distributor/test_snapshots/integration_test/test_integration_settlement_routes_through_distributor_when_configured.1.json create mode 100644 contracts/payment-distributor/test_snapshots/test/test_distribute_payment_rejects_created_escrow.1.json create mode 100644 contracts/payment-distributor/test_snapshots/test/test_double_initialize_fails.1.json create mode 100644 contracts/payment-distributor/test_snapshots/test/test_get_distribution_state_defaults_to_zero.1.json create mode 100644 contracts/payment-distributor/test_snapshots/test/test_incremental_payment_distribution_tracks_paid_amount.1.json create mode 100644 contracts/payment-distributor/test_snapshots/test/test_refund_distribution_can_only_happen_once.1.json diff --git a/Readme.md b/Readme.md index 61936bf..5268ea4 100644 --- a/Readme.md +++ b/Readme.md @@ -16,7 +16,8 @@ This repository contains the core Soroban smart contracts that power StellarSett - **Invoice Escrow**: Secure escrow creation, funding, and settlement - **Invoice Tokens**: SEP-41 compliant tokenization of invoices -- **Payment Distribution**: Automated payment distribution to investors +- **Payment Distribution**: Lifecycle-driven payout fan-out for seller, investor, and platform fee +- **Emergency Pause**: Admin-controlled stop switches for escrow and token operations ## πŸ—οΈ Architecture ``` @@ -55,7 +56,7 @@ soroban contract build Repeatable deployment scripts live in [`scripts/`](scripts/). See the [**How to run scripts**](#-how-to-run-scripts) section below for full instructions. -The scripts deploy and initialise all three contracts in the correct order using environment variables. No manual copy-paste of WASM paths or contract IDs required. +The scripts deploy and initialise all three contracts, then wire `invoice-escrow` to `payment-distributor` so settlement and refund payouts run through the distributor flow by default. ## πŸ“š Contract Documentation @@ -120,7 +121,8 @@ The script: 2. Validates all required variables and WASM paths 3. Deploys **invoice-token**, **invoice-escrow**, and **payment-distributor** in order 4. Calls `initialize` on each contract with the configured arguments -5. Prints a summary of deployed contract IDs +5. Calls `invoice-escrow.set_payment_distributor(...)` to enable distributor-based payouts +6. Prints a summary of deployed contract IDs ### 3b. PowerShell (Windows) @@ -144,7 +146,7 @@ INVOICE_TOKEN_CONTRACT_ID=C... PAYMENT_DISTRIBUTOR_CONTRACT_ID=C... ``` -The deploy step is skipped for any contract whose ID is pre-filled; `initialize` is still called. +The deploy step is skipped for any contract whose ID is pre-filled; `initialize` is still called, and the escrow-to-distributor wiring step still runs. ## πŸ§ͺ Testing ```bash @@ -197,4 +199,4 @@ MIT License - see [LICENSE](LICENSE) file for details --- -Built with ❀️ on Stellar \ No newline at end of file +Built with ❀️ on Stellar diff --git a/contracts/invoice-escrow/src/errors.rs b/contracts/invoice-escrow/src/errors.rs index 3f364d8..7af6b41 100644 --- a/contracts/invoice-escrow/src/errors.rs +++ b/contracts/invoice-escrow/src/errors.rs @@ -35,4 +35,6 @@ pub enum Error { Overflow = 13, /// Escrow has been cancelled by the seller. EscrowCancelled = 14, + /// Contract is paused and the requested operation is temporarily disabled. + Paused = 15, } diff --git a/contracts/invoice-escrow/src/events.rs b/contracts/invoice-escrow/src/events.rs index 2b8069c..129f323 100644 --- a/contracts/invoice-escrow/src/events.rs +++ b/contracts/invoice-escrow/src/events.rs @@ -50,10 +50,8 @@ pub fn escrow_refunded(env: &Env, inv_id: Symbol, funder: &Address, amount: i128 /// Publish escrow_cancelled event (invoice_id, seller). pub fn escrow_cancelled(env: &Env, inv_id: Symbol, seller: &Address) { - env.events().publish( - (Symbol::new(env, "escrow_cancelled"),), - (inv_id, seller), - ); + env.events() + .publish((Symbol::new(env, "escrow_cancelled"),), (inv_id, seller)); } /// Publish platform fee update event with old and new basis points. @@ -63,3 +61,26 @@ pub fn platform_fee_updated(env: &Env, old_fee_bps: u32, new_fee_bps: u32) { (old_fee_bps, new_fee_bps), ); } + +/// Publish payment distributor update event with previous and new distributor addresses. +pub fn payment_distributor_updated( + env: &Env, + had_previous_distributor: bool, + new_distributor: &Address, +) { + env.events().publish( + ( + Symbol::new(env, "distributor_updated"), + new_distributor.clone(), + ), + had_previous_distributor, + ); +} + +/// Publish pause state updates. +pub fn paused_updated(env: &Env, old_paused: bool, new_paused: bool) { + env.events().publish( + (Symbol::new(env, "paused_updated"),), + (old_paused, new_paused), + ); +} diff --git a/contracts/invoice-escrow/src/lib.rs b/contracts/invoice-escrow/src/lib.rs index 3586171..d74964f 100644 --- a/contracts/invoice-escrow/src/lib.rs +++ b/contracts/invoice-escrow/src/lib.rs @@ -11,13 +11,22 @@ mod types; use soroban_sdk::{contract, contractimpl, token, Address, Env, IntoVal, Symbol}; use errors::Error; -use types::{Config, EscrowData, EscrowStatus}; +pub use types::{Config, EscrowData, EscrowStatus}; const MAX_BPS: u32 = 10_000; +const DISTRIBUTE_PAYMENT_FN: &str = "distribute_payment"; +const DISTRIBUTE_REFUND_FN: &str = "distribute_refund"; #[contract] pub struct InvoiceEscrow; +fn ensure_not_paused(config: &Config) -> Result<(), Error> { + if config.paused { + return Err(Error::Paused); + } + Ok(()) +} + #[contractimpl] impl InvoiceEscrow { /// Initialize the contract with admin and platform fee (basis points, e.g. 300 = 3%). @@ -31,6 +40,8 @@ impl InvoiceEscrow { let config = Config { admin: admin.clone(), fee_bps: platform_fee_bps, + payment_distributor: None, + paused: false, }; storage::set_config(&env, &config); Ok(()) @@ -50,7 +61,8 @@ impl InvoiceEscrow { if amount <= 0 { return Err(Error::InvalidAmount); } - storage::get_config(&env).ok_or(Error::NotInit)?; + let config = storage::get_config(&env).ok_or(Error::NotInit)?; + ensure_not_paused(&config)?; if storage::has_escrow(&env, invoice_id.clone()) { return Err(Error::EscrowExists); } @@ -83,6 +95,8 @@ impl InvoiceEscrow { /// Emits `escrow_cancelled` with `(invoice_id, seller)`. pub fn cancel_escrow(env: Env, invoice_id: Symbol, seller: Address) -> Result<(), Error> { seller.require_auth(); + let config = storage::get_config(&env).ok_or(Error::NotInit)?; + ensure_not_paused(&config)?; let mut data = storage::get_escrow(&env, invoice_id.clone()).ok_or(Error::EscrowNotFound)?; if data.seller != seller { @@ -100,6 +114,8 @@ impl InvoiceEscrow { /// Fund the escrow (investor buys the invoice). Transfers `amount` from buyer to this contract. pub fn fund_escrow(env: Env, invoice_id: Symbol, buyer: Address) -> Result<(), Error> { buyer.require_auth(); + let config = storage::get_config(&env).ok_or(Error::NotInit)?; + ensure_not_paused(&config)?; let mut data = storage::get_escrow(&env, invoice_id.clone()).ok_or(Error::EscrowNotFound)?; if data.status == EscrowStatus::Cancelled { @@ -144,6 +160,7 @@ impl InvoiceEscrow { return Err(Error::InvalidAmount); } let config = storage::get_config(&env).ok_or(Error::NotInit)?; + ensure_not_paused(&config)?; let mut data = storage::get_escrow(&env, invoice_id.clone()).ok_or(Error::EscrowNotFound)?; @@ -174,18 +191,48 @@ impl InvoiceEscrow { // 1. Transfer payer funds into escrow token.transfer(&payer, &contract, &amount); - // 2. Distribute payer's funds out (investor + platform fee) - token.transfer(&contract, funder, &investor_amount); - token.transfer(&contract, &config.admin, &platform_fee); - - // 3. Release corresponding funding from initial buy-in back to the seller - token.transfer(&contract, &data.seller, &amount); - data.paid_amt = data.paid_amt.checked_add(amount).ok_or(Error::Overflow)?; if data.paid_amt == data.amount { data.status = EscrowStatus::Settled; - // Unlock invoice token transfers only when the invoice is completely settled + } + + storage::set_escrow(&env, invoice_id.clone(), &data); + + if let Some(distributor) = config.payment_distributor.as_ref() { + let total_to_distributor = amount.checked_add(amount).ok_or(Error::Overflow)?; + token.transfer(&contract, distributor, &total_to_distributor); + env.invoke_contract::<()>( + distributor, + &Symbol::new(&env, DISTRIBUTE_PAYMENT_FN), + soroban_sdk::vec![ + &env, + contract.to_val(), + invoice_id.clone().into_val(&env), + soroban_sdk::vec![ + &env, + data.token.clone(), + data.seller.clone(), + funder.clone(), + config.admin.clone() + ] + .into_val(&env), + soroban_sdk::vec![&env, data.paid_amt, amount, investor_amount, platform_fee] + .into_val(&env), + (data.status as u32).into_val(&env) + ], + ); + } else { + // Distribute payer's funds out (investor + platform fee). + token.transfer(&contract, funder, &investor_amount); + token.transfer(&contract, &config.admin, &platform_fee); + + // Release corresponding funding from initial buy-in back to the seller. + token.transfer(&contract, &data.seller, &amount); + } + + if data.status == EscrowStatus::Settled { + // Unlock invoice token transfers only when the invoice is completely settled. env.invoke_contract::<()>( &data.inv_token, &Symbol::new(&env, "set_transfer_locked"), @@ -193,13 +240,14 @@ impl InvoiceEscrow { ); } - storage::set_escrow(&env, invoice_id.clone(), &data); events::payment_settled(&env, invoice_id, amount, platform_fee, investor_amount); Ok(()) } /// Refund the investor if the invoice was not paid by due date. Anyone may call. pub fn refund(env: Env, invoice_id: Symbol) -> Result<(), Error> { + let config = storage::get_config(&env).ok_or(Error::NotInit)?; + ensure_not_paused(&config)?; let mut data = storage::get_escrow(&env, invoice_id.clone()).ok_or(Error::EscrowNotFound)?; if data.status != EscrowStatus::Funded { @@ -220,13 +268,29 @@ impl InvoiceEscrow { let token = token::Client::new(&env, &data.token); let contract = env.current_contract_address(); - if amount_to_refund > 0 { - token.transfer(&contract, funder, &amount_to_refund); - } - data.status = EscrowStatus::Refunded; storage::set_escrow(&env, invoice_id.clone(), &data); + if amount_to_refund > 0 { + if let Some(distributor) = config.payment_distributor.as_ref() { + token.transfer(&contract, distributor, &amount_to_refund); + env.invoke_contract::<()>( + distributor, + &Symbol::new(&env, DISTRIBUTE_REFUND_FN), + soroban_sdk::vec![ + &env, + contract.to_val(), + invoice_id.clone().into_val(&env), + soroban_sdk::vec![&env, data.token.clone(), funder.clone()].into_val(&env), + soroban_sdk::vec![&env, amount_to_refund].into_val(&env), + (data.status as u32).into_val(&env) + ], + ); + } else { + token.transfer(&contract, funder, &amount_to_refund); + } + } + // Unlock invoice token transfers now that the invoice is refunded env.invoke_contract::<()>( &data.inv_token, @@ -253,6 +317,30 @@ impl InvoiceEscrow { Ok(()) } + /// Set the payment distributor used for settlement/refund fan-out. Admin only. + pub fn set_payment_distributor(env: Env, payment_distributor: Address) -> Result<(), Error> { + let mut config = storage::get_config(&env).ok_or(Error::NotInit)?; + let admin = config.admin.clone(); + admin.require_auth(); + let old_distributor = config.payment_distributor.clone(); + config.payment_distributor = Some(payment_distributor.clone()); + storage::set_config(&env, &config); + events::payment_distributor_updated(&env, old_distributor.is_some(), &payment_distributor); + Ok(()) + } + + /// Toggle the emergency pause flag. Admin only. + pub fn set_paused(env: Env, paused: bool) -> Result<(), Error> { + let mut config = storage::get_config(&env).ok_or(Error::NotInit)?; + let admin = config.admin.clone(); + admin.require_auth(); + let old_paused = config.paused; + config.paused = paused; + storage::set_config(&env, &config); + events::paused_updated(&env, old_paused, paused); + Ok(()) + } + /// View: return escrow data for an invoice, or None if not found. pub fn get_escrow(env: Env, invoice_id: Symbol) -> Result { storage::get_escrow(&env, invoice_id).ok_or(Error::EscrowNotFound) @@ -268,6 +356,12 @@ impl InvoiceEscrow { let data = storage::get_escrow(&env, invoice_id).ok_or(Error::EscrowNotFound)?; Ok(data.status) } + + /// View: return the current pause state. + pub fn paused(env: Env) -> Result { + let config = storage::get_config(&env).ok_or(Error::NotInit)?; + Ok(config.paused) + } } #[cfg(test)] diff --git a/contracts/invoice-escrow/src/test.rs b/contracts/invoice-escrow/src/test.rs index 3a8d5e3..7628188 100644 --- a/contracts/invoice-escrow/src/test.rs +++ b/contracts/invoice-escrow/src/test.rs @@ -1489,7 +1489,6 @@ fn test_record_payment_removes_initial_fund_even_on_full_payment() { assert_eq!(payment_token.balance(&buyer), 5000); } - // ── Issue #41: cancel_escrow ───────────────────────────────────────────────── fn setup_escrow_created(env: &Env) -> (Address, InvoiceEscrowClient<'_>, Address, Address, Symbol) { @@ -1528,7 +1527,10 @@ fn test_cancel_escrow_happy_path() { client.cancel_escrow(&invoice_id, &seller); - assert_eq!(client.get_escrow_status(&invoice_id), EscrowStatus::Cancelled); + assert_eq!( + client.get_escrow_status(&invoice_id), + EscrowStatus::Cancelled + ); } #[test] @@ -1608,3 +1610,96 @@ fn test_fund_cancelled_escrow_rejected() { let res = client.try_fund_escrow(&invoice_id, &buyer); assert_eq!(res, Err(Ok(Error::EscrowCancelled))); } + +#[test] +fn test_set_payment_distributor_updates_config() { + let env = Env::default(); + env.mock_all_auths(); + + let escrow_id = env.register(InvoiceEscrow, ()); + let client = InvoiceEscrowClient::new(&env, &escrow_id); + let admin = Address::generate(&env); + let distributor = Address::generate(&env); + + client.initialize(&admin, &300); + client.set_payment_distributor(&distributor); + + let config = client.get_config(); + assert_eq!(config.payment_distributor, Some(distributor.clone())); +} + +#[test] +fn test_set_paused_requires_admin_auth() { + let env = Env::default(); + + let escrow_id = env.register_contract(None, InvoiceEscrow); + let client = InvoiceEscrowClient::new(&env, &escrow_id); + let admin = Address::generate(&env); + client.initialize(&admin, &300); + + let result = client.try_set_paused(&true); + assert!(result.is_err()); +} + +#[test] +fn test_pause_blocks_lifecycle_operations_and_unpause_restores() { + let env = Env::default(); + env.mock_all_auths(); + + let escrow_id = env.register_contract(None, InvoiceEscrow); + let client = InvoiceEscrowClient::new(&env, &escrow_id); + let admin = Address::generate(&env); + let seller = Address::generate(&env); + let buyer = Address::generate(&env); + let payer = Address::generate(&env); + let invoice_id = Symbol::new(&env, "INVPAUSE"); + let inv_token_id = env.register_contract(None, MockInvoiceToken); + + let pt_admin = Address::generate(&env); + let pt_id = env.register_stellar_asset_contract_v2(pt_admin); + let pt_asset = AssetClient::new(&env, &pt_id.address()); + let pt_client = TokenClient::new(&env, &pt_id.address()); + + client.initialize(&admin, &300); + client.set_paused(&true); + assert!(client.paused()); + + let create_while_paused = client.try_create_escrow( + &invoice_id, + &seller, + &1000i128, + &9_999_999u64, + &pt_id.address(), + &inv_token_id, + ); + assert_eq!(create_while_paused, Err(Ok(Error::Paused))); + + client.set_paused(&false); + client.create_escrow( + &invoice_id, + &seller, + &1000i128, + &9_999_999u64, + &pt_id.address(), + &inv_token_id, + ); + + pt_asset.mint(&buyer, &1000); + client.set_paused(&true); + let fund_while_paused = client.try_fund_escrow(&invoice_id, &buyer); + assert_eq!(fund_while_paused, Err(Ok(Error::Paused))); + + client.set_paused(&false); + client.fund_escrow(&invoice_id, &buyer); + + pt_asset.mint(&payer, &1000); + client.set_paused(&true); + let record_while_paused = client.try_record_payment(&invoice_id, &payer, &1000i128); + assert_eq!(record_while_paused, Err(Ok(Error::Paused))); + + client.set_paused(&false); + client.record_payment(&invoice_id, &payer, &1000i128); + + assert_eq!(client.get_escrow_status(&invoice_id), EscrowStatus::Settled); + assert_eq!(pt_client.balance(&seller), 1000); +} diff --git a/contracts/invoice-escrow/src/types.rs b/contracts/invoice-escrow/src/types.rs index 5c40c48..e4cee09 100644 --- a/contracts/invoice-escrow/src/types.rs +++ b/contracts/invoice-escrow/src/types.rs @@ -21,6 +21,10 @@ pub struct Config { pub admin: soroban_sdk::Address, /// Platform fee in basis points (e.g. 300 = 3%). pub fee_bps: u32, + /// Optional payment distributor contract used for settlement/refund fan-out. + pub payment_distributor: Option, + /// Emergency pause flag for lifecycle-changing operations. + pub paused: bool, } /// Lifecycle status of an escrow. diff --git a/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_escrow_lifecycle_happy_path.1.json b/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_escrow_lifecycle_happy_path.1.json index d6673d3..74c5f88 100644 --- a/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_escrow_lifecycle_happy_path.1.json +++ b/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_escrow_lifecycle_happy_path.1.json @@ -629,6 +629,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } @@ -764,6 +778,14 @@ "string": "Invoice #1" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_refund_lifecycle.1.json b/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_refund_lifecycle.1.json index fa4a20b..e98f0ae 100644 --- a/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_refund_lifecycle.1.json +++ b/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_refund_lifecycle.1.json @@ -450,6 +450,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } @@ -585,6 +599,14 @@ "string": "Failed Invoice" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_token_locked_during_active_escrow.1.json b/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_token_locked_during_active_escrow.1.json index c00373d..bf2e15d 100644 --- a/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_token_locked_during_active_escrow.1.json +++ b/contracts/invoice-escrow/test_snapshots/integration_test/test_integration_token_locked_during_active_escrow.1.json @@ -589,6 +589,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } @@ -772,6 +786,14 @@ "string": "Lock Test Invoice" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_already_funded_rejected.1.json b/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_already_funded_rejected.1.json new file mode 100644 index 0000000..2a751ff --- /dev/null +++ b/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_already_funded_rejected.1.json @@ -0,0 +1,835 @@ +{ + "generators": { + "address": 7, + "nonce": 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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_CFUND" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 9999999 + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "fund_escrow", + "args": [ + { + "symbol": "INV_CFUND" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + }, + [ + { + "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" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CFUND" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CFUND" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 9999999 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_CFUND" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_emits_event.1.json b/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_emits_event.1.json new file mode 100644 index 0000000..1710919 --- /dev/null +++ b/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_emits_event.1.json @@ -0,0 +1,620 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_CANC" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 9999999 + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "cancel_escrow", + "args": [ + { + "symbol": "INV_CANC" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + }, + [ + { + "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" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CANC" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CANC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 9999999 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": "void" + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_CANC" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "escrow_cancelled" + } + ], + "data": { + "vec": [ + { + "symbol": "INV_CANC" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_happy_path.1.json b/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_happy_path.1.json new file mode 100644 index 0000000..c6fbfee --- /dev/null +++ b/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_happy_path.1.json @@ -0,0 +1,593 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_CANC" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 9999999 + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "cancel_escrow", + "args": [ + { + "symbol": "INV_CANC" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + }, + [ + { + "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" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CANC" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CANC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 9999999 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": "void" + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_CANC" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_non_seller_rejected.1.json b/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_non_seller_rejected.1.json new file mode 100644 index 0000000..6db5d13 --- /dev/null +++ b/contracts/invoice-escrow/test_snapshots/test/test_cancel_escrow_non_seller_rejected.1.json @@ -0,0 +1,538 @@ +{ + "generators": { + "address": 7, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_CANC" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 9999999 + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + }, + [ + { + "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" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CANC" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CANC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 9999999 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": "void" + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_CANC" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-escrow/test_snapshots/test/test_create_and_fund.1.json b/contracts/invoice-escrow/test_snapshots/test/test_create_and_fund.1.json index 21dcb82..eba8957 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_create_and_fund.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_create_and_fund.1.json @@ -381,6 +381,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_duplicate_invoice_id.1.json b/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_duplicate_invoice_id.1.json index 13d4abc..d4ef91d 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_duplicate_invoice_id.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_duplicate_invoice_id.1.json @@ -225,6 +225,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_negative_amount.1.json b/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_negative_amount.1.json index 96abe6b..95887e9 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_negative_amount.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_negative_amount.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_requires_seller_auth.1.json b/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_requires_seller_auth.1.json index 96abe6b..95887e9 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_requires_seller_auth.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_requires_seller_auth.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_zero_amount.1.json b/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_zero_amount.1.json index 96abe6b..95887e9 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_zero_amount.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_create_escrow_zero_amount.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_escrow_created_event.1.json b/contracts/invoice-escrow/test_snapshots/test/test_escrow_created_event.1.json index c3f0ae6..ae2c73c 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_escrow_created_event.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_escrow_created_event.1.json @@ -305,6 +305,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_escrow_funded_event.1.json b/contracts/invoice-escrow/test_snapshots/test/test_escrow_funded_event.1.json index 56d2942..ab4aeb6 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_escrow_funded_event.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_escrow_funded_event.1.json @@ -378,6 +378,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_escrow_refunded_event.1.json b/contracts/invoice-escrow/test_snapshots/test/test_escrow_refunded_event.1.json index 0b06033..43e373f 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_escrow_refunded_event.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_escrow_refunded_event.1.json @@ -379,6 +379,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_fee_calculation_max_fee.1.json b/contracts/invoice-escrow/test_snapshots/test/test_fee_calculation_max_fee.1.json index 9156bb5..b0efa30 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_fee_calculation_max_fee.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_fee_calculation_max_fee.1.json @@ -457,6 +457,20 @@ "val": { "u32": 10000 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_fee_calculation_zero_fee.1.json b/contracts/invoice-escrow/test_snapshots/test/test_fee_calculation_zero_fee.1.json index ec46eaf..fb57238 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_fee_calculation_zero_fee.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_fee_calculation_zero_fee.1.json @@ -457,6 +457,20 @@ "val": { "u32": 0 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_fund_cancelled_escrow_rejected.1.json b/contracts/invoice-escrow/test_snapshots/test/test_fund_cancelled_escrow_rejected.1.json new file mode 100644 index 0000000..d4485a4 --- /dev/null +++ b/contracts/invoice-escrow/test_snapshots/test/test_fund_cancelled_escrow_rejected.1.json @@ -0,0 +1,593 @@ +{ + "generators": { + "address": 7, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_CANC" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 9999999 + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "cancel_escrow", + "args": [ + { + "symbol": "INV_CANC" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + }, + [ + { + "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" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CANC" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_CANC" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 9999999 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": "void" + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_CANC" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-escrow/test_snapshots/test/test_fund_escrow_already_funded.1.json b/contracts/invoice-escrow/test_snapshots/test/test_fund_escrow_already_funded.1.json index 92ad01f..9dbaadb 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_fund_escrow_already_funded.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_fund_escrow_already_funded.1.json @@ -404,6 +404,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_fund_escrow_not_found.1.json b/contracts/invoice-escrow/test_snapshots/test/test_fund_escrow_not_found.1.json index 7ae79cf..ee56e02 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_fund_escrow_not_found.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_fund_escrow_not_found.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_data.1.json b/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_data.1.json index 13d4abc..d4ef91d 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_data.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_data.1.json @@ -225,6 +225,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_not_found.1.json b/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_not_found.1.json index 3438eb5..81f2bf0 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_not_found.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_not_found.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_status_not_found.1.json b/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_status_not_found.1.json index 3438eb5..81f2bf0 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_status_not_found.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_get_escrow_status_not_found.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_initialize_twice_fails.1.json b/contracts/invoice-escrow/test_snapshots/test/test_initialize_twice_fails.1.json index 3438eb5..81f2bf0 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_initialize_twice_fails.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_initialize_twice_fails.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_no_refund_event_on_invalid_state.1.json b/contracts/invoice-escrow/test_snapshots/test/test_no_refund_event_on_invalid_state.1.json index 3dcfba6..d4b6048 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_no_refund_event_on_invalid_state.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_no_refund_event_on_invalid_state.1.json @@ -306,6 +306,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_no_settlement_event_on_invalid_state.1.json b/contracts/invoice-escrow/test_snapshots/test/test_no_settlement_event_on_invalid_state.1.json index 089cdf6..9f4d12d 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_no_settlement_event_on_invalid_state.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_no_settlement_event_on_invalid_state.1.json @@ -331,6 +331,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_partial_payment_lifecycle.1.json b/contracts/invoice-escrow/test_snapshots/test/test_partial_payment_lifecycle.1.json index 6015244..c0e687c 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_partial_payment_lifecycle.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_partial_payment_lifecycle.1.json @@ -519,6 +519,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_pause_blocks_lifecycle_operations_and_unpause_restores.1.json b/contracts/invoice-escrow/test_snapshots/test/test_pause_blocks_lifecycle_operations_and_unpause_restores.1.json new file mode 100644 index 0000000..e44c695 --- /dev/null +++ b/contracts/invoice-escrow/test_snapshots/test/test_pause_blocks_lifecycle_operations_and_unpause_restores.1.json @@ -0,0 +1,1514 @@ +{ + "generators": { + "address": 8, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE", + { + "function": { + "contract_fn": { + "contract_address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_paused", + "args": [ + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_paused", + "args": [ + { + "bool": false + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INVPAUSE" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 9999999 + }, + { + "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_paused", + "args": [ + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_paused", + "args": [ + { + "bool": false + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "fund_escrow", + "args": [ + { + "symbol": "INVPAUSE" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_paused", + "args": [ + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_paused", + "args": [ + { + "bool": false + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "record_payment", + "args": [ + { + "symbol": "INVPAUSE" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INVPAUSE" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INVPAUSE" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 9999999 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INVPAUSE" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 30 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 970 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-escrow/test_snapshots/test/test_payment_settled_event.1.json b/contracts/invoice-escrow/test_snapshots/test/test_payment_settled_event.1.json index bffc007..e403439 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_payment_settled_event.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_payment_settled_event.1.json @@ -455,6 +455,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_record_payment.1.json b/contracts/invoice-escrow/test_snapshots/test/test_record_payment.1.json index fb4dfd1..e752c8b 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_record_payment.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_record_payment.1.json @@ -463,6 +463,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_already_settled.1.json b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_already_settled.1.json index 97f8688..dcfeeac 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_already_settled.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_already_settled.1.json @@ -456,6 +456,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_amount_exceeds_escrow.1.json b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_amount_exceeds_escrow.1.json index d2ebd33..40d05ae 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_amount_exceeds_escrow.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_amount_exceeds_escrow.1.json @@ -404,6 +404,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_not_funded.1.json b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_not_funded.1.json index 25a4c27..aa58994 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_not_funded.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_not_funded.1.json @@ -225,6 +225,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_removes_initial_fund_even_on_full_payment.1.json b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_removes_initial_fund_even_on_full_payment.1.json index 27b8a4a..f54dcfb 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_removes_initial_fund_even_on_full_payment.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_removes_initial_fund_even_on_full_payment.1.json @@ -459,6 +459,20 @@ "val": { "u32": 0 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_zero_amount.1.json b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_zero_amount.1.json index 7ae79cf..ee56e02 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_record_payment_zero_amount.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_record_payment_zero_amount.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_refund_after_due_date.1.json b/contracts/invoice-escrow/test_snapshots/test/test_refund_after_due_date.1.json index c65ca88..6e808c3 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_refund_after_due_date.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_refund_after_due_date.1.json @@ -381,6 +381,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_refund_after_partial_payment.1.json b/contracts/invoice-escrow/test_snapshots/test/test_refund_after_partial_payment.1.json index f234e00..929c468 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_refund_after_partial_payment.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_refund_after_partial_payment.1.json @@ -461,6 +461,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_refund_already_settled.1.json b/contracts/invoice-escrow/test_snapshots/test/test_refund_already_settled.1.json index ae90046..7c0930d 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_refund_already_settled.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_refund_already_settled.1.json @@ -456,6 +456,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_refund_at_due_date.1.json b/contracts/invoice-escrow/test_snapshots/test/test_refund_at_due_date.1.json index 954c99e..e4df73e 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_refund_at_due_date.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_refund_at_due_date.1.json @@ -381,6 +381,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_refund_before_due_date.1.json b/contracts/invoice-escrow/test_snapshots/test/test_refund_before_due_date.1.json index 2bfb83f..8bec1c8 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_refund_before_due_date.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_refund_before_due_date.1.json @@ -379,6 +379,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_refund_not_funded.1.json b/contracts/invoice-escrow/test_snapshots/test/test_refund_not_funded.1.json index c5d9986..11c7fdc 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_refund_not_funded.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_refund_not_funded.1.json @@ -225,6 +225,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_set_paused_requires_admin_auth.1.json b/contracts/invoice-escrow/test_snapshots/test/test_set_paused_requires_admin_auth.1.json new file mode 100644 index 0000000..81f2bf0 --- /dev/null +++ b/contracts/invoice-escrow/test_snapshots/test/test_set_paused_requires_admin_auth.1.json @@ -0,0 +1,121 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-escrow/test_snapshots/test/test_set_payment_distributor_updates_config.1.json b/contracts/invoice-escrow/test_snapshots/test/test_set_payment_distributor_updates_config.1.json new file mode 100644 index 0000000..da4b1ed --- /dev/null +++ b/contracts/invoice-escrow/test_snapshots/test/test_set_payment_distributor_updates_config.1.json @@ -0,0 +1,175 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_payment_distributor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee.1.json b/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee.1.json index ef223c8..45de2df 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee.1.json @@ -85,6 +85,20 @@ "val": { "u32": 500 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee_invalid_bps.1.json b/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee_invalid_bps.1.json index 3438eb5..81f2bf0 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee_invalid_bps.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee_invalid_bps.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee_requires_admin_auth.1.json b/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee_requires_admin_auth.1.json index 3438eb5..81f2bf0 100644 --- a/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee_requires_admin_auth.1.json +++ b/contracts/invoice-escrow/test_snapshots/test/test_update_platform_fee_requires_admin_auth.1.json @@ -66,6 +66,20 @@ "val": { "u32": 300 } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" } ] } diff --git a/contracts/invoice-token/src/errors.rs b/contracts/invoice-token/src/errors.rs index 2a0f4ab..ffc5633 100644 --- a/contracts/invoice-token/src/errors.rs +++ b/contracts/invoice-token/src/errors.rs @@ -27,4 +27,6 @@ pub enum Error { Overflow = 9, /// Approval expiration_ledger must be >= current ledger unless setting amount to 0. InvalidExpiration = 10, + /// Contract is paused and the requested operation is temporarily disabled. + Paused = 11, } diff --git a/contracts/invoice-token/src/events.rs b/contracts/invoice-token/src/events.rs index 22434ac..17cabb2 100644 --- a/contracts/invoice-token/src/events.rs +++ b/contracts/invoice-token/src/events.rs @@ -48,3 +48,11 @@ pub fn minter_updated_event(env: &Env, old_minter: &Address, new_minter: &Addres (old_minter, new_minter), ); } + +/// Emit pause state updates. +pub fn paused_updated_event(env: &Env, old_value: bool, new_value: bool) { + env.events().publish( + (Symbol::new(env, "paused_updated"),), + (old_value, new_value), + ); +} diff --git a/contracts/invoice-token/src/lib.rs b/contracts/invoice-token/src/lib.rs index d60e300..4a8382e 100644 --- a/contracts/invoice-token/src/lib.rs +++ b/contracts/invoice-token/src/lib.rs @@ -39,6 +39,7 @@ impl InvoiceToken { decimals, invoice_id, transfer_locked: true, // default locked until settlement + paused: false, }; storage::set_metadata(&env, &meta); storage::set_total_supply(&env, 0); @@ -87,6 +88,9 @@ impl InvoiceToken { return Err(Error::InvalidAmount); } let meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; + if meta.paused { + return Err(Error::Paused); + } if meta.transfer_locked && from != meta.admin { return Err(Error::TransferLocked); } @@ -114,6 +118,10 @@ impl InvoiceToken { expiration_ledger: u32, ) -> Result<(), Error> { from.require_auth(); + let meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; + if meta.paused { + return Err(Error::Paused); + } let ledger = env.ledger().sequence(); if amount != 0 && expiration_ledger < ledger { return Err(Error::InvalidExpiration); @@ -136,6 +144,9 @@ impl InvoiceToken { return Err(Error::InvalidAmount); } let meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; + if meta.paused { + return Err(Error::Paused); + } if meta.transfer_locked && from != meta.admin { return Err(Error::TransferLocked); } @@ -176,6 +187,10 @@ impl InvoiceToken { if amount <= 0 { return Err(Error::InvalidAmount); } + let meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; + if meta.paused { + return Err(Error::Paused); + } let balance = storage::get_balance(&env, &from); if balance < amount { return Err(Error::InsufficientBalance); @@ -192,6 +207,10 @@ impl InvoiceToken { if amount <= 0 { return Err(Error::InvalidAmount); } + let meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; + if meta.paused { + return Err(Error::Paused); + } let ledger = env.ledger().sequence(); let allow = storage::get_allowance_data(&env, &from, &spender) .ok_or(Error::InsufficientAllowance)?; @@ -225,6 +244,9 @@ impl InvoiceToken { pub fn mint(env: Env, to: Address, amount: i128, by: Address) -> Result<(), Error> { by.require_auth(); let meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; + if meta.paused { + return Err(Error::Paused); + } if by != meta.admin && by != meta.minter { return Err(Error::Unauthorized); } @@ -269,6 +291,17 @@ impl InvoiceToken { Ok(()) } + /// Set emergency pause state. Admin only. + pub fn set_paused(env: Env, paused: bool) -> Result<(), Error> { + let mut meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; + meta.admin.require_auth(); + let old_paused = meta.paused; + meta.paused = paused; + storage::set_metadata(&env, &meta); + events::paused_updated_event(&env, old_paused, paused); + Ok(()) + } + /// Get invoice_id for this token (metadata). pub fn invoice_id(env: Env) -> Result { let meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; @@ -280,6 +313,12 @@ impl InvoiceToken { let meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; Ok(meta.transfer_locked) } + + /// Check if the contract is paused. + pub fn paused(env: Env) -> Result { + let meta = storage::get_metadata(&env).ok_or(Error::NotInit)?; + Ok(meta.paused) + } } #[cfg(test)] diff --git a/contracts/invoice-token/src/test.rs b/contracts/invoice-token/src/test.rs index 2782aec..59b13bb 100644 --- a/contracts/invoice-token/src/test.rs +++ b/contracts/invoice-token/src/test.rs @@ -1037,3 +1037,62 @@ fn test_approve_update_expiration_shortens() { .with_mut(|li| li.sequence_number = new_expiration + 1); assert_eq!(client.allowance(&admin, &spender), 0); } + +#[test] +fn test_set_paused_requires_admin_auth() { + let env = Env::default(); + let (client, _admin, _minter) = setup_token(&env); + + let result = client.try_set_paused(&true); + assert!(result.is_err()); +} + +#[test] +fn test_paused_blocks_sensitive_ops_and_unpause_restores() { + let env = Env::default(); + env.mock_all_auths(); + let (client, admin, minter) = setup_token(&env); + + let recipient = Address::generate(&env); + let spender = Address::generate(&env); + client.mint(&admin, &1_000, &minter); + + client.set_paused(&true); + assert!(client.paused()); + + let transfer_result = client.try_transfer(&admin, &recipient, &100); + assert_eq!(transfer_result, Err(Ok(crate::errors::Error::Paused))); + + let approve_result = client.try_approve(&admin, &spender, &100, &100); + assert_eq!(approve_result, Err(Ok(crate::errors::Error::Paused))); + + let mint_result = client.try_mint(&recipient, &100, &minter); + assert_eq!(mint_result, Err(Ok(crate::errors::Error::Paused))); + + client.set_paused(&false); + assert!(!client.paused()); + client.set_transfer_locked(&admin, &false); + client.transfer(&admin, &recipient, &100); + + assert_eq!(client.balance(&admin), 900); + assert_eq!(client.balance(&recipient), 100); +} + +#[test] +fn test_paused_event_emission() { + let env = Env::default(); + env.mock_all_auths(); + let (client, _admin, _minter) = setup_token(&env); + + client.set_paused(&true); + + let events = env.events().all(); + let event = events.last().unwrap(); + let (_contract_addr, topics, data) = event; + assert_eq!( + topics, + (Symbol::new(&env, "paused_updated"),).into_val(&env) + ); + let event_data: (bool, bool) = data.try_into_val(&env).unwrap(); + assert_eq!(event_data, (false, true)); +} diff --git a/contracts/invoice-token/src/types.rs b/contracts/invoice-token/src/types.rs index e98bfcf..650e9e3 100644 --- a/contracts/invoice-token/src/types.rs +++ b/contracts/invoice-token/src/types.rs @@ -35,6 +35,8 @@ pub struct TokenMetadata { pub invoice_id: soroban_sdk::Symbol, /// If true, transfers restricted until settlement (admin can still transfer). pub transfer_locked: bool, + /// Emergency pause flag for sensitive token operations. + pub paused: bool, } /// Allowance entry: amount and expiration ledger. diff --git a/contracts/invoice-token/test_snapshots/test/test_allowance_boundary_multiple_ledgers.1.json b/contracts/invoice-token/test_snapshots/test/test_allowance_boundary_multiple_ledgers.1.json index 0a5a2f0..0b35240 100644 --- a/contracts/invoice-token/test_snapshots/test/test_allowance_boundary_multiple_ledgers.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_allowance_boundary_multiple_ledgers.1.json @@ -199,6 +199,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_allowance_returns_zero_when_expired.1.json b/contracts/invoice-token/test_snapshots/test/test_allowance_returns_zero_when_expired.1.json index 1077df3..1bb4510 100644 --- a/contracts/invoice-token/test_snapshots/test/test_allowance_returns_zero_when_expired.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_allowance_returns_zero_when_expired.1.json @@ -194,6 +194,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_approve_event_emission.1.json b/contracts/invoice-token/test_snapshots/test/test_approve_event_emission.1.json index 7aeee37..9c16d64 100644 --- a/contracts/invoice-token/test_snapshots/test/test_approve_event_emission.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_approve_event_emission.1.json @@ -192,6 +192,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_approve_expiration_at_current_ledger.1.json b/contracts/invoice-token/test_snapshots/test/test_approve_expiration_at_current_ledger.1.json index b03ff8c..62371e0 100644 --- a/contracts/invoice-token/test_snapshots/test/test_approve_expiration_at_current_ledger.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_approve_expiration_at_current_ledger.1.json @@ -193,6 +193,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_approve_expiration_below_current_ledger.1.json b/contracts/invoice-token/test_snapshots/test/test_approve_expiration_below_current_ledger.1.json index 079ec19..e5d19a4 100644 --- a/contracts/invoice-token/test_snapshots/test/test_approve_expiration_below_current_ledger.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_approve_expiration_below_current_ledger.1.json @@ -91,6 +91,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_approve_expiration_zero_amount_allows_past.1.json b/contracts/invoice-token/test_snapshots/test/test_approve_expiration_zero_amount_allows_past.1.json index 8516583..d47a814 100644 --- a/contracts/invoice-token/test_snapshots/test/test_approve_expiration_zero_amount_allows_past.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_approve_expiration_zero_amount_allows_past.1.json @@ -154,6 +154,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_approve_update_expiration_extends.1.json b/contracts/invoice-token/test_snapshots/test/test_approve_update_expiration_extends.1.json index 923dc7e..d744fe6 100644 --- a/contracts/invoice-token/test_snapshots/test/test_approve_update_expiration_extends.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_approve_update_expiration_extends.1.json @@ -224,6 +224,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_approve_update_expiration_shortens.1.json b/contracts/invoice-token/test_snapshots/test/test_approve_update_expiration_shortens.1.json index 4069cff..0b5971a 100644 --- a/contracts/invoice-token/test_snapshots/test/test_approve_update_expiration_shortens.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_approve_update_expiration_shortens.1.json @@ -225,6 +225,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_burn_event_emission.1.json b/contracts/invoice-token/test_snapshots/test/test_burn_event_emission.1.json index 800cf90..49c31c9 100644 --- a/contracts/invoice-token/test_snapshots/test/test_burn_event_emission.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_burn_event_emission.1.json @@ -191,6 +191,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_burn_from_allowance_and_balance_checks.1.json b/contracts/invoice-token/test_snapshots/test/test_burn_from_allowance_and_balance_checks.1.json index a82d74b..6783e84 100644 --- a/contracts/invoice-token/test_snapshots/test/test_burn_from_allowance_and_balance_checks.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_burn_from_allowance_and_balance_checks.1.json @@ -304,6 +304,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_burn_from_event_emission.1.json b/contracts/invoice-token/test_snapshots/test/test_burn_from_event_emission.1.json index 8702b98..4186348 100644 --- a/contracts/invoice-token/test_snapshots/test/test_burn_from_event_emission.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_burn_from_event_emission.1.json @@ -296,6 +296,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_above_current.1.json b/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_above_current.1.json index bcc2388..5b254b2 100644 --- a/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_above_current.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_above_current.1.json @@ -299,6 +299,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_at_current_ledger.1.json b/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_at_current_ledger.1.json index 69eacf2..15f5438 100644 --- a/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_at_current_ledger.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_at_current_ledger.1.json @@ -299,6 +299,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_one_below_current.1.json b/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_one_below_current.1.json index 5cd29da..cb26c7a 100644 --- a/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_one_below_current.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_burn_from_expiration_one_below_current.1.json @@ -271,6 +271,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_burn_from_updates_balance_allowance_and_total_supply.1.json b/contracts/invoice-token/test_snapshots/test/test_burn_from_updates_balance_allowance_and_total_supply.1.json index 0949682..f802aa3 100644 --- a/contracts/invoice-token/test_snapshots/test/test_burn_from_updates_balance_allowance_and_total_supply.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_burn_from_updates_balance_allowance_and_total_supply.1.json @@ -299,6 +299,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_burn_insufficient_balance_fails.1.json b/contracts/invoice-token/test_snapshots/test/test_burn_insufficient_balance_fails.1.json index eabc5b6..9fea433 100644 --- a/contracts/invoice-token/test_snapshots/test/test_burn_insufficient_balance_fails.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_burn_insufficient_balance_fails.1.json @@ -169,6 +169,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_burn_updates_balance_and_total_supply.1.json b/contracts/invoice-token/test_snapshots/test/test_burn_updates_balance_and_total_supply.1.json index 37868a1..d3b6e7a 100644 --- a/contracts/invoice-token/test_snapshots/test/test_burn_updates_balance_and_total_supply.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_burn_updates_balance_and_total_supply.1.json @@ -193,6 +193,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_initialize_and_metadata.1.json b/contracts/invoice-token/test_snapshots/test/test_initialize_and_metadata.1.json index b642321..903c115 100644 --- a/contracts/invoice-token/test_snapshots/test/test_initialize_and_metadata.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_initialize_and_metadata.1.json @@ -99,6 +99,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_mint_authorization_and_invalid_amount.1.json b/contracts/invoice-token/test_snapshots/test/test_mint_authorization_and_invalid_amount.1.json index 6ee435a..5d05e65 100644 --- a/contracts/invoice-token/test_snapshots/test/test_mint_authorization_and_invalid_amount.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_mint_authorization_and_invalid_amount.1.json @@ -202,6 +202,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_mint_event_emission.1.json b/contracts/invoice-token/test_snapshots/test/test_mint_event_emission.1.json index ba2c097..1d8d36f 100644 --- a/contracts/invoice-token/test_snapshots/test/test_mint_event_emission.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_mint_event_emission.1.json @@ -166,6 +166,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_multiple_events_in_sequence.1.json b/contracts/invoice-token/test_snapshots/test/test_multiple_events_in_sequence.1.json index 45844bd..564a5a3 100644 --- a/contracts/invoice-token/test_snapshots/test/test_multiple_events_in_sequence.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_multiple_events_in_sequence.1.json @@ -289,6 +289,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_no_transfer_event_on_locked_failure.1.json b/contracts/invoice-token/test_snapshots/test/test_no_transfer_event_on_locked_failure.1.json index 1918039..ee24eed 100644 --- a/contracts/invoice-token/test_snapshots/test/test_no_transfer_event_on_locked_failure.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_no_transfer_event_on_locked_failure.1.json @@ -168,6 +168,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_paused_blocks_sensitive_ops_and_unpause_restores.1.json b/contracts/invoice-token/test_snapshots/test/test_paused_blocks_sensitive_ops_and_unpause_restores.1.json new file mode 100644 index 0000000..b1bf1ed --- /dev/null +++ b/contracts/invoice-token/test_snapshots/test/test_paused_blocks_sensitive_ops_and_unpause_restores.1.json @@ -0,0 +1,553 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_paused", + "args": [ + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_paused", + "args": [ + { + "bool": false + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_transfer_locked", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "bool": false + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 900 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "inv_001" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice INV-001" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INV001" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-token/test_snapshots/test/test_paused_event_emission.1.json b/contracts/invoice-token/test_snapshots/test/test_paused_event_emission.1.json new file mode 100644 index 0000000..d3bbc2c --- /dev/null +++ b/contracts/invoice-token/test_snapshots/test/test_paused_event_emission.1.json @@ -0,0 +1,249 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_paused", + "args": [ + { + "bool": true + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "inv_001" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice INV-001" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INV001" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": true + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "paused_updated" + } + ], + "data": { + "vec": [ + { + "bool": false + }, + { + "bool": true + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/invoice-token/test_snapshots/test/test_set_minter_event_emission.1.json b/contracts/invoice-token/test_snapshots/test/test_set_minter_event_emission.1.json index 03efef7..d9a59a4 100644 --- a/contracts/invoice-token/test_snapshots/test/test_set_minter_event_emission.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_set_minter_event_emission.1.json @@ -109,6 +109,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_set_paused_requires_admin_auth.1.json b/contracts/invoice-token/test_snapshots/test/test_set_paused_requires_admin_auth.1.json new file mode 100644 index 0000000..4d8f022 --- /dev/null +++ b/contracts/invoice-token/test_snapshots/test/test_set_paused_requires_admin_auth.1.json @@ -0,0 +1,170 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "inv_001" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice INV-001" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INV001" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": true + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_by_minter.1.json b/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_by_minter.1.json index 48e18b0..76d9812 100644 --- a/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_by_minter.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_by_minter.1.json @@ -213,6 +213,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_event_emission.1.json b/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_event_emission.1.json index 6ae6b81..df2cc52 100644 --- a/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_event_emission.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_event_emission.1.json @@ -188,6 +188,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_toggle.1.json b/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_toggle.1.json index 3ec9eaa..d159f72 100644 --- a/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_toggle.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_toggle.1.json @@ -293,6 +293,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_unauthorized_fails.1.json b/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_unauthorized_fails.1.json index cd3ae16..d9f3cbf 100644 --- a/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_unauthorized_fails.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_set_transfer_locked_unauthorized_fails.1.json @@ -92,6 +92,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_event_emission.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_event_emission.1.json index 6019959..f67cc0d 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_event_emission.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_event_emission.1.json @@ -264,6 +264,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_from_event_emission.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_from_event_emission.1.json index 912c6f7..51b1ba6 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_from_event_emission.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_from_event_emission.1.json @@ -369,6 +369,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_above_current.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_above_current.1.json index 43e1582..852fae7 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_above_current.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_above_current.1.json @@ -43,6 +43,9 @@ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "function_name": "set_transfer_locked", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, { "bool": false } @@ -369,6 +372,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_at_current_ledger.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_at_current_ledger.1.json index fe9886b..72484a7 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_at_current_ledger.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_at_current_ledger.1.json @@ -43,6 +43,9 @@ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "function_name": "set_transfer_locked", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, { "bool": false } @@ -369,6 +372,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_one_below_current.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_one_below_current.1.json index 4258658..1f6625c 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_one_below_current.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_from_expiration_one_below_current.1.json @@ -43,6 +43,9 @@ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "function_name": "set_transfer_locked", "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, { "bool": false } @@ -290,6 +293,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_from_insufficient_allowance_fails.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_from_insufficient_allowance_fails.1.json index e431a4e..ef668e5 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_from_insufficient_allowance_fails.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_from_insufficient_allowance_fails.1.json @@ -294,6 +294,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_from_locked_admin_succeeds.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_from_locked_admin_succeeds.1.json index a16b240..1e9ff9c 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_from_locked_admin_succeeds.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_from_locked_admin_succeeds.1.json @@ -351,6 +351,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_from_locked_non_admin_fails.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_from_locked_non_admin_fails.1.json index fb6b1a0..41b3019 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_from_locked_non_admin_fails.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_from_locked_non_admin_fails.1.json @@ -270,6 +270,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_insufficient_balance_fails.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_insufficient_balance_fails.1.json index 5425e20..052be49 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_insufficient_balance_fails.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_insufficient_balance_fails.1.json @@ -191,6 +191,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_locked_admin_succeeds.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_locked_admin_succeeds.1.json index 19047d5..0c65c37 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_locked_admin_succeeds.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_locked_admin_succeeds.1.json @@ -246,6 +246,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_locked_non_admin_fails.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_locked_non_admin_fails.1.json index 9e0933d..12ca0a4 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_locked_non_admin_fails.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_locked_non_admin_fails.1.json @@ -169,6 +169,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_locked_with_sufficient_balance.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_locked_with_sufficient_balance.1.json index 9b0548b..8fdecf6 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_locked_with_sufficient_balance.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_locked_with_sufficient_balance.1.json @@ -171,6 +171,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/invoice-token/test_snapshots/test/test_transfer_unlocked_all_succeed.1.json b/contracts/invoice-token/test_snapshots/test/test_transfer_unlocked_all_succeed.1.json index 45b551e..49472d6 100644 --- a/contracts/invoice-token/test_snapshots/test/test_transfer_unlocked_all_succeed.1.json +++ b/contracts/invoice-token/test_snapshots/test/test_transfer_unlocked_all_succeed.1.json @@ -527,6 +527,14 @@ "string": "Invoice INV-001" } }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, { "key": { "symbol": "symbol" diff --git a/contracts/payment-distributor/src/errors.rs b/contracts/payment-distributor/src/errors.rs index 5d53c95..dd9fcce 100644 --- a/contracts/payment-distributor/src/errors.rs +++ b/contracts/payment-distributor/src/errors.rs @@ -7,4 +7,10 @@ pub enum Error { AlreadyInit = 1, NotInit = 2, InvalidAmount = 3, + Unauthorized = 4, + InvalidEscrowStatus = 5, + NothingToDistribute = 6, + RefundAlreadyDistributed = 7, + Overflow = 8, + WrongDistributor = 9, } diff --git a/contracts/payment-distributor/src/events.rs b/contracts/payment-distributor/src/events.rs index 2baa930..d86d707 100644 --- a/contracts/payment-distributor/src/events.rs +++ b/contracts/payment-distributor/src/events.rs @@ -1,15 +1,37 @@ -use soroban_sdk::{Address, Env, Symbol}; +use soroban_sdk::{Address, Env, Symbol, Vec}; pub fn initialized(env: &Env, admin: &Address) { let topics = (Symbol::new(env, "initialized"),); env.events().publish(topics, admin.clone()); } -pub fn distributed(env: &Env, token: &Address, recipient: &Address, amount: i128) { +pub fn payment_distributed( + env: &Env, + escrow: &Address, + invoice_id: &Symbol, + recipients: &Vec
, + amounts: &Vec, +) { let topics = ( - Symbol::new(env, "distributed"), - token.clone(), - recipient.clone(), + Symbol::new(env, "payment_distributed"), + escrow.clone(), + invoice_id.clone(), ); - env.events().publish(topics, amount); + env.events() + .publish(topics, (recipients.clone(), amounts.clone())); +} + +pub fn refund_distributed( + env: &Env, + escrow: &Address, + invoice_id: &Symbol, + funder: &Address, + amount: i128, +) { + let topics = ( + Symbol::new(env, "refund_distributed"), + escrow.clone(), + invoice_id.clone(), + ); + env.events().publish(topics, (funder, amount)); } diff --git a/contracts/payment-distributor/src/integration_test.rs b/contracts/payment-distributor/src/integration_test.rs index eb2e3d6..8b14a81 100644 --- a/contracts/payment-distributor/src/integration_test.rs +++ b/contracts/payment-distributor/src/integration_test.rs @@ -1,14 +1,7 @@ -//! Cross-contract integration tests for payment-distributor. -//! -//! These tests exercise the full distribution pipeline: -//! invoice-escrow lifecycle β†’ settlement β†’ payment-distributor distribution/claim -//! -//! Closes #36. - #![allow(deprecated)] use super::*; -use invoice_escrow::{InvoiceEscrow, InvoiceEscrowClient}; +use invoice_escrow::{EscrowStatus, InvoiceEscrow, InvoiceEscrowClient}; use invoice_token::{InvoiceToken, InvoiceTokenClient}; use soroban_sdk::token::{Client as TokenClient, StellarAssetClient as AssetClient}; use soroban_sdk::{ @@ -16,234 +9,167 @@ use soroban_sdk::{ Address, Env, String as SorobanString, Symbol, }; -// --------------------------------------------------------------------------- -// Happy-path integration: create β†’ fund β†’ settle β†’ distribute -// --------------------------------------------------------------------------- - -#[test] -fn test_integration_settle_then_distribute() { - let env = Env::default(); - env.mock_all_auths(); +struct FlowContext<'a> { + admin: Address, + seller: Address, + buyer: Address, + payer: Address, + escrow_id: Address, + escrow: InvoiceEscrowClient<'a>, + distributor_id: Address, + distributor: PaymentDistributorClient<'a>, + inv_token: InvoiceTokenClient<'a>, + payment_token: TokenClient<'a>, + payment_asset: AssetClient<'a>, + invoice_id: Symbol, +} - // Identities - let admin = Address::generate(&env); - let seller = Address::generate(&env); - let buyer = Address::generate(&env); - let payer = Address::generate(&env); - let distributor_recipient = Address::generate(&env); +fn setup(env: &Env, fee_bps: u32, configure_distributor: bool) -> FlowContext<'_> { + let admin = Address::generate(env); + let seller = Address::generate(env); + let buyer = Address::generate(env); + let payer = Address::generate(env); - // Register contracts let escrow_id = env.register(InvoiceEscrow, ()); - let escrow = InvoiceEscrowClient::new(&env, &escrow_id); - - let inv_token_id = env.register(InvoiceToken, ()); - let inv_token = InvoiceTokenClient::new(&env, &inv_token_id); + let escrow = InvoiceEscrowClient::new(env, &escrow_id); let distributor_id = env.register(PaymentDistributor, ()); - let distributor = PaymentDistributorClient::new(&env, &distributor_id); + let distributor = PaymentDistributorClient::new(env, &distributor_id); - // Payment token - let pt_admin = Address::generate(&env); - let pt_id = env.register_stellar_asset_contract_v2(pt_admin.clone()); - let pt_client = TokenClient::new(&env, &pt_id.address()); - let pt_asset = AssetClient::new(&env, &pt_id.address()); + let inv_token_id = env.register(InvoiceToken, ()); + let inv_token = InvoiceTokenClient::new(env, &inv_token_id); + + let token_admin = Address::generate(env); + let token_id = env.register_stellar_asset_contract_v2(token_admin); + let payment_token = TokenClient::new(env, &token_id.address()); + let payment_asset = AssetClient::new(env, &token_id.address()); - // Initialize - let invoice_id = Symbol::new(&env, "INV_DIST"); + let invoice_id = Symbol::new(env, "INV_FLOW"); inv_token.initialize( &admin, - &SorobanString::from_str(&env, "Invoice Dist"), - &SorobanString::from_str(&env, "INVD"), + &SorobanString::from_str(env, "Invoice Flow"), + &SorobanString::from_str(env, "INVF"), &18, &invoice_id, &escrow_id, ); - escrow.initialize(&admin, &0); // 0% fee for simplicity - distributor.initialize(&admin); - - // Fund participants - let amount = 1000i128; - pt_asset.mint(&buyer, &amount); - pt_asset.mint(&payer, &amount); - - // Escrow lifecycle - let due_date = 99_999u64; - escrow.create_escrow(&invoice_id, &seller, &amount, &due_date, &pt_id.address(), &inv_token_id); - escrow.fund_escrow(&invoice_id, &buyer); - - assert_eq!(pt_client.balance(&escrow_id), amount); - - // Payer settles the invoice - escrow.record_payment(&invoice_id, &payer, &amount); - - // After settlement seller received the escrow principal back, buyer received payer's funds - // Seller now wants to distribute their proceeds via payment-distributor - // Seller mints into distributor as an example redistribution - let dist_amount = 500i128; - pt_asset.mint(&distributor_id, &dist_amount); - distributor.distribute(&pt_id.address(), &distributor_recipient, &dist_amount); - assert_eq!(pt_client.balance(&distributor_recipient), dist_amount); - assert_eq!(pt_client.balance(&distributor_id), 0); + escrow.initialize(&admin, &fee_bps); + distributor.initialize(&admin); + if configure_distributor { + escrow.set_payment_distributor(&distributor_id); + } + + FlowContext { + admin, + seller, + buyer, + payer, + escrow_id, + escrow, + distributor_id, + distributor, + inv_token, + payment_token, + payment_asset, + invoice_id, + } } -// --------------------------------------------------------------------------- -// Failure: distribution blocked when escrow is not yet settled -// --------------------------------------------------------------------------- +fn create_and_fund(ctx: &FlowContext<'_>, amount: i128, due_date: u64) { + ctx.payment_asset.mint(&ctx.buyer, &amount); + ctx.payment_asset.mint(&ctx.payer, &amount); + ctx.escrow.create_escrow( + &ctx.invoice_id, + &ctx.seller, + &amount, + &due_date, + &ctx.payment_token.address, + &ctx.inv_token.address, + ); + ctx.escrow.fund_escrow(&ctx.invoice_id, &ctx.buyer); +} #[test] -fn test_integration_distribute_while_escrow_funded_not_settled() { +fn test_integration_settlement_routes_through_distributor_when_configured() { let env = Env::default(); env.mock_all_auths(); - let admin = Address::generate(&env); - let seller = Address::generate(&env); - let buyer = Address::generate(&env); - - let escrow_id = env.register(InvoiceEscrow, ()); - let escrow = InvoiceEscrowClient::new(&env, &escrow_id); - - let inv_token_id = env.register(InvoiceToken, ()); - let inv_token = InvoiceTokenClient::new(&env, &inv_token_id); - - let distributor_id = env.register(PaymentDistributor, ()); - let distributor = PaymentDistributorClient::new(&env, &distributor_id); - - let pt_admin = Address::generate(&env); - let pt_id = env.register_stellar_asset_contract_v2(pt_admin); - let pt_client = TokenClient::new(&env, &pt_id.address()); - let pt_asset = AssetClient::new(&env, &pt_id.address()); - - let invoice_id = Symbol::new(&env, "INV_NSET"); - inv_token.initialize( - &admin, - &SorobanString::from_str(&env, "Invoice Unsettled"), - &SorobanString::from_str(&env, "INVNS"), - &18, - &invoice_id, - &escrow_id, + let ctx = setup(&env, 300, true); + create_and_fund(&ctx, 1_000, 50_000); + + ctx.escrow + .record_payment(&ctx.invoice_id, &ctx.payer, &1_000); + + assert_eq!(ctx.payment_token.balance(&ctx.payer), 0); + assert_eq!(ctx.payment_token.balance(&ctx.seller), 1_000); + assert_eq!(ctx.payment_token.balance(&ctx.buyer), 970); + assert_eq!(ctx.payment_token.balance(&ctx.admin), 30); + assert_eq!(ctx.payment_token.balance(&ctx.distributor_id), 0); + assert_eq!(ctx.payment_token.balance(&ctx.escrow_id), 0); + assert_eq!( + ctx.escrow.get_escrow_status(&ctx.invoice_id), + EscrowStatus::Settled ); - escrow.initialize(&admin, &0); - distributor.initialize(&admin); - - let amount = 500i128; - pt_asset.mint(&buyer, &amount); - escrow.create_escrow(&invoice_id, &seller, &amount, &99_999u64, &pt_id.address(), &inv_token_id); - escrow.fund_escrow(&invoice_id, &buyer); - - // Escrow is Funded (not Settled). The distributor has no funds yet. - // Attempting to distribute 0 tokens should fail with InvalidAmount. - let recipient = Address::generate(&env); - let res = distributor.try_distribute(&pt_id.address(), &recipient, &0i128); - assert_eq!(res, Err(Ok(Error::InvalidAmount))); - - // Also confirm the escrow is still in Funded state (settlement hasn't happened) - let escrow_data = escrow.get_escrow(&invoice_id); - assert_eq!(escrow_data.status, invoice_escrow::EscrowStatus::Funded); + assert!(!ctx.inv_token.transfer_locked()); - let _ = pt_client; + let state = ctx + .distributor + .get_distribution_state(&ctx.escrow_id, &ctx.invoice_id); + assert_eq!(state.paid_distributed, 1_000); + assert!(!state.refund_distributed); } -// --------------------------------------------------------------------------- -// Failure: claim fails for unauthorized caller (non-admin distribute) -// --------------------------------------------------------------------------- - #[test] -fn test_integration_distribute_unauthorized_caller() { +fn test_integration_partial_payment_then_refund_routes_through_distributor() { let env = Env::default(); env.mock_all_auths(); - let admin = Address::generate(&env); + let ctx = setup(&env, 300, true); + env.ledger().set_timestamp(5_000); + create_and_fund(&ctx, 1_000, 10_000); - let distributor_id = env.register(PaymentDistributor, ()); - let distributor = PaymentDistributorClient::new(&env, &distributor_id); + ctx.escrow.record_payment(&ctx.invoice_id, &ctx.payer, &400); - let pt_admin = Address::generate(&env); - let pt_id = env.register_stellar_asset_contract_v2(pt_admin); - let pt_asset = AssetClient::new(&env, &pt_id.address()); - let pt_client = TokenClient::new(&env, &pt_id.address()); + env.ledger().set_timestamp(10_001); + ctx.escrow.refund(&ctx.invoice_id); + + assert_eq!(ctx.payment_token.balance(&ctx.seller), 400); + assert_eq!(ctx.payment_token.balance(&ctx.buyer), 988); + assert_eq!(ctx.payment_token.balance(&ctx.admin), 12); + assert_eq!(ctx.payment_token.balance(&ctx.distributor_id), 0); + assert_eq!( + ctx.escrow.get_escrow_status(&ctx.invoice_id), + EscrowStatus::Refunded + ); + assert!(!ctx.inv_token.transfer_locked()); - distributor.initialize(&admin); - pt_asset.mint(&distributor_id, &1000i128); - - // PaymentDistributor.distribute internally requires admin auth. - // Without admin auth mocked, calling try_distribute returns an auth error. - let env2 = Env::default(); - // No mock_all_auths β€” unauthorized scenario - let distributor_id2 = env2.register(PaymentDistributor, ()); - let distributor2 = PaymentDistributorClient::new(&env2, &distributor_id2); - let admin2 = Address::generate(&env2); - env2.mock_all_auths(); - distributor2.initialize(&admin2); - let pt_id2 = env2.register_stellar_asset_contract_v2(Address::generate(&env2)); - AssetClient::new(&env2, &pt_id2.address()).mint(&distributor_id2, &1000i128); - let pt_client2 = TokenClient::new(&env2, &pt_id2.address()); - let recipient2 = Address::generate(&env2); - - // With no auth for admin2, distribute panics (auth failure) - let res = distributor2.try_distribute(&pt_client2.address, &recipient2, &100i128); - // Auth failures in soroban tests manifest as errors - let _ = (admin, distributor, pt_client, pt_id); - assert!(res.is_err()); + let state = ctx + .distributor + .get_distribution_state(&ctx.escrow_id, &ctx.invoice_id); + assert_eq!(state.paid_distributed, 400); + assert!(state.refund_distributed); } -// --------------------------------------------------------------------------- -// Integration: refund lifecycle does NOT trigger distributor distribution -// --------------------------------------------------------------------------- - #[test] -fn test_integration_refund_does_not_affect_distributor() { +fn test_integration_escrow_keeps_direct_flow_without_distributor() { let env = Env::default(); env.mock_all_auths(); - let admin = Address::generate(&env); - let seller = Address::generate(&env); - let buyer = Address::generate(&env); - - let escrow_id = env.register(InvoiceEscrow, ()); - let escrow = InvoiceEscrowClient::new(&env, &escrow_id); - - let inv_token_id = env.register(InvoiceToken, ()); - let inv_token = InvoiceTokenClient::new(&env, &inv_token_id); - - let distributor_id = env.register(PaymentDistributor, ()); - let distributor = PaymentDistributorClient::new(&env, &distributor_id); - - let pt_admin = Address::generate(&env); - let pt_id = env.register_stellar_asset_contract_v2(pt_admin); - let pt_client = TokenClient::new(&env, &pt_id.address()); - let pt_asset = AssetClient::new(&env, &pt_id.address()); - - let invoice_id = Symbol::new(&env, "INV_REF"); - let due_date = 10_000u64; - inv_token.initialize( - &admin, - &SorobanString::from_str(&env, "Refund Test"), - &SorobanString::from_str(&env, "INVR"), - &18, - &invoice_id, - &escrow_id, + let ctx = setup(&env, 300, false); + create_and_fund(&ctx, 1_000, 50_000); + + ctx.escrow + .record_payment(&ctx.invoice_id, &ctx.payer, &1_000); + + assert_eq!(ctx.payment_token.balance(&ctx.seller), 1_000); + assert_eq!(ctx.payment_token.balance(&ctx.buyer), 970); + assert_eq!(ctx.payment_token.balance(&ctx.admin), 30); + assert_eq!(ctx.payment_token.balance(&ctx.distributor_id), 0); + assert_eq!( + ctx.distributor + .get_distribution_state(&ctx.escrow_id, &ctx.invoice_id) + .paid_distributed, + 0 ); - escrow.initialize(&admin, &0); - distributor.initialize(&admin); - - let amount = 800i128; - pt_asset.mint(&buyer, &amount); - - env.ledger().set_timestamp(5_000); - escrow.create_escrow(&invoice_id, &seller, &amount, &due_date, &pt_id.address(), &inv_token_id); - escrow.fund_escrow(&invoice_id, &buyer); - - // Advance past due date and refund - env.ledger().set_timestamp(10_001); - escrow.refund(&invoice_id); - - // Distributor has no funds; distributing 0 fails - let recipient = Address::generate(&env); - let res = distributor.try_distribute(&pt_id.address(), &recipient, &0i128); - assert_eq!(res, Err(Ok(Error::InvalidAmount))); - - // Buyer was refunded - assert_eq!(pt_client.balance(&buyer), amount); - assert_eq!(pt_client.balance(&distributor_id), 0); } diff --git a/contracts/payment-distributor/src/lib.rs b/contracts/payment-distributor/src/lib.rs index 32f8361..65c30b5 100644 --- a/contracts/payment-distributor/src/lib.rs +++ b/contracts/payment-distributor/src/lib.rs @@ -3,14 +3,34 @@ mod errors; mod events; mod storage; +mod types; -use soroban_sdk::{contract, contractimpl, token, Address, Env}; +pub use types::DistributionState; + +use soroban_sdk::{contract, contractimpl, token, Address, Env, Symbol, Vec}; use errors::Error; +const ESCROW_STATUS_FUNDED: u32 = 1; +const ESCROW_STATUS_SETTLED: u32 = 2; +const ESCROW_STATUS_REFUNDED: u32 = 3; + #[contract] pub struct PaymentDistributor; +fn get_distribution_state( + env: &Env, + escrow_contract: &Address, + invoice_id: &Symbol, +) -> types::DistributionState { + storage::get_distribution(env, escrow_contract, invoice_id).unwrap_or( + types::DistributionState { + paid_distributed: 0, + refund_distributed: false, + }, + ) +} + #[contractimpl] impl PaymentDistributor { /// Initialize the contract with an admin. @@ -23,38 +43,142 @@ impl PaymentDistributor { Ok(()) } - /// Distribute payment from the contract to a recipient. Admin only. - pub fn distribute( + /// Distribute the latest settled payment delta for an escrow. + /// + /// The escrow contract must: + /// 1. update its escrow state first, + /// 2. transfer the settlement funds into this contract, and then + /// 3. invoke this function as the configured distributor. + pub fn distribute_payment( env: Env, - token: Address, - recipient: Address, - amount: i128, + escrow_contract: Address, + invoice_id: Symbol, + addresses: Vec
, + amounts: Vec, + escrow_status: u32, ) -> Result<(), Error> { - let admin = storage::get_admin(&env).ok_or(Error::NotInit)?; - admin.require_auth(); + storage::get_admin(&env).ok_or(Error::NotInit)?; + escrow_contract.require_auth(); - if amount <= 0 { + if escrow_status != ESCROW_STATUS_FUNDED && escrow_status != ESCROW_STATUS_SETTLED { + return Err(Error::InvalidEscrowStatus); + } + if addresses.len() != 4 || amounts.len() != 4 { + return Err(Error::InvalidAmount); + } + + let token = addresses.get(0).ok_or(Error::InvalidAmount)?; + let seller = addresses.get(1).ok_or(Error::InvalidAmount)?; + let funder = addresses.get(2).ok_or(Error::InvalidAmount)?; + let admin = addresses.get(3).ok_or(Error::InvalidAmount)?; + let paid_amount = amounts.get(0).ok_or(Error::InvalidAmount)?; + let mut state = get_distribution_state(&env, &escrow_contract, &invoice_id); + let payment_amount = paid_amount + .checked_sub(state.paid_distributed) + .ok_or(Error::Overflow)?; + + if payment_amount <= 0 { + return Err(Error::NothingToDistribute); + } + let seller_amount = amounts.get(1).ok_or(Error::InvalidAmount)?; + let investor_amount = amounts.get(2).ok_or(Error::InvalidAmount)?; + let platform_fee = amounts.get(3).ok_or(Error::InvalidAmount)?; + if seller_amount != payment_amount { + return Err(Error::InvalidAmount); + } + let total_payer_distribution = investor_amount + .checked_add(platform_fee) + .ok_or(Error::Overflow)?; + if total_payer_distribution != payment_amount { return Err(Error::InvalidAmount); } let token_client = token::Client::new(&env, &token); let contract_addr = env.current_contract_address(); + token_client.transfer(&contract_addr, &seller, &seller_amount); + token_client.transfer(&contract_addr, &funder, &investor_amount); + if platform_fee > 0 { + token_client.transfer(&contract_addr, &admin, &platform_fee); + } - // Transfer funds from contract to recipient - token_client.transfer(&contract_addr, &recipient, &amount); + state.paid_distributed = paid_amount; + storage::set_distribution(&env, &escrow_contract, &invoice_id, &state); - events::distributed(&env, &token, &recipient, amount); + events::payment_distributed( + &env, + &escrow_contract, + &invoice_id, + &soroban_sdk::vec![&env, seller, funder, admin], + &soroban_sdk::vec![ + &env, + seller_amount, + investor_amount, + platform_fee, + paid_amount + ], + ); Ok(()) } + /// Distribute the final refund for a refunded escrow. + pub fn distribute_refund( + env: Env, + escrow_contract: Address, + invoice_id: Symbol, + addresses: Vec
, + amounts: Vec, + escrow_status: u32, + ) -> Result<(), Error> { + storage::get_admin(&env).ok_or(Error::NotInit)?; + escrow_contract.require_auth(); + + if escrow_status != ESCROW_STATUS_REFUNDED { + return Err(Error::InvalidEscrowStatus); + } + if addresses.len() != 2 || amounts.len() != 1 { + return Err(Error::InvalidAmount); + } + + let token = addresses.get(0).ok_or(Error::InvalidAmount)?; + let funder = addresses.get(1).ok_or(Error::InvalidAmount)?; + let refund_amount = amounts.get(0).ok_or(Error::InvalidAmount)?; + let mut state = get_distribution_state(&env, &escrow_contract, &invoice_id); + if state.refund_distributed { + return Err(Error::RefundAlreadyDistributed); + } + if refund_amount <= 0 { + return Err(Error::NothingToDistribute); + } + + let token_client = token::Client::new(&env, &token); + let contract_addr = env.current_contract_address(); + token_client.transfer(&contract_addr, &funder, &refund_amount); + + state.refund_distributed = true; + storage::set_distribution(&env, &escrow_contract, &invoice_id, &state); + + events::refund_distributed(&env, &escrow_contract, &invoice_id, &funder, refund_amount); + Ok(()) + } + /// View: return the current admin. pub fn get_admin(env: Env) -> Result { storage::get_admin(&env).ok_or(Error::NotInit) } + + /// View: return tracked distribution progress for an escrow invoice. + pub fn get_distribution_state( + env: Env, + escrow_contract: Address, + invoice_id: Symbol, + ) -> Result { + storage::get_admin(&env).ok_or(Error::NotInit)?; + Ok(get_distribution_state(&env, &escrow_contract, &invoice_id)) + } } -#[cfg(test)] -mod test; #[cfg(test)] mod integration_test; +#[cfg(test)] +mod test; diff --git a/contracts/payment-distributor/src/storage.rs b/contracts/payment-distributor/src/storage.rs index b8b550b..92718ad 100644 --- a/contracts/payment-distributor/src/storage.rs +++ b/contracts/payment-distributor/src/storage.rs @@ -1,13 +1,34 @@ use soroban_sdk::{Address, Env, Symbol}; -const ADMIN_KEY: &str = "Admin"; +use crate::types::{DistributionState, StorageKey}; pub fn set_admin(env: &Env, admin: &Address) { - env.storage() - .instance() - .set(&Symbol::new(env, ADMIN_KEY), admin); + env.storage().instance().set(&StorageKey::Admin, admin); } pub fn get_admin(env: &Env) -> Option
{ - env.storage().instance().get(&Symbol::new(env, ADMIN_KEY)) + env.storage().instance().get(&StorageKey::Admin) +} + +pub fn get_distribution( + env: &Env, + escrow: &Address, + invoice_id: &Symbol, +) -> Option { + env.storage().persistent().get(&StorageKey::Distribution( + escrow.clone(), + invoice_id.clone(), + )) +} + +pub fn set_distribution( + env: &Env, + escrow: &Address, + invoice_id: &Symbol, + state: &DistributionState, +) { + env.storage().persistent().set( + &StorageKey::Distribution(escrow.clone(), invoice_id.clone()), + state, + ); } diff --git a/contracts/payment-distributor/src/test.rs b/contracts/payment-distributor/src/test.rs index dd67475..c2d5b70 100644 --- a/contracts/payment-distributor/src/test.rs +++ b/contracts/payment-distributor/src/test.rs @@ -1,179 +1,223 @@ #![allow(deprecated)] use super::*; -use soroban_sdk::token::Client as TokenClient; -use soroban_sdk::token::StellarAssetClient as AssetClient; -use soroban_sdk::{testutils::Address as _, Address, Env}; - -// --------------------------------------------------------------------------- -// Helpers -// --------------------------------------------------------------------------- - -fn setup(env: &Env) -> (Address, PaymentDistributorClient<'_>, Address, TokenClient<'_>) { - let distributor_id = env.register_contract(None, PaymentDistributor); - let client = PaymentDistributorClient::new(env, &distributor_id); - let admin = Address::generate(env); - client.initialize(&admin); - - let token_admin = Address::generate(env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_client = TokenClient::new(env, &token_id.address()); - let token_asset = AssetClient::new(env, &token_id.address()); - token_asset.mint(&distributor_id, &10_000i128); - - (admin, client, distributor_id, token_client) +use invoice_escrow::{EscrowStatus, InvoiceEscrow, InvoiceEscrowClient}; +use invoice_token::{InvoiceToken, InvoiceTokenClient}; +use soroban_sdk::token::{Client as TokenClient, StellarAssetClient as AssetClient}; +use soroban_sdk::{ + testutils::{Address as _, Ledger as _}, + Address, Env, String as SorobanString, Symbol, +}; + +struct TestContext<'a> { + admin: Address, + seller: Address, + buyer: Address, + payer: Address, + escrow_id: Address, + escrow: InvoiceEscrowClient<'a>, + distributor_id: Address, + distributor: PaymentDistributorClient<'a>, + inv_token: InvoiceTokenClient<'a>, + payment_token: TokenClient<'a>, + payment_asset: AssetClient<'a>, + invoice_id: Symbol, } -// --------------------------------------------------------------------------- -// Issue #35: unit tests for payment-distributor distribution logic -// --------------------------------------------------------------------------- - -#[test] -fn test_initialize_and_distribute() { - let env = Env::default(); - env.mock_all_auths(); +fn setup(env: &Env, fee_bps: u32, configure_distributor: bool) -> TestContext<'_> { + let admin = Address::generate(env); + let seller = Address::generate(env); + let buyer = Address::generate(env); + let payer = Address::generate(env); - let distributor_id = env.register_contract(None, PaymentDistributor); - let client = PaymentDistributorClient::new(&env, &distributor_id); + let escrow_id = env.register(InvoiceEscrow, ()); + let escrow = InvoiceEscrowClient::new(env, &escrow_id); - let admin = Address::generate(&env); - client.initialize(&admin); + let distributor_id = env.register(PaymentDistributor, ()); + let distributor = PaymentDistributorClient::new(env, &distributor_id); - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_client = TokenClient::new(&env, &token_id.address()); - let token_asset = AssetClient::new(&env, &token_id.address()); + let inv_token_id = env.register(InvoiceToken, ()); + let inv_token = InvoiceTokenClient::new(env, &inv_token_id); - let amount = 1000; - token_asset.mint(&distributor_id, &amount); + let token_admin = Address::generate(env); + let token_id = env.register_stellar_asset_contract_v2(token_admin); + let payment_token = TokenClient::new(env, &token_id.address()); + let payment_asset = AssetClient::new(env, &token_id.address()); + + let invoice_id = Symbol::new(env, "INV_DIST"); + inv_token.initialize( + &admin, + &SorobanString::from_str(env, "Invoice Dist"), + &SorobanString::from_str(env, "INVD"), + &18, + &invoice_id, + &escrow_id, + ); - let recipient = Address::generate(&env); - let distribute_amt = 400; - client.distribute(&token_client.address, &recipient, &distribute_amt); + escrow.initialize(&admin, &fee_bps); + distributor.initialize(&admin); + if configure_distributor { + escrow.set_payment_distributor(&distributor_id); + } + + TestContext { + admin, + seller, + buyer, + payer, + escrow_id, + escrow, + distributor_id, + distributor, + inv_token, + payment_token, + payment_asset, + invoice_id, + } +} - assert_eq!(token_client.balance(&recipient), distribute_amt); - assert_eq!( - token_client.balance(&distributor_id), - amount - distribute_amt +fn create_and_fund(ctx: &TestContext<'_>, amount: i128, due_date: u64) { + ctx.payment_asset.mint(&ctx.buyer, &amount); + ctx.escrow.create_escrow( + &ctx.invoice_id, + &ctx.seller, + &amount, + &due_date, + &ctx.payment_token.address, + &ctx.inv_token.address, ); + ctx.escrow.fund_escrow(&ctx.invoice_id, &ctx.buyer); } #[test] fn test_double_initialize_fails() { let env = Env::default(); env.mock_all_auths(); - let (admin, client, _, _) = setup(&env); - let res = client.try_initialize(&admin); - assert_eq!(res, Err(Ok(Error::AlreadyInit))); -} -#[test] -fn test_get_admin_returns_correct_address() { - let env = Env::default(); - env.mock_all_auths(); - let (admin, client, _, _) = setup(&env); - assert_eq!(client.get_admin(), admin); -} + let distributor_id = env.register(PaymentDistributor, ()); + let distributor = PaymentDistributorClient::new(&env, &distributor_id); + let admin = Address::generate(&env); + distributor.initialize(&admin); -#[test] -fn test_distribute_zero_amount_fails() { - let env = Env::default(); - env.mock_all_auths(); - let (_admin, client, _, token) = setup(&env); - let recipient = Address::generate(&env); - let res = client.try_distribute(&token.address, &recipient, &0i128); - assert_eq!(res, Err(Ok(Error::InvalidAmount))); + let result = distributor.try_initialize(&admin); + assert_eq!(result, Err(Ok(Error::AlreadyInit))); } #[test] -fn test_distribute_negative_amount_fails() { +fn test_get_distribution_state_defaults_to_zero() { let env = Env::default(); env.mock_all_auths(); - let (_admin, client, _, token) = setup(&env); - let recipient = Address::generate(&env); - let res = client.try_distribute(&token.address, &recipient, &-100i128); - assert_eq!(res, Err(Ok(Error::InvalidAmount))); -} -#[test] -fn test_distribute_unauthorized_non_admin_fails() { - let env = Env::default(); - // Do NOT mock_all_auths; the non-admin has no authorization - let distributor_id = env.register_contract(None, PaymentDistributor); - let client = PaymentDistributorClient::new(&env, &distributor_id); - let admin = Address::generate(&env); - // Initialize with mock auth just for the init call - env.mock_all_auths(); - client.initialize(&admin); - - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin.clone()); - let token_asset = AssetClient::new(&env, &token_id.address()); - token_asset.mint(&distributor_id, &1000i128); - - let token_client = TokenClient::new(&env, &token_id.address()); - let recipient = Address::generate(&env); - - // Reset mock β€” now no auth is provided - let env2 = Env::default(); - let distributor_id2 = env2.register_contract(None, PaymentDistributor); - let client2 = PaymentDistributorClient::new(&env2, &distributor_id2); - let admin2 = Address::generate(&env2); - env2.mock_all_auths_allowing_non_root_auth(); - client2.initialize(&admin2); - let token_id2 = env2.register_stellar_asset_contract_v2(Address::generate(&env2)); - let token_asset2 = AssetClient::new(&env2, &token_id2.address()); - token_asset2.mint(&distributor_id2, &1000i128); - let token_client2 = TokenClient::new(&env2, &token_id2.address()); - let recipient2 = Address::generate(&env2); - let non_admin = Address::generate(&env2); - - // Calling distribute without admin auth should panic/fail - let res = client2.try_distribute(&token_client2.address, &recipient2, &100i128); - // Without admin auth mocked, this must fail - let _ = (admin2, non_admin, token_client, recipient); - // Just verify the success path works when admin auth IS present - assert!(res.is_err()); + let ctx = setup(&env, 300, true); + let state = ctx + .distributor + .get_distribution_state(&ctx.escrow_id, &ctx.invoice_id); + + assert_eq!(state.paid_distributed, 0); + assert!(!state.refund_distributed); } #[test] -fn test_distribute_not_initialized_fails() { +fn test_distribute_payment_rejects_created_escrow() { let env = Env::default(); env.mock_all_auths(); - let distributor_id = env.register_contract(None, PaymentDistributor); - let client = PaymentDistributorClient::new(&env, &distributor_id); - let token_admin = Address::generate(&env); - let token_id = env.register_stellar_asset_contract_v2(token_admin); - let token_client = TokenClient::new(&env, &token_id.address()); - let recipient = Address::generate(&env); - let res = client.try_distribute(&token_client.address, &recipient, &100i128); - assert_eq!(res, Err(Ok(Error::NotInit))); + + let ctx = setup(&env, 300, true); + + let result = ctx.distributor.try_distribute_payment( + &ctx.escrow_id, + &ctx.invoice_id, + &soroban_sdk::vec![ + &env, + ctx.payment_token.address.clone(), + ctx.seller.clone(), + ctx.buyer.clone(), + ctx.admin.clone() + ], + &soroban_sdk::vec![&env, 0i128, 0i128, 0i128, 0i128], + &0u32, + ); + assert_eq!(result, Err(Ok(Error::InvalidEscrowStatus))); } #[test] -fn test_distribute_full_balance() { +fn test_incremental_payment_distribution_tracks_paid_amount() { let env = Env::default(); env.mock_all_auths(); - let (_admin, client, distributor_id, token) = setup(&env); - let recipient = Address::generate(&env); - let full_balance = token.balance(&distributor_id); - client.distribute(&token.address, &recipient, &full_balance); - assert_eq!(token.balance(&recipient), full_balance); - assert_eq!(token.balance(&distributor_id), 0); + + let ctx = setup(&env, 500, true); // 5% fee + create_and_fund(&ctx, 1_000, 50_000); + ctx.payment_asset.mint(&ctx.payer, &1_000); + + ctx.escrow.record_payment(&ctx.invoice_id, &ctx.payer, &400); + + assert_eq!(ctx.payment_token.balance(&ctx.seller), 400); + assert_eq!(ctx.payment_token.balance(&ctx.buyer), 380); + assert_eq!(ctx.payment_token.balance(&ctx.admin), 20); + assert_eq!(ctx.payment_token.balance(&ctx.distributor_id), 0); + assert_eq!(ctx.payment_token.balance(&ctx.escrow_id), 600); + assert_eq!( + ctx.distributor + .get_distribution_state(&ctx.escrow_id, &ctx.invoice_id) + .paid_distributed, + 400 + ); + assert_eq!( + ctx.escrow.get_escrow_status(&ctx.invoice_id), + EscrowStatus::Funded + ); + + ctx.escrow.record_payment(&ctx.invoice_id, &ctx.payer, &600); + + assert_eq!(ctx.payment_token.balance(&ctx.seller), 1_000); + assert_eq!(ctx.payment_token.balance(&ctx.buyer), 950); + assert_eq!(ctx.payment_token.balance(&ctx.admin), 50); + assert_eq!(ctx.payment_token.balance(&ctx.distributor_id), 0); + assert_eq!(ctx.payment_token.balance(&ctx.escrow_id), 0); + assert_eq!( + ctx.distributor + .get_distribution_state(&ctx.escrow_id, &ctx.invoice_id) + .paid_distributed, + 1_000 + ); + assert_eq!( + ctx.escrow.get_escrow_status(&ctx.invoice_id), + EscrowStatus::Settled + ); } #[test] -fn test_distribute_multiple_recipients() { +fn test_refund_distribution_can_only_happen_once() { let env = Env::default(); env.mock_all_auths(); - let (_admin, client, distributor_id, token) = setup(&env); - - let r1 = Address::generate(&env); - let r2 = Address::generate(&env); - client.distribute(&token.address, &r1, &3000i128); - client.distribute(&token.address, &r2, &2000i128); - assert_eq!(token.balance(&r1), 3000); - assert_eq!(token.balance(&r2), 2000); - assert_eq!(token.balance(&distributor_id), 5000); + let ctx = setup(&env, 300, true); + env.ledger().set_timestamp(1_000); + create_and_fund(&ctx, 1_000, 2_000); + + ctx.payment_asset.mint(&ctx.payer, &400); + ctx.escrow.record_payment(&ctx.invoice_id, &ctx.payer, &400); + + env.ledger().set_timestamp(2_001); + ctx.escrow.refund(&ctx.invoice_id); + + assert_eq!(ctx.payment_token.balance(&ctx.seller), 400); + assert_eq!(ctx.payment_token.balance(&ctx.buyer), 988); + assert_eq!(ctx.payment_token.balance(&ctx.admin), 12); + assert_eq!(ctx.payment_token.balance(&ctx.distributor_id), 0); + + let state = ctx + .distributor + .get_distribution_state(&ctx.escrow_id, &ctx.invoice_id); + assert_eq!(state.paid_distributed, 400); + assert!(state.refund_distributed); + + let second_refund = ctx.distributor.try_distribute_refund( + &ctx.escrow_id, + &ctx.invoice_id, + &soroban_sdk::vec![&env, ctx.payment_token.address.clone(), ctx.buyer.clone()], + &soroban_sdk::vec![&env, 600i128], + &3u32, + ); + assert_eq!(second_refund, Err(Ok(Error::RefundAlreadyDistributed))); } diff --git a/contracts/payment-distributor/src/types.rs b/contracts/payment-distributor/src/types.rs new file mode 100644 index 0000000..4b9c138 --- /dev/null +++ b/contracts/payment-distributor/src/types.rs @@ -0,0 +1,15 @@ +use soroban_sdk::contracttype; + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum StorageKey { + Admin, + Distribution(soroban_sdk::Address, soroban_sdk::Symbol), +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct DistributionState { + pub paid_distributed: i128, + pub refund_distributed: bool, +} diff --git a/contracts/payment-distributor/test_snapshots/integration_test/test_integration_escrow_keeps_direct_flow_without_distributor.1.json b/contracts/payment-distributor/test_snapshots/integration_test/test_integration_escrow_keeps_direct_flow_without_distributor.1.json new file mode 100644 index 0000000..ebdf629 --- /dev/null +++ b/contracts/payment-distributor/test_snapshots/integration_test/test_integration_escrow_keeps_direct_flow_without_distributor.1.json @@ -0,0 +1,1378 @@ +{ + "generators": { + "address": 9, + "nonce": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_FLOW" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 50000 + }, + { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "fund_escrow", + "args": [ + { + "symbol": "INV_FLOW" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "record_payment", + "args": [ + { + "symbol": "INV_FLOW" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 50000 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_FLOW" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": "void" + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 18 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "INV_FLOW" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice Flow" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INVF" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 30 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 970 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000009" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/payment-distributor/test_snapshots/integration_test/test_integration_partial_payment_then_refund_routes_through_distributor.1.json b/contracts/payment-distributor/test_snapshots/integration_test/test_integration_partial_payment_then_refund_routes_through_distributor.1.json new file mode 100644 index 0000000..1e66aff --- /dev/null +++ b/contracts/payment-distributor/test_snapshots/integration_test/test_integration_partial_payment_then_refund_routes_through_distributor.1.json @@ -0,0 +1,1579 @@ +{ + "generators": { + "address": 9, + "nonce": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_payment_distributor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_FLOW" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 10000 + }, + { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "fund_escrow", + "args": [ + { + "symbol": "INV_FLOW" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "record_payment", + "args": [ + { + "symbol": "INV_FLOW" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 400 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 400 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 10001, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 10000 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_FLOW" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 400 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Distribution" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Distribution" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "paid_distributed" + }, + "val": { + "i128": { + "hi": 0, + "lo": 400 + } + } + }, + { + "key": { + "symbol": "refund_distributed" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 18 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "INV_FLOW" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice Flow" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INVF" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 12 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 400 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 988 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 600 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000009" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/payment-distributor/test_snapshots/integration_test/test_integration_settlement_routes_through_distributor_when_configured.1.json b/contracts/payment-distributor/test_snapshots/integration_test/test_integration_settlement_routes_through_distributor_when_configured.1.json new file mode 100644 index 0000000..0757b34 --- /dev/null +++ b/contracts/payment-distributor/test_snapshots/integration_test/test_integration_settlement_routes_through_distributor_when_configured.1.json @@ -0,0 +1,1580 @@ +{ + "generators": { + "address": 9, + "nonce": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_payment_distributor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_FLOW" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 50000 + }, + { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "fund_escrow", + "args": [ + { + "symbol": "INV_FLOW" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "record_payment", + "args": [ + { + "symbol": "INV_FLOW" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 50000 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_FLOW" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Distribution" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Distribution" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "symbol": "INV_FLOW" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "paid_distributed" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "refund_distributed" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 18 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "INV_FLOW" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice Flow" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INVF" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 30 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 970 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000009" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/payment-distributor/test_snapshots/test/test_distribute_payment_rejects_created_escrow.1.json b/contracts/payment-distributor/test_snapshots/test/test_distribute_payment_rejects_created_escrow.1.json new file mode 100644 index 0000000..b8628ce --- /dev/null +++ b/contracts/payment-distributor/test_snapshots/test/test_distribute_payment_rejects_created_escrow.1.json @@ -0,0 +1,541 @@ +{ + "generators": { + "address": 9, + "nonce": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_payment_distributor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 18 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "INV_DIST" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice Dist" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INVD" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": true + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000009" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/payment-distributor/test_snapshots/test/test_double_initialize_fails.1.json b/contracts/payment-distributor/test_snapshots/test/test_double_initialize_fails.1.json new file mode 100644 index 0000000..d26bc80 --- /dev/null +++ b/contracts/payment-distributor/test_snapshots/test/test_double_initialize_fails.1.json @@ -0,0 +1,90 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/payment-distributor/test_snapshots/test/test_get_distribution_state_defaults_to_zero.1.json b/contracts/payment-distributor/test_snapshots/test/test_get_distribution_state_defaults_to_zero.1.json new file mode 100644 index 0000000..b8628ce --- /dev/null +++ b/contracts/payment-distributor/test_snapshots/test/test_get_distribution_state_defaults_to_zero.1.json @@ -0,0 +1,541 @@ +{ + "generators": { + "address": 9, + "nonce": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_payment_distributor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 18 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "INV_DIST" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice Dist" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INVD" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": true + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000009" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/payment-distributor/test_snapshots/test/test_incremental_payment_distribution_tracks_paid_amount.1.json b/contracts/payment-distributor/test_snapshots/test/test_incremental_payment_distribution_tracks_paid_amount.1.json new file mode 100644 index 0000000..10972ce --- /dev/null +++ b/contracts/payment-distributor/test_snapshots/test/test_incremental_payment_distribution_tracks_paid_amount.1.json @@ -0,0 +1,1670 @@ +{ + "generators": { + "address": 9, + "nonce": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_payment_distributor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_DIST" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 50000 + }, + { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "fund_escrow", + "args": [ + { + "symbol": "INV_DIST" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "record_payment", + "args": [ + { + "symbol": "INV_DIST" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 400 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 400 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "record_payment", + "args": [ + { + "symbol": "INV_DIST" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 600 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 600 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_DIST" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_DIST" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 50000 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_DIST" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Distribution" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "symbol": "INV_DIST" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Distribution" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "symbol": "INV_DIST" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "paid_distributed" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "refund_distributed" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 18 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "INV_DIST" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice Dist" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INVD" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 50 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 950 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000009" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/payment-distributor/test_snapshots/test/test_refund_distribution_can_only_happen_once.1.json b/contracts/payment-distributor/test_snapshots/test/test_refund_distribution_can_only_happen_once.1.json new file mode 100644 index 0000000..db2506c --- /dev/null +++ b/contracts/payment-distributor/test_snapshots/test/test_refund_distribution_can_only_happen_once.1.json @@ -0,0 +1,1578 @@ +{ + "generators": { + "address": 9, + "nonce": 0 + }, + "auth": [ + [], + [], + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "set_payment_distributor", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "create_escrow", + "args": [ + { + "symbol": "INV_DIST" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 2000 + }, + { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "fund_escrow", + "args": [ + { + "symbol": "INV_DIST" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 400 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "record_payment", + "args": [ + { + "symbol": "INV_DIST" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 400 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 400 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 2001, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_DIST" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Escrow" + }, + { + "symbol": "INV_DIST" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "due_dt" + }, + "val": { + "u64": 2000 + } + }, + { + "key": { + "symbol": "funder" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "inv_id" + }, + "val": { + "symbol": "INV_DIST" + } + }, + { + "key": { + "symbol": "inv_token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "paid_amt" + }, + "val": { + "i128": { + "hi": 0, + "lo": 400 + } + } + }, + { + "key": { + "symbol": "seller" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "fee_bps" + }, + "val": { + "u32": 300 + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "payment_distributor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Distribution" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "symbol": "INV_DIST" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Distribution" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "symbol": "INV_DIST" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "paid_distributed" + }, + "val": { + "i128": { + "hi": 0, + "lo": 400 + } + } + }, + { + "key": { + "symbol": "refund_distributed" + }, + "val": { + "bool": true + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "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": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Metadata" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "decimals" + }, + "val": { + "u32": 18 + } + }, + { + "key": { + "symbol": "invoice_id" + }, + "val": { + "symbol": "INV_DIST" + } + }, + { + "key": { + "symbol": "minter" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Invoice Dist" + } + }, + { + "key": { + "symbol": "paused" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "INVD" + } + }, + { + "key": { + "symbol": "transfer_locked" + }, + "val": { + "bool": false + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalSupply" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 12 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 400 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 988 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCFPZOCU33AWX2NKX47XD6W5JNYFP7MU57DTQFB5XOOQSJLSSC4PMX25", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS4LU" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000009" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/docs/API.md b/docs/API.md index 33f39c0..cb11f3e 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1,45 +1,108 @@ # StellarSettle API Reference -This document provides a reference for the public functions available in the StellarSettle smart contracts. +This document summarizes the public functions exposed by the StellarSettle Soroban contracts. ## Payment Distributor Contract -The `Payment Distributor` contract handles the secure distribution of funds from the contract to specified recipients. This is used for settling payments to investors and platform fees. +The `payment-distributor` contract now implements the settlement/refund fan-out flow used by `invoice-escrow` when a distributor is configured. ### `initialize(admin: Address)` -Initializes the contract with an administrative address. -- **admin**: The address that will have permission to call distribution functions. +- Sets the distributor admin. -### `distribute(token: Address, recipient: Address, amount: i128)` -Distributes a specified amount of a token to a recipient address. This function requires authorization from the contract admin. -- **token**: The address of the SEP-41 compliant token to distribute. -- **recipient**: The address of the recipient receiving the funds. -- **amount**: The amount of tokens to transfer. +### `distribute_payment(escrow_contract: Address, invoice_id: Symbol, addresses: Vec
, amounts: Vec, escrow_status: u32)` +- Callable only by the authenticated escrow contract. +- `addresses` must be `[token, seller, funder, admin]`. +- `amounts` must be `[paid_amount, seller_amount, investor_amount, platform_fee]`. +- `escrow_status` must represent `Funded` or `Settled`. +- Uses `paid_amount` plus internal distribution state to prevent replay or double distribution. +- Transfers funds held by `payment-distributor` to the seller, funder, and admin. + +### `distribute_refund(escrow_contract: Address, invoice_id: Symbol, addresses: Vec
, amounts: Vec, escrow_status: u32)` +- Callable only by the authenticated escrow contract. +- `addresses` must be `[token, funder]`. +- `amounts` must be `[refund_amount]`. +- `escrow_status` must represent `Refunded`. +- Refund distribution is one-time per `(escrow_contract, invoice_id)`. + +### `get_distribution_state(escrow_contract: Address, invoice_id: Symbol) -> DistributionState` +- Returns the tracked payout progress for an escrow invoice. +- `paid_distributed` is the cumulative `paid_amount` already fanned out. +- `refund_distributed` indicates whether the refund leg has already been processed. ### `get_admin() -> Address` -Returns the current administrative address of the contract. +- Returns the distributor admin. + +### Events +- `payment_distributed` +- `refund_distributed` +- `initialized` ## Invoice Token Contract +`invoice-token` is the invoice ownership token contract with transfer-lock and pause controls. + +### Core Functions +- `initialize(admin, name, symbol, decimals, invoice_id, minter)` +- `transfer(from, to, amount)` +- `approve(from, spender, amount, expiration_ledger)` +- `transfer_from(spender, from, to, amount)` +- `burn(from, amount)` +- `burn_from(spender, from, amount)` +- `mint(to, amount, by)` +- `set_transfer_locked(caller, locked)` +- `set_minter(new_minter)` +- `set_paused(paused)` +- `paused() -> bool` +- `transfer_locked() -> bool` + +### Pause Policy +- When paused, the contract rejects `transfer`, `approve`, `transfer_from`, `burn`, `burn_from`, and `mint`. +- Admin-only config operations such as `set_transfer_locked`, `set_minter`, and `set_paused` remain available. + ### Events -- `transfer_locked_updated(old_locked: bool, new_locked: bool)` -- `minter_updated(old_minter: Address, new_minter: Address)` +- `transfer` +- `approve` +- `mint` +- `burn` +- `transfer_locked_updated` +- `minter_updated` +- `paused_updated` ## Invoice Escrow Contract -(Legacy documentation for reference) +`invoice-escrow` remains the lifecycle orchestrator and now optionally routes settlement/refund payouts through `payment-distributor`. + +### Core Functions +- `initialize(admin: Address, platform_fee_bps: u32)` +- `create_escrow(invoice_id, seller, amount, due_date, payment_token, invoice_token)` +- `cancel_escrow(invoice_id, seller)` +- `fund_escrow(invoice_id, buyer)` +- `record_payment(invoice_id, payer, amount)` +- `refund(invoice_id)` +- `update_platform_fee_bps(new_fee_bps)` +- `set_payment_distributor(payment_distributor)` +- `set_paused(paused)` +- `get_escrow(invoice_id) -> EscrowData` +- `get_config() -> Config` +- `get_escrow_status(invoice_id) -> EscrowStatus` +- `paused() -> bool` -### `initialize(admin: Address, platform_fee_bps: u32)` -### `create_escrow(invoice_id: Symbol, seller: Address, amount: i128, due_date: u64, payment_token: Address, invoice_token: Address)` -### `fund_escrow(invoice_id: Symbol, buyer: Address)` -### `record_payment(invoice_id: Symbol, payer: Address, amount: i128)` -Records a full or partial payment for a funded invoice. -- **amount**: Must be $> 0$ and $\le$ (initial amount - total already paid). -- Partial payments distribute the platform fee to the admin, the remainder to the investor, and release a proportional amount of the investor's initial funding to the seller. -- The invoice status transitions to `Settled` only when the total paid matches the invoice amount. +### Distribution Behavior +- If `payment_distributor` is configured, `record_payment` transfers the current settlement funds into the distributor and invokes `distribute_payment`. +- If `payment_distributor` is configured, `refund` transfers the remaining collateral into the distributor and invokes `distribute_refund`. +- If no distributor is configured, escrow falls back to the legacy direct-transfer path. -### `refund(invoice_id: Symbol)` -Returns the remaining (un-released) investor funding if the invoice is not paid by its due date. +### Pause Policy +- When paused, the contract rejects lifecycle-changing operations: + `create_escrow`, `cancel_escrow`, `fund_escrow`, `record_payment`, and `refund`. +- View functions and admin-only configuration updates remain available. ### Events -- `platform_fee_updated(old_fee_bps: u32, new_fee_bps: u32)` +- `escrow_created` +- `escrow_funded` +- `payment_settled` +- `escrow_refunded` +- `escrow_cancelled` +- `platform_fee_updated` +- `distributor_updated` +- `paused_updated` diff --git a/docs/lifecycle.md b/docs/lifecycle.md index fd31eb1..d122303 100644 --- a/docs/lifecycle.md +++ b/docs/lifecycle.md @@ -1,40 +1,53 @@ # Invoice Escrow Lifecycle -This document describes the intended end-to-end lifecycle of an invoice and how it flows through the `invoice-escrow` and `invoice-token` contracts. +This document describes the end-to-end invoice lifecycle across `invoice-escrow`, `invoice-token`, and the configured `payment-distributor`. ## 1. Creation (`create_escrow`) -- **Actor:** Seller (invoice owner) -- **Action:** The seller registers a new invoice in the `invoice-escrow` contract. -- **State Changes:** Escrow status is set to `Created`. The contract tracks the `payment_token` (stablecoin used for payment) and `invoice_token` (SEP-41 token used to represent ownership). -- **Tokenization:** No tokens are minted at this stage. +- **Actor:** Seller +- **Action:** Registers a new invoice in `invoice-escrow`. +- **State changes:** Escrow status becomes `Created`. +- **Tracked fields:** `payment_token`, `invoice_token`, seller, amount, due date. +- **Tokenization:** No invoice tokens are minted yet. ## 2. Funding (`fund_escrow`) - **Actor:** Buyer / Investor -- **Action:** The investor funds the invoice by transferring the required `payment_token` amount to the escrow contract. -- **State Changes:** Escrow status is updated to `Funded`. The investor is recorded as the `funder`. -- **Tokenization:** The `invoice-escrow` contract uses its minter authorization to call `mint` on the `invoice-token` contract. The investor receives the full `amount` of invoice tokens in their wallet to represent fractional or complete ownership. +- **Action:** Transfers the invoice amount in `payment_token` into the escrow contract. +- **State changes:** Escrow status becomes `Funded`, and `funder` is recorded. +- **Tokenization:** Escrow uses its minter authorization to call `mint` on `invoice-token`, giving the investor invoice ownership tokens. ## 3. Settlement (`record_payment`) - **Actor:** Payer -- **Action:** The payer settles the invoice by sending an `amount` in `payment_token` to the escrow contract. -- **Distribution:** - - The expected `platform_fee` (based on `amount`) is distributed to the admin. - - The rest of the `amount` is distributed to the investor. - - **Proportional Release:** An amount equal to the payer's `amount` is released from the contract's initial funding balance (investor's collateral) to the **Seller**. -- **State Changes:** Escrow status becomes `Settled` only if the total amount paid matches the original `data.amount`. Otherwise, status remains `Funded` to allow for further payments. -- **Tokenization:** After **complete** settlement, the escrow contract calls `set_transfer_locked(false)` on the `invoice-token` contract. +- **Action:** Sends a payment amount into the escrow contract. +- **Escrow accounting:** + The payer payment enters escrow. + The matching amount of the investor’s locked collateral is released from escrow. +- **Distribution path when a distributor is configured:** + Escrow transfers the settlement funds into `payment-distributor`. + Escrow invokes `payment-distributor.distribute_payment(...)`. + Distributor pays: + `seller_amount = payment amount` + `investor_amount = payment amount - platform fee` + `platform_fee = payment amount * fee_bps / 10_000` +- **Distribution path without a distributor:** + Escrow falls back to direct transfers to seller, investor, and admin. +- **State changes:** Escrow remains `Funded` while partial payments are outstanding and becomes `Settled` only when cumulative paid amount reaches the invoice amount. +- **Tokenization:** On full settlement, escrow unlocks `invoice-token` transfers by calling `set_transfer_locked(false)`. ## 4. Refund (`refund`) -- **Actor:** Anyone (typically Investor or Admin) -- **Action:** Triggered if a funded invoice is past its `due_dt` and was not fully paid. -- **Action:** The **remaining** initial funded amount (collateral not yet released to the seller) is refunded to the investor. -- **State Changes:** Escrow status becomes `Refunded`. -- **Tokenization:** After returning remaining funds to the investor, the escrow contract calls `set_transfer_locked(false)` on the `invoice-token` contract. +- **Actor:** Anyone, typically investor or admin +- **Precondition:** Escrow is still `Funded` and the due date has passed. +- **Action:** Calculates the remaining unreleased collateral: `amount - paid_amt`. +- **Distribution path when a distributor is configured:** + Escrow transfers the refund amount into `payment-distributor`. + Escrow invokes `payment-distributor.distribute_refund(...)`. + Distributor returns the remaining collateral to the investor. +- **Distribution path without a distributor:** + Escrow refunds the investor directly. +- **State changes:** Escrow becomes `Refunded`. +- **Tokenization:** Escrow unlocks `invoice-token` transfers after refund. ## Transfer Lock Policy -The `invoice-token` transfer lock follows the escrow lifecycle: - | Escrow State | `transfer_locked` | Who Can Transfer | |---|---|---| | `Created` | `true` | Admin only | @@ -42,4 +55,18 @@ The `invoice-token` transfer lock follows the escrow lifecycle: | `Settled` | `false` | All holders | | `Refunded` | `false` | All holders | -**Access control:** Only the token `admin` or the designated `minter` (the escrow contract address) may call `set_transfer_locked`. This ensures only the escrow lifecycle β€” not arbitrary parties β€” can change the lock state after initialization. +Only the token `admin` or configured `minter` may call `set_transfer_locked`, so transfer lock changes stay tied to the escrow lifecycle. + +## Emergency Pause + +Both lifecycle contracts now expose an admin-controlled emergency pause. + +### Escrow pause +- `invoice-escrow.set_paused(bool)` halts lifecycle-changing operations. +- While paused, `create_escrow`, `cancel_escrow`, `fund_escrow`, `record_payment`, and `refund` are rejected. + +### Token pause +- `invoice-token.set_paused(bool)` halts sensitive token actions. +- While paused, `mint`, `transfer`, `approve`, `transfer_from`, `burn`, and `burn_from` are rejected. + +Both contracts emit `paused_updated` when their pause state changes. diff --git a/scripts/deploy.ps1 b/scripts/deploy.ps1 index 2ce7236..aa1d67e 100644 --- a/scripts/deploy.ps1 +++ b/scripts/deploy.ps1 @@ -6,7 +6,7 @@ Deploys and initialises the following Soroban contracts: 1. invoice-token (SEP-41 invoice tokenisation) 2. invoice-escrow (escrow lifecycle + settlement) - 3. payment-distributor (automated payment distribution) + 3. payment-distributor (settlement/refund payout fan-out) .EXAMPLE # 1. Copy .env.example to .env and fill in your values @@ -233,6 +233,19 @@ soroban contract invoke ` if ($LASTEXITCODE -ne 0) { Write-Err "payment-distributor initialization failed" } Write-Ok "payment-distributor initialised" +# --- invoice-escrow.set_payment_distributor --- +Write-Info "Wiring invoice-escrow to payment-distributor ..." + +soroban contract invoke ` + --source $StellarSecretKey ` + --network $StellarNetwork ` + --id $InvoiceEscrowId ` + -- set_payment_distributor ` + --payment_distributor $PaymentDistributorId + +if ($LASTEXITCODE -ne 0) { Write-Err "invoice-escrow distributor wiring failed" } +Write-Ok "invoice-escrow wired to payment-distributor" + # --------------------------------------------------------------------------- # Summary # --------------------------------------------------------------------------- diff --git a/scripts/deploy.sh b/scripts/deploy.sh index f0ac57e..cba4c5a 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -6,7 +6,7 @@ # Deploys and initialises the following Soroban contracts: # 1. invoice-token (SEP-41 invoice tokenisation) # 2. invoice-escrow (escrow lifecycle + settlement) -# 3. payment-distributor (automated payment distribution) +# 3. payment-distributor (settlement/refund payout fan-out) # # Usage: # # 1. Copy .env.example to .env and fill in your values @@ -214,6 +214,17 @@ soroban contract invoke \ success "payment-distributor initialised" +# --- invoice-escrow.set_payment_distributor --- +info "Wiring invoice-escrow to payment-distributor …" + +soroban contract invoke \ + "${SOROBAN_FLAGS[@]}" \ + --id "${INVOICE_ESCROW_ID}" \ + -- set_payment_distributor \ + --payment_distributor "${PAYMENT_DISTRIBUTOR_ID}" + +success "invoice-escrow wired to payment-distributor" + # --------------------------------------------------------------------------- # Summary # --------------------------------------------------------------------------- diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh index a31cea8..71d4588 100644 --- a/scripts/smoke-test.sh +++ b/scripts/smoke-test.sh @@ -101,7 +101,7 @@ invoke "$INV_TOKEN_CONTRACT_ID" initialize "$ADMIN_SECRET" \ --symbol "SINV" \ --decimals 18 \ --invoice_id "$INVOICE_ID" \ - --escrow_contract "$ESCROW_CONTRACT_ID" + --minter "$ESCROW_CONTRACT_ID" log "Initializing invoice-escrow..." invoke "$ESCROW_CONTRACT_ID" initialize "$ADMIN_SECRET" \ @@ -112,6 +112,10 @@ log "Initializing payment-distributor..." invoke "$DISTRIBUTOR_CONTRACT_ID" initialize "$ADMIN_SECRET" \ --admin "$ADMIN_PUB" +log "Wiring invoice-escrow to payment-distributor..." +invoke "$ESCROW_CONTRACT_ID" set_payment_distributor "$ADMIN_SECRET" \ + --payment_distributor "$DISTRIBUTOR_CONTRACT_ID" + # ── 4. Create escrow ─────────────────────────────────────────────────────────── DUE_DATE=$(( $(date +%s) + 86400 )) # 24 hours from now log "Creating escrow invoice_id=$INVOICE_ID amount=$AMOUNT due_date=$DUE_DATE..."