diff --git a/contracts/escrow/build_output.log b/contracts/escrow/build_output.log new file mode 100644 index 00000000..4ce46c7b --- /dev/null +++ b/contracts/escrow/build_output.log @@ -0,0 +1 @@ + Compiling stellar-xdr v21.2.0 diff --git a/contracts/escrow/errors.txt b/contracts/escrow/errors.txt new file mode 100644 index 00000000..e69de29b diff --git a/contracts/escrow/escrow_conflicts.diff b/contracts/escrow/escrow_conflicts.diff new file mode 100644 index 00000000..4e025b76 --- /dev/null +++ b/contracts/escrow/escrow_conflicts.diff @@ -0,0 +1,2881 @@ +diff --cc contracts/escrow/src/lib.rs +index 1217c81,4063449..0000000 +--- a/contracts/escrow/src/lib.rs ++++ b/contracts/escrow/src/lib.rs +@@@ -97,115 -45,14 +45,125 @@@ pub struct EscrowJob + #[contracttype] + pub enum DataKey { + Job(u64), +++<<<<<<< HEAD + + Config, // Replaces separate Admin + AgentJudge entries + + JobLock(u64), + + JobRegistry, + + Locked, + + MultisigConfig(u64), // Per-job multisig configuration + + UpgradeAdmin, + + Treasury, + + Amended(u64), + +} + + + +#[contracttype] + +#[derive(Clone, Debug, PartialEq)] + +pub struct TreasuryConfig { + + pub routing_address: Address, + + pub fee_bps: u32, +++======= ++ Admin, ++ AgentJudge, ++ GuardFlag(u64), ++ Milestone(u64, u32), +++>>>>>>> upstream/main + +} + + + +#[contracttype] + +#[derive(Clone)] +++<<<<<<< HEAD + +pub struct FeeConfigUpdatedEvent { + + pub treasury: Address, + + pub fee_bps: u32, + + pub updated_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct LockupUpdatedEvent { + + pub job_id: u64, + + pub expires_at: u64, + + pub updated_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct EmergencySweepEvent { + + pub job_id: u64, + + pub admin: Address, + + pub rescue_address: Address, + + pub amount: i128, + + pub swept_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct MilestonesAmendedEvent { + + pub job_id: u64, + + pub milestone_count: u32, + + pub remaining_amount: i128, + + pub amended_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct EscrowInitializedEvent { + + pub admin: Address, + + pub agent_judge: Address, + + pub initialized_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct AgentJudgeUpdatedEvent { + + pub old_agent: Address, + + pub new_agent: Address, + + pub updated_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct UpgradeAdminSetEvent { + + pub old_admin: Option
, + + pub new_admin: Address, + + pub updated_at: u64, + +} + + + +#[contracterror] + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] + +pub enum EscrowError { + + AlreadyInitialized = 1, + + NotInitialized = 2, + + Unauthorized = 3, + + InvalidInput = 4, + + JobNotFound = 5, + + InvalidState = 6, + + AmountMismatch = 7, + + NoPendingMilestones = 8, + + JobRegistrySyncFailed = 9, + + UpgradeUnauthorized = 10, + + InvalidStateTransition = 11, + + ReentrancyDetected = 12, + + MultisigRequired = 13, + + InsufficientSignatures = 14, + + AlreadySigned = 15, + + ArithmeticError = 16, + + UpgradeAdminAlreadySet = 17, + + UpgradeAdminNotSet = 18, + + ArithmeticOverflow = 19, + + DisputeResolutionExpired = 20, + + FeeTooHigh = 21, + + NothingToSweep = 22, + + ReentrantCall = 23, + } + + +/// Maximum platform fee, in basis points (100% = 10_000 bps). + +pub const MAX_FEE_BPS: u32 = 10_000; + + + #[contracttype] + #[derive(Clone)] +++======= +++>>>>>>> upstream/main + pub struct DisputeRaisedEvent { + pub job_id: u64, + pub initiator: Address, +@@@ -214,430 -61,32 +172,284 @@@ + pub raised_at: u64, + } + +++<<<<<<< HEAD + +#[contracttype] + +#[derive(Clone)] + +pub struct DepositEvent { + + pub job_id: u64, + + pub amount: i128, + + pub deposited_at: u64, + +} + +#[contracttype] + +#[derive(Clone)] + +pub struct ReleaseMilestoneEvent { + + pub job_id: u64, + + pub milestone_index: u32, + + pub amount: i128, + + pub released_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct OpenDisputeEvent { + + pub job_id: u64, + + pub initiator: Address, + + pub opened_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct JobRegistryConfiguredEvent { + + pub configured_by: Address, + + pub registry_contract: Address, + + pub configured_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct RegistryDisputeSyncedEvent { + + pub job_id: u64, + + pub registry_contract: Address, + + pub synced_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct ContractUpgradedEvent { + + pub by_admin: Address, + + pub new_wasm_hash: BytesN<32>, + + pub upgraded_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct BriefCanceledEvent { + + pub job_id: u64, + + pub refunded_amount: i128, + + pub canceled_by: Address, + + pub canceled_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone, Debug, PartialEq)] + +pub struct MultisigConfig { + + pub signers: Vec
, + + pub required_signatures: u32, + + pub current_signatures: Vec
, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct MultisigConfiguredEvent { + + pub job_id: u64, + + pub required_signatures: u32, + + pub total_signers: u32, + + pub configured_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct MultisigSignedEvent { + + pub job_id: u64, + + pub signer: Address, + + pub signature_count: u32, + + pub signed_at: u64, + +} + + + +#[contracttype] + +#[derive(Clone)] + +pub struct DisputeExpiredEvent { + + pub job_id: u64, + + pub refunded_to: Address, + + pub amount: i128, + + pub expired_at: u64, + +} + + + + + +struct ReentrancyGuard<'a> { + + env: &'a Env, + +} + + + +impl Drop for ReentrancyGuard<'_> { + + fn drop(&mut self) { + + self.env.storage().instance().remove(&DataKey::Locked); + + } + +} + + + +fn enter_reentrancy_guard(env: &Env) -> ReentrancyGuard<'_> { + + if env.storage().instance().has(&DataKey::Locked) { + + panic_with_error!(env, EscrowError::ReentrancyDetected); + + } + + env.storage().instance().set(&DataKey::Locked, &()); + + ReentrancyGuard { env } + +} + + + +fn checked_i128_add(lhs: i128, rhs: i128) -> Result { + + lhs.checked_add(rhs).ok_or(EscrowError::InvalidInput) + +} + + +++======= +++>>>>>>> upstream/main + #[contract] + pub struct EscrowContract; + + #[contractimpl] + impl EscrowContract { +- const INSTANCE_TTL_THRESHOLD: u32 = 50_000; +- const INSTANCE_TTL_EXTEND_TO: u32 = 150_000; +- const PERSISTENT_TTL_THRESHOLD: u32 = 50_000; +- const PERSISTENT_TTL_EXTEND_TO: u32 = 150_000; +- const MAX_JOB_BUDGET: i128 = 10_000_000_000; +- const MAX_MILESTONE_AMOUNT: i128 = 10_000_000_000; +- const MAX_MILESTONES_PER_JOB: u32 = 32; +- const DISPUTE_RESOLUTION_WINDOW: u64 = 7 * 24 * 60 * 60; +- +- fn bump_instance_ttl(env: &Env) { ++ pub fn initialize(env: Env, admin: Address, agent_judge: Address) { ++ if env.storage().instance().has(&DataKey::Admin) { ++ panic!("already initialized"); ++ } ++ env.storage().instance().set(&DataKey::Admin, &admin); + env.storage() + .instance() +- .extend_ttl(Self::INSTANCE_TTL_THRESHOLD, Self::INSTANCE_TTL_EXTEND_TO); ++ .set(&DataKey::AgentJudge, &agent_judge); + } + +++<<<<<<< HEAD + + fn bump_job_ttl(env: &Env, key: &DataKey) { + + if env.storage().persistent().has(key) { + + env.storage().persistent().extend_ttl( + + key, + + Self::PERSISTENT_TTL_THRESHOLD, + + Self::PERSISTENT_TTL_EXTEND_TO, + + ); + + } + + } + + + + fn enter_job_lock(env: &Env, job_id: u64) -> Result { + + let lock_key = DataKey::JobLock(job_id); + + if env.storage().temporary().has(&lock_key) { + + return Err(EscrowError::ReentrantCall); + + } + + env.storage().temporary().set(&lock_key, &true); + + Ok(lock_key) + + } + + + + fn exit_job_lock(env: &Env, lock_key: DataKey) { + + env.storage().temporary().remove(&lock_key); + + } + + + + fn payout_with_fee(env: &Env, _job_id: u64, job: &EscrowJob, amount: i128) -> Result<(), EscrowError> { + + let token_client = token::Client::new(env, &job.token); + + let mut freelancer_amount = amount; + + + + if let Some(treasury_config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { + + let fee = amount + + .checked_mul(treasury_config.fee_bps as i128) + + .ok_or(EscrowError::ArithmeticError)? + + .checked_div(10000) + + .ok_or(EscrowError::ArithmeticError)?; + + + + if fee > 0 { + + freelancer_amount = amount + + .checked_sub(fee) + + .ok_or(EscrowError::ArithmeticError)?; + + + + token_client.transfer( + + &env.current_contract_address(), + + &treasury_config.routing_address, + + &fee, + + ); + + } + + } + + + + if freelancer_amount > 0 { + + token_client.transfer( + + &env.current_contract_address(), + + &job.freelancer, + + &freelancer_amount, + + ); + + } + + + + Ok(()) + + } + + + + fn assert_not_same_ledger_as_funding(_env: &Env, _job: &EscrowJob) -> Result<(), EscrowError> { + + Ok(()) + + } + + fn sync_dispute_to_job_registry(env: &Env, job_id: u64) -> Result<(), EscrowError> { + + Self::bump_instance_ttl(env); + + let Some(registry_contract) = env + + .storage() + + .instance() + + .get::<_, Address>(&DataKey::JobRegistry) + + else { + + return Ok(()); + + }; + + + + let client = JobRegistryClient::new(env, ®istry_contract); + + client + + .try_mark_disputed(&job_id) + + .map_err(|_| EscrowError::JobRegistrySyncFailed)? + + .map_err(|_| EscrowError::JobRegistrySyncFailed)?; + + + + env.events().publish( + + ("escrow", "RegistryDisputeSynced"), + + RegistryDisputeSyncedEvent { + + job_id, + + registry_contract, + + synced_at: env.ledger().timestamp(), + + }, + + ); + + + + Ok(()) + + } + + + + pub fn version(_env: Env) -> u32 { + + 1 + + } + + + + pub fn initialize(env: Env, admin: Address, agent_judge: Address) -> Result<(), EscrowError> { + + // Prevent double initialization + + if env.storage().instance().has(&DataKey::Config) { + + return Err(EscrowError::AlreadyInitialized); + + } + + + + admin.require_auth(); + + + + // Basic validation: admin and agent_judge must be distinct + + if admin == agent_judge { + + return Err(EscrowError::InvalidInput); + + } + + + + + + env.storage().instance().set( + + &DataKey::Config, + + &ContractConfig { + + admin: admin.clone(), + + agent_judge: agent_judge.clone(), + + }, + + ); + + + + // Emit an initialization event for off-chain consumers and logging + + log!( + + &env, + + "Escrow initialized with admin: {} and agent_judge: {}", + + admin, + + agent_judge + + ); + + env.events().publish( + + ("escrow", "Initialized"), + + (admin.clone(), agent_judge.clone(), env.ledger().timestamp()), + + ); + + + + Self::bump_instance_ttl(&env); + + + + Ok(()) + + } +++======= +++>>>>>>> upstream/main + /// Admin can update the Agent Judge address. +- /// Admin can update the Agent Judge address. +- pub fn set_agent_judge(env: Env, new_agent_judge: Address) -> Result<(), EscrowError> { +- let mut config: ContractConfig = env +- .storage() +- .instance() +- .get(&DataKey::Config) +- .ok_or(EscrowError::NotInitialized)?; +- config.admin.require_auth(); +- +- if config.admin == new_agent_judge { +- return Err(EscrowError::InvalidInput); +- } +- +- let admin = config.admin.clone(); +- config.agent_judge = new_agent_judge.clone(); +- env.storage().instance().set(&DataKey::Config, &config); +- +- // Emit an event for off-chain logging and debugging +- log!(&env, "Agent Judge updated to: {}", new_agent_judge); +- env.events().publish( +- ("escrow", "AgentJudgeUpdated"), +- ( +- admin.clone(), +- new_agent_judge.clone(), +- env.ledger().timestamp(), +- ), +- ); +- +- Self::bump_instance_ttl(&env); +- +- Ok(()) +- } +- +- /// Admin configures the JobRegistry contract address used for cross-contract sync. +- pub fn set_job_registry(env: Env, job_registry: Address) -> Result<(), EscrowError> { +- let config: ContractConfig = env ++ pub fn set_agent_judge(env: Env, new_agent_judge: Address) { ++ let admin: Address = env + .storage() + .instance() +- .get(&DataKey::Config) +- .ok_or(EscrowError::NotInitialized)?; +- let admin = config.admin; +- admin.require_auth(); +- +- env.storage() +- .instance() +- .set(&DataKey::JobRegistry, &job_registry); +- +- log!(&env, "JobRegistry configured to: {}", job_registry); +- env.events().publish( +- ("escrow", "JobRegistryConfigured"), +- JobRegistryConfiguredEvent { +- configured_by: admin, +- registry_contract: job_registry, +- configured_at: env.ledger().timestamp(), +- }, +- ); +- +- Self::bump_instance_ttl(&env); +- +- Ok(()) +- } +- +- pub fn get_job_registry(env: Env) -> Option
{ +- env.storage().instance().get(&DataKey::JobRegistry) +- } +- +- /// One-time initialization of the upgrade admin. +- pub fn init_upgrade_admin(env: Env, admin: Address) -> Result<(), EscrowError> { +- if env.storage().instance().has(&DataKey::UpgradeAdmin) { +- return Err(EscrowError::UpgradeAdminAlreadySet); +- } ++ .get(&DataKey::Admin) ++ .expect("not initialized"); + admin.require_auth(); +- env.storage().instance().set(&DataKey::UpgradeAdmin, &admin); +- +- env.events().publish( +- ("escrow", "UpgradeAdminSet"), +- UpgradeAdminSetEvent { +- old_admin: None, +- new_admin: admin, +- updated_at: env.ledger().timestamp(), +- }, +- ); +- Ok(()) +- } +- +- /// Rotate the upgrade admin. +- pub fn set_upgrade_admin( +- env: Env, +- caller: Address, +- new_admin: Address, +- ) -> Result<(), EscrowError> { +- caller.require_auth(); +- let current_admin: Address = env +- .storage() +- .instance() +- .get(&DataKey::UpgradeAdmin) +- .ok_or(EscrowError::UpgradeAdminNotSet)?; +- +- if caller != current_admin { +- return Err(EscrowError::Unauthorized); +- } +- +- env.storage() +- .instance() +- .set(&DataKey::UpgradeAdmin, &new_admin); +- +- env.events().publish( +- ("escrow", "UpgradeAdminSet"), +- UpgradeAdminSetEvent { +- old_admin: Some(current_admin), +- new_admin, +- updated_at: env.ledger().timestamp(), +- }, +- ); +- Ok(()) +- } +- +- /// Returns the current upgrade admin address. +- pub fn get_upgrade_admin(env: Env) -> Result { + env.storage() + .instance() +- .get(&DataKey::UpgradeAdmin) +- .ok_or(EscrowError::UpgradeAdminNotSet) +- } +- +- /// Upgrades the current contract WASM. Only callable by upgrade admin. +- pub fn upgrade( +- env: Env, +- caller: Address, +- new_wasm_hash: BytesN<32>, +- ) -> Result<(), EscrowError> { +- Self::bump_instance_ttl(&env); +- caller.require_auth(); +- +- let upgrade_admin: Address = env +- .storage() +- .instance() +- .get(&DataKey::UpgradeAdmin) +- .ok_or(EscrowError::UpgradeAdminNotSet)?; +- +- if caller != upgrade_admin { +- return Err(EscrowError::UpgradeUnauthorized); +- } +- +- env.deployer() +- .update_current_contract_wasm(new_wasm_hash.clone()); +- log!(&env, "Contract upgraded by admin"); +- env.events().publish( +- ("escrow", "ContractUpgraded"), +- ContractUpgradedEvent { +- by_admin: caller, +- new_wasm_hash, +- upgraded_at: env.ledger().timestamp(), +- }, +- ); +- +- Ok(()) ++ .set(&DataKey::AgentJudge, &new_agent_judge); + } + + /// Client creates a job entry in Setup phase. +@@@ -651,22 -100,24 +463,36 @@@ + client.require_auth(); + let key = DataKey::Job(job_id); + if env.storage().persistent().has(&key) { +- return Err(EscrowError::InvalidInput); ++ panic!("job already exists"); + } + let now: u64 = env.ledger().timestamp(); +++<<<<<<< HEAD + + let expires_duration = 30u64 + + .checked_mul(24) + + .and_then(|h| h.checked_mul(60)) + + .and_then(|m| m.checked_mul(60)) + + .ok_or(EscrowError::ArithmeticError)?; + + + +let expires_at = now + + .checked_add(expires_duration) + + .ok_or(EscrowError::ArithmeticError)?; +++======= ++ let expires_at = now ++ .checked_add( ++ 30u64 ++ .checked_mul(24) ++ .expect("overflow") ++ .checked_mul(60) ++ .expect("overflow") ++ .checked_mul(60) ++ .expect("overflow"), ++ ) ++ .expect("overflow"); +++>>>>>>> upstream/main + + let job = EscrowJob { +- client: client.clone(), +- freelancer: freelancer.clone(), ++ client, ++ freelancer, + token: token_addr, + total_amount: 0, + released_amount: 0, +@@@ -824,128 -213,34 +588,113 @@@ + } + } + +++<<<<<<< HEAD + + let idx = match found_idx { + + Some(i) => i, + + None => return Err(EscrowError::NoPendingMilestones), + + }; + + + + let mut milestone = job.milestones.get(idx).unwrap(); + + let lock_key = Self::enter_job_lock(&env, job_id)?; + + + + milestone.status = MilestoneStatus::Released; + + job.milestones.set(idx, milestone.clone()); + + + + job.released_amount = checked_i128_add(job.released_amount, milestone.amount)?; + + + + let next_status = if job.released_amount == job.total_amount { + + EscrowStatus::Completed + + } else { + + EscrowStatus::WorkInProgress + + }; + + job.status.validate_transition(&next_status)?; + + job.status = next_status; + + + + let _guard = enter_reentrancy_guard(&env); + + env.storage().persistent().set(&key, &job); + + + + Self::payout_with_fee(&env, job_id, &job, milestone.amount)?; + + + + log!( + + &env, + + "release_milestone: job {} amount {}", + + job_id, + + milestone.amount + + ); + + env.storage().persistent().set(&key, &job); + + Self::bump_job_ttl(&env, &key); + + Self::exit_job_lock(&env, lock_key); + + + + Self::exit_reentrancy_guard(&env); + + + + // Emit event + + env.events().publish( + + ("escrow", "ReleaseMilestone"), + + (job_id, idx, milestone.amount, env.ledger().timestamp()), + + ); + + + + Ok(()) +++======= ++ let idx = found_idx.expect("no pending"); ++ Self::set_guard(&env, job_id); ++ Self::release_milestone_internal(&env, job_id, &mut job, idx); ++ Self::clear_guard(&env, job_id); +++>>>>>>> upstream/main + } + + /// Happy-path release for an explicit milestone index (0-based). +- /// Only the client may call this to release the funds for a specific milestone. +- pub fn release_funds( +- env: Env, +- job_id: u64, +- caller: Address, +- milestone_index: u32, +- ) -> Result<(), EscrowError> { ++ pub fn release_funds(env: Env, job_id: u64, caller: Address, milestone_index: u32) { + caller.require_auth(); ++ Self::check_reentrancy(&env, job_id); + + let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env +- .storage() +- .persistent() +- .get(&key) +- .ok_or(EscrowError::JobNotFound)?; +- Self::bump_job_ttl(&env, &key); +- +- Self::assert_not_same_ledger_as_funding(&env, &job)?; +- +- if !(job.status == EscrowStatus::Funded +- || job.status == EscrowStatus::WorkInProgress) +- { +- return Err(EscrowError::InvalidState); +- } +- +- if caller != job.client { +- return Err(EscrowError::Unauthorized); +- } +- +- if milestone_index >= job.milestones.len() { +- return Err(EscrowError::InvalidInput); +- } ++ let mut job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); + +- let mut milestone = job +- .milestones +- .get(milestone_index) +- .expect("invalid milestone"); + assert!( +- milestone.status == MilestoneStatus::Pending, +- "milestone already released" ++ job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress, ++ "invalid state" + ); +- let lock_key = Self::enter_job_lock(&env, job_id).expect("reentrant job operation"); ++ assert!(caller == job.client, "unauthorized"); ++ assert!(milestone_index < job.milestone_count, "invalid"); + +- milestone.status = MilestoneStatus::Released; +- job.milestones.set(milestone_index, milestone.clone()); ++ let m_key = DataKey::Milestone(job_id, milestone_index); ++ let milestone: Milestone = env.storage().persistent().get(&m_key).expect("invalid"); ++ assert!(milestone.status == MilestoneStatus::Pending, "released"); + +++<<<<<<< HEAD + + job.released_amount = checked_i128_add(job.released_amount, milestone.amount)?; + + assert!( + + job.released_amount <= job.total_amount, + + "double-spend: released exceeds total" + + ); + + let next_status = if job.released_amount == job.total_amount { + + EscrowStatus::Completed + + } else { + + EscrowStatus::WorkInProgress + + }; + + job.status.validate_transition(&next_status)?; + + job.status = next_status; + + + + let _guard = enter_reentrancy_guard(&env); + + env.storage().persistent().set(&key, &job); + + + + Self::payout_with_fee(&env, job_id, &job, milestone.amount)?; + + + + log!( + + &env, + + "release_funds: job {} amount {}", + + job_id, + + milestone.amount + + ); + + env.storage().persistent().set(&key, &job); + + Self::bump_job_ttl(&env, &key); + + Self::exit_job_lock(&env, lock_key); + + Ok(()) +++======= ++ Self::set_guard(&env, job_id); ++ Self::release_milestone_internal(&env, job_id, &mut job, milestone_index); ++ Self::clear_guard(&env, job_id); +++>>>>>>> upstream/main + } + + /// Either party opens a dispute, locking remaining funds. +@@@ -1072,81 -336,30 +790,76 @@@ + /// Agent Judge resolves dispute -- splits funds by explicit amounts. + /// `payee_amount`: Amount to pay to the freelancer (payee). + /// `payer_amount`: Amount to return to the client (payer). +- pub fn resolve_dispute( +- env: Env, +- job_id: u64, +- payee_amount: i128, +- payer_amount: i128, +- ) -> Result<(), EscrowError> { +- Self::bump_instance_ttl(&env); +- let config: ContractConfig = env ++ pub fn resolve_dispute(env: Env, job_id: u64, payee_amount: i128, payer_amount: i128) { ++ let agent_judge: Address = env + .storage() + .instance() +- .get(&DataKey::Config) +- .expect("not initialized"); +- config.agent_judge.require_auth(); ++ .get(&DataKey::AgentJudge) ++ .expect("agent judge not set"); ++ agent_judge.require_auth(); + +- if payee_amount < 0 || payer_amount < 0 { +- return Err(EscrowError::InvalidInput); +- } ++ assert!(payee_amount >= 0, "payee_amount must be >= 0"); ++ assert!(payer_amount >= 0, "payer_amount must be >= 0"); + + let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env +- .storage() +- .persistent() +- .get(&key) +- .ok_or(EscrowError::JobNotFound)?; +- Self::bump_job_ttl(&env, &key); +- if job.status != EscrowStatus::Disputed { +- return Err(EscrowError::InvalidState); +- } ++ let mut job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); ++ assert!(job.status == EscrowStatus::Disputed, "job not disputed"); + +++<<<<<<< HEAD + + if job.dispute_deadline > 0 && env.ledger().timestamp() > job.dispute_deadline { + + panic_with_error!(&env, EscrowError::DisputeResolutionExpired); + + } + + + + let remaining = job.total_amount.checked_sub(job.released_amount) + + .expect("invalid escrow balance state"); + + let total_payout = checked_i128_add(payee_amount, payer_amount) + + .expect("invalid dispute payout state"); + + assert!(total_payout <= remaining, "payout exceeds remaining funds"); + + let lock_key = Self::enter_job_lock(&env, job_id).expect("reentrant job operation"); + + + + let next_status = EscrowStatus::Resolved; + + job.status + + .validate_transition(&next_status) + + .expect("invalid state transition"); + + job.released_amount = checked_i128_add(job.released_amount, total_payout) + + .expect("released amount overflow"); + + job.status = next_status; + + + + let _guard = enter_reentrancy_guard(&env); + + env.storage().persistent().set(&key, &job); +++======= ++ let remaining = job ++ .total_amount ++ .checked_sub(job.released_amount) ++ .expect("overflow"); ++ let total_payout = payee_amount.checked_add(payer_amount).expect("overflow"); ++ assert!(total_payout <= remaining, "payout exceeds remaining funds"); +++>>>>>>> upstream/main + + let token_client = token::Client::new(&env, &job.token); + - if payee_amount > 0 { + + let mut freelancer_amount = payee_amount; + + + + if let Some(treasury_config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { + + let fee = payee_amount + + .checked_mul(treasury_config.fee_bps as i128) + + .ok_or(EscrowError::ArithmeticError)? + + .checked_div(10000) + + .ok_or(EscrowError::ArithmeticError)?; + + + + if fee > 0 { + + freelancer_amount = payee_amount + + .checked_sub(fee) + + .ok_or(EscrowError::ArithmeticError)?; + + + + token_client.transfer( + + &env.current_contract_address(), + + &treasury_config.routing_address, + + &fee, + + ); + + } + + } + + + + if freelancer_amount > 0 { + token_client.transfer( + &env.current_contract_address(), + &job.freelancer, +@@@ -1157,90 -370,26 +870,66 @@@ + token_client.transfer(&env.current_contract_address(), &job.client, &payer_amount); + } + +- log!( +- &env, +- "resolve_dispute: job {} payee {} payer {}", +- job_id, +- payee_amount, +- payer_amount +- ); ++ job.released_amount = job ++ .released_amount ++ .checked_add(total_payout) ++ .expect("overflow"); ++ job.status = EscrowStatus::Resolved; + env.storage().persistent().set(&key, &job); +++<<<<<<< HEAD + + Self::bump_job_ttl(&env, &key); + + Self::exit_job_lock(&env, lock_key); + + Ok(()) +++======= +++>>>>>>> upstream/main + } + +- /// Client recoups funds if freelancer never responded or deadline has passed. +- pub fn refund(env: Env, job_id: u64, client: Address) -> Result<(), EscrowError> { ++ /// Client recoups funds if freelancer never responded. ++ pub fn refund(env: Env, job_id: u64, client: Address) { + client.require_auth(); + + let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env +- .storage() +- .persistent() +- .get(&key) +- .ok_or(EscrowError::JobNotFound)?; +- Self::bump_job_ttl(&env, &key); ++ let mut job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); + +++<<<<<<< HEAD + + Self::assert_not_same_ledger_as_funding(&env, &job)?; + + + + if !(job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress) { + + return Err(EscrowError::InvalidState); + + } + + + + if client != job.client { + + return Err(EscrowError::Unauthorized); + + } + + + + let remaining = job.total_amount - job.released_amount; + + let lock_key = Self::enter_job_lock(&env, job_id)?; + + let _guard = enter_reentrancy_guard(&env); + + if remaining > 0 { + + let token_client = token::Client::new(&env, &job.token); + + token_client.transfer(&env.current_contract_address(), &job.client, &remaining); + + } + + + + let next_status = EscrowStatus::Refunded; + + job.status = next_status; + + + + log!(&env, "refund: job {} amount {}", job_id, remaining); + + env.storage().persistent().set(&key, &job); + + Self::bump_job_ttl(&env, &key); + + Self::exit_job_lock(&env, lock_key); + + + + Self::exit_reentrancy_guard(&env); + + + + env.events().publish( + + ("escrow", "Refunded"), + + (job_id, client, remaining, env.ledger().timestamp()), +++======= ++ assert!( ++ job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress, ++ "job not in active state" +++>>>>>>> upstream/main + ); +- +- Ok(()) +- } +- +- /// Client cancels a brief and triggers graceful refund behavior. +- /// Supports Setup (no funds moved yet), Funded, and WorkInProgress states. +- pub fn cancel_brief(env: Env, job_id: u64, client: Address) -> Result<(), EscrowError> { +- client.require_auth(); +- +- let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env +- .storage() +- .persistent() +- .get(&key) +- .ok_or(EscrowError::JobNotFound)?; +- Self::bump_job_ttl(&env, &key); +- +- if client != job.client { +- return Err(EscrowError::Unauthorized); +- } +- +- if !(job.status == EscrowStatus::Setup +- || job.status == EscrowStatus::Funded +- || job.status == EscrowStatus::WorkInProgress) +- { +- return Err(EscrowError::InvalidState); +- } ++ assert!(client == job.client, "only client can refund"); + + let remaining = job + .total_amount +@@@ -1330,99 -416,18 +956,33 @@@ + let job: EscrowJob = env + .storage() + .persistent() +- .get(&key) +- .ok_or(EscrowError::JobNotFound)?; +- Self::bump_job_ttl(&env, &key); ++ .get(&DataKey::Job(job_id)) ++ .expect("job not found"); + job.total_amount + .checked_sub(job.released_amount) +- .ok_or(EscrowError::ArithmeticOverflow) +- } +- +- /// Returns escrow's core live parameters for a job: total, released, and funding ledger sequence. +- pub fn get_active_escrow_params( +- env: Env, +- job_id: u64, +- ) -> Result<(i128, i128, u32), EscrowError> { +- let key = DataKey::Job(job_id); +- let job: EscrowJob = env +- .storage() +- .persistent() +- .get(&key) +- .ok_or(EscrowError::JobNotFound)?; +- Self::bump_job_ttl(&env, &key); +- Ok((job.total_amount, job.released_amount, job.funded_ledger_seq)) +- } +- +- /// Returns the dispute resolution deadline (unix timestamp). 0 = no active dispute. +- pub fn get_dispute_deadline(env: Env, job_id: u64) -> u64 { +- let key = DataKey::Job(job_id); +- let job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); +- Self::bump_job_ttl(&env, &key); +- job.dispute_deadline ++ .expect("overflow") + } + +- /// Force-expire an unresolved dispute after the deadline; refunds client. +- pub fn expire_dispute(env: Env, job_id: u64) -> Result<(), EscrowError> { +- Self::bump_instance_ttl(&env); +- let config: ContractConfig = env +- .storage() +- .instance() +- .get(&DataKey::Config) +- .ok_or(EscrowError::NotInitialized)?; +- config.agent_judge.require_auth(); +- +- let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env +- .storage() +- .persistent() +- .get(&key) +- .ok_or(EscrowError::JobNotFound)?; +- Self::bump_job_ttl(&env, &key); +- +- if job.status != EscrowStatus::Disputed { +- return Err(EscrowError::InvalidState); +- } +- +- let now = env.ledger().timestamp(); +- if job.dispute_deadline == 0 || now <= job.dispute_deadline { +- return Err(EscrowError::InvalidState); +- } +- +- let remaining = job.total_amount - job.released_amount; +- let next_status = EscrowStatus::Refunded; +- job.status.validate_transition(&next_status)?; +- job.released_amount = job.total_amount; +- job.status = next_status; +- +- let _guard = enter_reentrancy_guard(&env); +- env.storage().persistent().set(&key, &job); +- +- if remaining > 0 { +- let token_client = token::Client::new(&env, &job.token); +- token_client.transfer(&env.current_contract_address(), &job.client, &remaining); +- } +- +- log!( +- &env, +- "expire_dispute: job {} refunded {}", +- job_id, +- remaining +- ); +- env.storage().persistent().set(&key, &job); +- Self::bump_job_ttl(&env, &key); +- +++<<<<<<< HEAD + +Self::exit_reentrancy_guard(&env); + + env.events().publish( + + ("escrow", "DisputeExpired"), + + DisputeExpiredEvent { + + job_id, + + refunded_to: job.client, + + amount: remaining, + + expired_at: now, + + }, + + ); + + + + Ok(()) +++======= ++ pub fn get_milestone(env: Env, job_id: u64, index: u32) -> Milestone { ++ env.storage() ++ .persistent() ++ .get(&DataKey::Milestone(job_id, index)) ++ .expect("milestone not found") +++>>>>>>> upstream/main + } + + /// Retrieve the status of all milestones for a given job. +@@@ -1434,451 -435,71 +990,449 @@@ + let job: EscrowJob = env + .storage() + .persistent() +- .get(&key) +- .ok_or(EscrowError::JobNotFound)?; +- Self::bump_job_ttl(&env, &key); ++ .get(&DataKey::Job(job_id)) ++ .expect("job not found"); + let mut statuses = Vec::new(&env); +- for m in job.milestones.iter() { ++ for i in 0..job.milestone_count { ++ let m_key = DataKey::Milestone(job_id, i); ++ let m: Milestone = env ++ .storage() ++ .persistent() ++ .get(&m_key) ++ .expect("milestone not found"); + statuses.push_back(m.status); + } +- Ok(statuses) ++ statuses + } ++ } + + -impl EscrowContract { + - fn check_reentrancy(env: &Env, job_id: u64) { + - if env.storage().instance().has(&DataKey::GuardFlag(job_id)) { + - panic!("reentrant"); + - } +++<<<<<<< HEAD + + /// Retrieve the multisig configuration for a given job. + + pub fn get_multisig_config(env: Env, job_id: u64) -> Result { + + let config_key = DataKey::MultisigConfig(job_id); + + let config: MultisigConfig = env + + .storage() + + .persistent() + + .get(&config_key) + + .ok_or(EscrowError::InvalidInput)?; + + Self::bump_job_ttl(&env, &config_key); + + Ok(config) + } + + - fn set_guard(env: &Env, job_id: u64) { + - env.storage() + + /// Read-only helper exposing active escrow configuration. + + pub fn get_escrow_config(env: Env) -> Result<(Address, Address, Option
), EscrowError> { + + let config: ContractConfig = env + + .storage() + .instance() + - .set(&DataKey::GuardFlag(job_id), &true); + + .get(&DataKey::Config) + + .ok_or(EscrowError::NotInitialized)?; + + let job_registry: Option
= env.storage().instance().get(&DataKey::JobRegistry); + + Self::bump_instance_ttl(&env); + + Ok((config.admin, config.agent_judge, job_registry)) + } + + - fn clear_guard(env: &Env, job_id: u64) { + - env.storage().instance().remove(&DataKey::GuardFlag(job_id)); + - } + - + - fn release_milestone_internal( + - env: &Env, + - job_id: u64, + - job: &mut EscrowJob, + - milestone_index: u32, + - ) { + - let m_key = DataKey::Milestone(job_id, milestone_index); + - let mut milestone: Milestone = env.storage().persistent().get(&m_key).expect("invalid"); + + - milestone.status = MilestoneStatus::Released; + - env.storage().persistent().set(&m_key, &milestone); + + - job.released_amount = job + - .released_amount + - .checked_add(milestone.amount) + - .expect("overflow"); + - job.status = EscrowStatus::WorkInProgress; + + /// Configure multisig for a job. Only callable by client during Setup phase. + + pub fn configure_multisig( + + env: Env, + + job_id: u64, + + signers: Vec
, + + required_signatures: u32, + + ) -> Result<(), EscrowError> { + + let key = DataKey::Job(job_id); + + let mut job: EscrowJob = env + + .storage() + + .persistent() + + .get(&key) + + .ok_or(EscrowError::JobNotFound)?; + + Self::bump_job_ttl(&env, &key); + + - let token_client = token::Client::new(&env, &job.token); + - token_client.transfer( + - &env.current_contract_address(), + - &job.freelancer, + - &milestone.amount, + - ); + + job.client.require_auth(); + + - if job.released_amount == job.total_amount { + - job.status = EscrowStatus::Completed; + + if job.status != EscrowStatus::Setup { + + return Err(EscrowError::InvalidState); +++======= +++impl EscrowContract { +++ fn check_reentrancy(env: &Env, job_id: u64) { +++ if env.storage().instance().has(&DataKey::GuardFlag(job_id)) { +++ panic!("reentrant"); +++>>>>>>> upstream/main + } +- +- if signers.is_empty() || required_signatures == 0 { +- return Err(EscrowError::InvalidInput); +- } +- +- if required_signatures > signers.len() { +- return Err(EscrowError::InvalidInput); +- } +- +- let config = MultisigConfig { +- signers: signers.clone(), +- required_signatures, +- current_signatures: Vec::new(&env), +- }; +- +- env.storage() +- .persistent() +- .set(&DataKey::MultisigConfig(job_id), &config); +- +- job.requires_multisig = true; +- env.storage().persistent().set(&key, &job); +- Self::bump_job_ttl(&env, &key); +- +- env.events().publish( +- ("escrow", "MultisigConfigured"), +- MultisigConfiguredEvent { +- job_id, +- required_signatures, +- total_signers: signers.len(), +- configured_at: env.ledger().timestamp(), +- }, +- ); +-- +- Ok(()) + - env.storage().persistent().set(&DataKey::Job(job_id), job); + } + -} + + +++<<<<<<< HEAD + + /// Sign a multisig job. Callable by any configured signer. + + pub fn sign_multisig(env: Env, job_id: u64, signer: Address) -> Result<(), EscrowError> { + + signer.require_auth(); + + + + let key = DataKey::Job(job_id); + + let job: EscrowJob = env + + .storage() + + .persistent() + + .get(&key) + + .ok_or(EscrowError::JobNotFound)?; + + Self::bump_job_ttl(&env, &key); + + + + if !job.requires_multisig { + + return Err(EscrowError::InvalidInput); + + } + + + + let config_key = DataKey::MultisigConfig(job_id); + + let mut config: MultisigConfig = env + + .storage() + + .persistent() + + .get(&config_key) + + .ok_or(EscrowError::InvalidInput)?; + + + + // Check if signer is authorized + + let mut is_signer = false; + + for s in config.signers.iter() { + + if s == signer { + + is_signer = true; + + break; + + } + + } + + if !is_signer { + + return Err(EscrowError::Unauthorized); + + } + + + + // Check if already signed + + for s in config.current_signatures.iter() { + + if s == signer { + + return Err(EscrowError::AlreadySigned); + + } + + } + + + + config.current_signatures.push_back(signer.clone()); + + env.storage().persistent().set(&config_key, &config); + + Self::bump_job_ttl(&env, &config_key); + + + + env.events().publish( + + ("escrow", "MultisigSigned"), + + MultisigSignedEvent { + + job_id, + + signer, + + signature_count: config.current_signatures.len(), + + signed_at: env.ledger().timestamp(), + + }, + + ); + + + + Ok(()) + + } + + + + /// Check if a multisig job has enough signatures + + pub fn check_multisig_ready(env: Env, job_id: u64) -> Result { + + let key = DataKey::Job(job_id); + + let job: EscrowJob = env + + .storage() + + .persistent() + + .get(&key) + + .ok_or(EscrowError::JobNotFound)?; + + + + if !job.requires_multisig { + + return Ok(true); + + } + + + + let config_key = DataKey::MultisigConfig(job_id); + + let config: MultisigConfig = env + + .storage() + + .persistent() + + .get(&config_key) + + .ok_or(EscrowError::InvalidInput)?; + + + + Ok(config.current_signatures.len() >= config.required_signatures) + + } + + + + // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + + // SC-ESC-001: Admin fee splitting + + // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + + + + /// Admin configures the platform treasury and fee (in basis points). + + /// Once set, milestone releases route `fee_bps` of each payout to the + + /// treasury and the remainder to the freelancer. + + pub fn set_fee_config(env: Env, treasury: Address, fee_bps: u32) -> Result<(), EscrowError> { + + let config: ContractConfig = env + + .storage() + + .instance() + + .get(&DataKey::Config) + + .ok_or(EscrowError::NotInitialized)?; + + config.admin.require_auth(); + + + + if fee_bps > MAX_FEE_BPS { + + return Err(EscrowError::FeeTooHigh); + + } + + + + let t_config = TreasuryConfig { + + routing_address: treasury.clone(), + + fee_bps, + + }; + + env.storage().instance().set(&DataKey::Treasury, &t_config); + + Self::bump_instance_ttl(&env); + + + + env.events().publish( + + ("escrow", "FeeConfigUpdated"), + + FeeConfigUpdatedEvent { + + treasury, + + fee_bps, + + updated_at: env.ledger().timestamp(), + + }, + + ); + + + + Ok(()) + + } + + + + /// Returns the active platform fee in basis points (0 when unset). + + pub fn get_fee_bps(env: Env) -> u32 { + + Self::bump_instance_ttl(&env); + + if let Some(config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { + + config.fee_bps + + } else { + + 0 + + } + + } + + + + /// Returns the configured treasury address, if any. + + pub fn get_treasury(env: Env) -> Option
{ + + Self::bump_instance_ttl(&env); + + if let Some(config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { + + Some(config.routing_address) + + } else { + + None + + } +++======= +++ fn set_guard(env: &Env, job_id: u64) { +++ env.storage() +++ .instance() +++ .set(&DataKey::GuardFlag(job_id), &true); + + } + + +- fn exit_reentrancy_guard(env: &Env) { +- env.storage().instance().remove(&DataKey::Locked); +++ fn clear_guard(env: &Env, job_id: u64) { +++ env.storage().instance().remove(&DataKey::GuardFlag(job_id)); +++>>>>>>> upstream/main + + } + + +- // ───────────────────────────────────────────────────────────────────── +- // SC-ESC-002: Dynamic lockup durations +- // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +- +- /// Client sets a custom lockup duration (in seconds) during Setup. The +- /// job's expiry becomes `created_at + lockup_seconds`. Until expiry the +- /// client cannot refund (see `refund`). +- pub fn set_lockup_duration( +- env: Env, +++ fn release_milestone_internal( +++ env: &Env, + + job_id: u64, +- lockup_seconds: u64, +- ) -> Result<(), EscrowError> { +- let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env +- .storage() +- .persistent() +- .get(&key) +- .ok_or(EscrowError::JobNotFound)?; +- Self::bump_job_ttl(&env, &key); +++ job: &mut EscrowJob, +++ milestone_index: u32, +++ ) { +++ let m_key = DataKey::Milestone(job_id, milestone_index); +++ let mut milestone: Milestone = env.storage().persistent().get(&m_key).expect("invalid"); + + +- job.client.require_auth(); +++ milestone.status = MilestoneStatus::Released; +++ env.storage().persistent().set(&m_key, &milestone); + + +++<<<<<<< HEAD + + if job.status != EscrowStatus::Setup { + + return Err(EscrowError::InvalidState); + + } + + if lockup_seconds == 0 { + + return Err(EscrowError::InvalidInput); + + } + + + + let expires_at = job + + .created_at + + .checked_add(lockup_seconds) + + .ok_or(EscrowError::InvalidInput)?; + + job.expires_at = expires_at; + + + + env.storage().persistent().set(&key, &job); + + Self::bump_job_ttl(&env, &key); + + + + env.events().publish( + + ("escrow", "LockupUpdated"), + + LockupUpdatedEvent { + + job_id, + + expires_at, + + updated_at: env.ledger().timestamp(), + + }, + + ); + + + + Ok(()) + + } + + + + /// Returns the lockup expiry timestamp for a job. + + pub fn get_expiry(env: Env, job_id: u64) -> Result { + + let key = DataKey::Job(job_id); + + let job: EscrowJob = env + + .storage() + + .persistent() + + .get(&key) + + .ok_or(EscrowError::JobNotFound)?; + + Ok(job.expires_at) + + } + + + + // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + + // SC-ESC-003: Emergency escrow sweep (admin-gated) + + // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + + + + /// Emergency sweep of the entire locked balance for a job to a rescue + + /// address. Only the admin may invoke this. It overrides the active state + + /// machine and bypasses standard release rules for catastrophic recovery. + + pub fn emergency_sweep( + + env: Env, + + job_id: u64, + + rescue_address: Address, + + ) -> Result<(), EscrowError> { + + let config: ContractConfig = env + + .storage() + + .instance() + + .get(&DataKey::Config) + + .ok_or(EscrowError::NotInitialized)?; + + config.admin.require_auth(); + + + + let key = DataKey::Job(job_id); + + let mut job: EscrowJob = env + + .storage() + + .persistent() + + .get(&key) + + .ok_or(EscrowError::JobNotFound)?; + + Self::bump_job_ttl(&env, &key); + + + + let remaining = job + + .total_amount + + .checked_sub(job.released_amount) + + .ok_or(EscrowError::InvalidState)?; + + if remaining <= 0 { + + return Err(EscrowError::NothingToSweep); + + } + + + + let _guard = enter_reentrancy_guard(&env); + + + + // Override the state machine: mark fully released and refunded. + + job.released_amount = job.total_amount; + + job.status = EscrowStatus::Refunded; + + + + let token_client = token::Client::new(&env, &job.token); + + token_client.transfer(&env.current_contract_address(), &rescue_address, &remaining); + + + + env.storage().persistent().set(&key, &job); + + Self::bump_job_ttl(&env, &key); + + + + Self::exit_reentrancy_guard(&env); + + + + env.events().publish( + + ("escrow", "EmergencySweep"), + + EmergencySweepEvent { + + job_id, + + admin: config.admin, + + rescue_address, + + amount: remaining, + + swept_at: env.ledger().timestamp(), + + }, + + ); + + + + Ok(()) + + } + + + + // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + + // SC-ESC-004: Milestone re-allocation / amendment + + // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + + + + /// Mutually amend the remaining (unreleased) milestone structure. Both the + + /// client and the freelancer must authorize. The sum of the new + + /// allocations must equal the remaining balance. Amendments are rejected + + /// once the job is disputed. + + pub fn amend_milestones( + + env: Env, + + job_id: u64, + + new_amounts: Vec, + + ) -> Result<(), EscrowError> { + + let key = DataKey::Job(job_id); + + let mut job: EscrowJob = env + + .storage() + + .persistent() + + .get(&key) + + .ok_or(EscrowError::JobNotFound)?; + + Self::bump_job_ttl(&env, &key); + + + + // Both parties must cryptographically authorize the restructuring. + + job.client.require_auth(); + + job.freelancer.require_auth(); + + + + // Locked once disputed (or otherwise inactive). + + if !(job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress) { + + return Err(EscrowError::InvalidState); + + } + + + + if new_amounts.is_empty() { + + return Err(EscrowError::InvalidInput); + + } + + + + let mut new_sum: i128 = 0; + + for amount in new_amounts.iter() { + + if amount <= 0 { + + return Err(EscrowError::InvalidInput); + + } + + new_sum = new_sum + + .checked_add(amount) + + .ok_or(EscrowError::InvalidInput)?; + + } + + + + let remaining = job + + .total_amount + + .checked_sub(job.released_amount) + + .ok_or(EscrowError::InvalidState)?; + + if new_sum != remaining { + + return Err(EscrowError::AmountMismatch); + + } + + + + // Preserve already-released milestones; replace the pending set. + + let mut rebuilt: Vec = Vec::new(&env); + + for milestone in job.milestones.iter() { + + if milestone.status == MilestoneStatus::Released { + + rebuilt.push_back(milestone); + + } + + } + + for amount in new_amounts.iter() { + + rebuilt.push_back(Milestone { + + amount, + + status: MilestoneStatus::Pending, + + }); + + } + + job.milestones = rebuilt; + + + + env.storage().persistent().set(&key, &job); + + Self::bump_job_ttl(&env, &key); + + + + env.events().publish( + + ("escrow", "MilestonesAmended"), + + MilestonesAmendedEvent { + + job_id, + + milestone_count: new_amounts.len(), + + remaining_amount: remaining, + + amended_at: env.ledger().timestamp(), + + }, + + ); + + + + Ok(()) + + } + + + + +++======= +++ job.released_amount = job +++ .released_amount +++ .checked_add(milestone.amount) +++ .expect("overflow"); +++ job.status = EscrowStatus::WorkInProgress; +++ +++ let token_client = token::Client::new(&env, &job.token); +++ token_client.transfer( +++ &env.current_contract_address(), +++ &job.freelancer, +++ &milestone.amount, +++ ); +++ +++ if job.released_amount == job.total_amount { +++ job.status = EscrowStatus::Completed; +++ } +++ +++ env.storage().persistent().set(&DataKey::Job(job_id), job); +++ } +++>>>>>>> upstream/main + +} + + #[cfg(test)] + mod test { +@@@ -2410,223 -881,32 +1814,139 @@@ + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); + cc.add_milestone(&1u64, &5000i128); +- +- let tc = token::Client::new(&env, &token_addr); +- let client_balance_before = tc.balance(&client); +- +- cc.deposit(&1u64, &5000i128); +- +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Funded); +- assert_eq!(job.total_amount, 5000); +- assert_eq!(tc.balance(&contract_id), 5000); +- assert_eq!(tc.balance(&client), client_balance_before - 5000); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #6)")] +- fn test_deposit_invalid_state_not_setup() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.deposit(&1u64, &6000i128); +- +- // Try to deposit again when job is already Funded +- cc.deposit(&1u64, &6000i128); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #4)")] +- fn test_deposit_negative_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &1000i128); +- +- cc.deposit(&1u64, &-1000i128); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #4)")] +- fn test_deposit_zero_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &1000i128); +- +- cc.deposit(&1u64, &0i128); +- } +- +- #[test] +- fn test_release_milestone_sequential_success() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &2000i128); +- cc.add_milestone(&1u64, &3000i128); + cc.add_milestone(&1u64, &5000i128); +++<<<<<<< HEAD + + cc.deposit(&1u64, &10000i128); + + + + let tc = token::Client::new(&env, &token_addr); + + + + // Release first milestone + + cc.release_milestone(&1u64, &client); + + let job = cc.get_job(&1u64); + + assert_eq!(job.status, EscrowStatus::WorkInProgress); + + assert_eq!(job.released_amount, 2000); + + assert_eq!(tc.balance(&freelancer), 2000); + + + + // Release second milestone + + cc.release_milestone(&1u64, &client); + + let job = cc.get_job(&1u64); + + assert_eq!(job.released_amount, 5000); + + assert_eq!(tc.balance(&freelancer), 5000); + + + + // Release third milestone - should complete the job + + cc.release_milestone(&1u64, &client); + + let job = cc.get_job(&1u64); + + assert_eq!(job.status, EscrowStatus::Completed); + + assert_eq!(job.released_amount, 10000); + + assert_eq!(tc.balance(&freelancer), 10000); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #6)")] + + fn test_release_milestone_no_pending_milestones() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &5000i128); + + cc.deposit(&1u64, &5000i128); + + + + // Release the only milestone + + cc.release_milestone(&1u64, &client); + + + + // Try to release again - should fail + + cc.release_milestone(&1u64, &client); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #3)")] + + fn test_release_milestone_unauthorized_freelancer() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &5000i128); + + cc.deposit(&1u64, &5000i128); + + + + // Freelancer cannot release milestones + + cc.release_milestone(&1u64, &freelancer); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #23)")] + + fn test_refund_reentrant_lock_panics() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &10_000i128); +++======= +++>>>>>>> upstream/main + cc.deposit(&1u64, &10_000i128); + +- lock_job_for_test(&env, &contract_id, 1); +- cc.refund(&1u64, &client); ++ env.as_contract(&contract_id, || { ++ EscrowContract::set_guard(&env, 1u64); ++ assert!(env.storage().instance().has(&DataKey::GuardFlag(1u64))); ++ EscrowContract::clear_guard(&env, 1u64); ++ assert!(!env.storage().instance().has(&DataKey::GuardFlag(1u64))); ++ }); ++ ++ cc.release_milestone(&1u64, &client); ++ env.as_contract(&contract_id, || { ++ assert!(!env.storage().instance().has(&DataKey::GuardFlag(1u64))); ++ }); ++ ++ cc.release_milestone(&1u64, &client); ++ env.as_contract(&contract_id, || { ++ assert!(!env.storage().instance().has(&DataKey::GuardFlag(1u64))); ++ }); ++ ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Completed); + } + + #[test] +++<<<<<<< HEAD + + fn test_release_funds_out_of_order() { +++======= ++ fn test_reentrancy_protection_release_funds_blocked() { +++>>>>>>> upstream/main + let env = Env::default(); + env.mock_all_auths(); + +@@@ -2683,326 -966,25 +2006,276 @@@ + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &2000i128); + cc.add_milestone(&1u64, &3000i128); +- cc.deposit(&1u64, &3000i128); +- +- cc.release_funds(&1u64, &client, &5u32); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #6)")] +- fn test_release_funds_twice_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); + cc.add_milestone(&1u64, &5000i128); +++<<<<<<< HEAD + + cc.deposit(&1u64, &5000i128); + + + + cc.release_funds(&1u64, &client, &0u32); + + cc.release_funds(&1u64, &client, &0u32); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #3)")] + + fn test_unauthorized_release_funds_by_freelancer_panics() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &5000i128); + + cc.deposit(&1u64, &5000i128); + + + + cc.release_funds(&1u64, &freelancer, &0u32); + + } + + + + #[test] + + fn test_deposit_event_emitted() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &8000i128); + + cc.deposit(&1u64, &8000i128); + + + + // Verify deposit was successful + + let job = cc.get_job(&1u64); + + assert_eq!(job.status, EscrowStatus::Funded); + + assert_eq!(job.total_amount, 8000); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #6)")] + + fn test_release_milestone_overflow_panics() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &5000i128); + + cc.deposit(&1u64, &5000i128); + + + + // Release once + + cc.release_milestone(&1u64, &client); + + + + // Try to release again - no pending milestones, will fail with InvalidState + + cc.release_milestone(&1u64, &client); + + } + + + + // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + + // Comprehensive Escrow Dispute & Resolution Tests (>90% coverage) + + // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + + + + #[test] + + fn test_raise_dispute_by_freelancer_locks_funds() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &4000i128); + + cc.add_milestone(&1u64, &6000i128); + + cc.deposit(&1u64, &10000i128); + + + + cc.raise_dispute(&1u64, &freelancer); + + + + let job = cc.get_job(&1u64); + + assert_eq!(job.status, EscrowStatus::Disputed); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #3)")] + + fn test_raise_dispute_by_third_party_panics() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + let rando = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &5000i128); + + cc.deposit(&1u64, &5000i128); + + + + cc.raise_dispute(&1u64, &rando); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #6)")] + + fn test_raise_dispute_on_completed_job_panics() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &10000i128); + + cc.deposit(&1u64, &10000i128); + + cc.release_milestone(&1u64, &client); + + + + // Job is now Completed, cannot dispute + + cc.raise_dispute(&1u64, &client); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #3)")] + + fn test_open_dispute_by_rando_panics() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + let rando = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &5000i128); + + cc.deposit(&1u64, &5000i128); + + + + cc.open_dispute(&1u64, &rando); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #6)")] + + fn test_open_dispute_on_completed_panics() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &5000i128); + + cc.deposit(&1u64, &5000i128); + + cc.release_milestone(&1u64, &client); + + + + cc.open_dispute(&1u64, &client); + + } + + + + #[test] + + #[should_panic(expected = "Error(Contract, #23)")] + + fn test_release_milestone_reentrant_lock_panics() { + + let env = Env::default(); + + env.mock_all_auths(); + + + + let admin = Address::generate(&env); + + let agent_judge = Address::generate(&env); + + let client = Address::generate(&env); + + let freelancer = Address::generate(&env); + + + + let token_addr = setup_token(&env, &admin); + + mint(&env, &token_addr, &client); + + + + let contract_id = env.register_contract(None, EscrowContract); + + let cc = EscrowContractClient::new(&env, &contract_id); + + + + cc.initialize(&admin, &agent_judge); + + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + cc.add_milestone(&1u64, &10_000i128); +++======= +++>>>>>>> upstream/main + cc.deposit(&1u64, &10_000i128); + +- lock_job_for_test(&env, &contract_id, 1); +- cc.release_milestone(&1u64, &client); +- } +- +- #[test] +- fn test_resolve_dispute_success() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &4000i128); +- cc.deposit(&1u64, &10000i128); ++ assert_eq!(cc.get_escrow_balance(&1u64), 10_000); + +- // Release one milestone first + cc.release_milestone(&1u64, &client); +- let tc = token::Client::new(&env, &token_addr); +- assert_eq!(tc.balance(&freelancer), 3000); +- +- // Raise dispute +- cc.raise_dispute(&1u64, &client); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Disputed); ++ assert_eq!(cc.get_escrow_balance(&1u64), 8000); + +- // Resolve with 70/30 split of remaining 7000 +- cc.resolve_dispute(&1u64, &4900i128, &2100i128); ++ cc.release_milestone(&1u64, &client); ++ assert_eq!(cc.get_escrow_balance(&1u64), 5000); + +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Resolved); +- assert_eq!(tc.balance(&freelancer), 7900); // 3000 + 4900 +- assert_eq!(tc.balance(&client), 92100); // 100000 - 10000 + 2100 ++ cc.release_milestone(&1u64, &client); ++ assert_eq!(cc.get_escrow_balance(&1u64), 0); + } + + #[test] +- fn test_resolve_dispute_full_refund_to_client() { +++<<<<<<< HEAD +++ fn test_resolve_dispute_success() { +++======= ++ fn test_multiple_jobs_isolated() { +++>>>>>>> upstream/main + let env = Env::default(); + env.mock_all_auths(); + +@@@ -3018,613 -1003,49 +2294,57 @@@ + let cc = EscrowContractClient::new(&env, &contract_id); + + cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &8000i128); +- cc.deposit(&1u64, &8000i128); +- +- cc.raise_dispute(&1u64, &client); +- +- // Full refund to client +- cc.resolve_dispute(&1u64, &0i128, &8000i128); +- +- let tc = token::Client::new(&env, &token_addr); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Resolved); +- assert_eq!(tc.balance(&client), 100000); // Full refund +- assert_eq!(tc.balance(&freelancer), 0); +- } +- +- #[test] +- fn test_resolve_dispute_full_payout_to_freelancer() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); + +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.create_job(&1u64, &client_one, &freelancer_one, &token_addr); ++ cc.add_milestone(&1u64, &4000i128); + cc.add_milestone(&1u64, &6000i128); +- cc.deposit(&1u64, &6000i128); +- +- cc.raise_dispute(&1u64, &freelancer); +- +- // Full payout to freelancer +- cc.resolve_dispute(&1u64, &6000i128, &0i128); +- +- let tc = token::Client::new(&env, &token_addr); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Resolved); +- assert_eq!(tc.balance(&freelancer), 6000); +- } +- +- #[test] +- #[should_panic] +- fn test_release_funds_reentrant_lock_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &10_000i128); + cc.deposit(&1u64, &10_000i128); + +- lock_job_for_test(&env, &contract_id, 1); +- cc.release_funds(&1u64, &client, &0u32); +- } ++ cc.create_job(&2u64, &client_two, &freelancer_two, &token_addr); ++ cc.add_milestone(&2u64, &1500i128); ++ cc.add_milestone(&2u64, &2500i128); ++ cc.deposit(&2u64, &4000i128); + +++<<<<<<< HEAD + + #[test] + + #[should_panic(expected = "Error(Contract, #6)")] + + fn test_resolve_dispute_invalid_state_panics() { + + let env = Env::default(); + + env.mock_all_auths(); +++======= ++ cc.release_milestone(&1u64, &client_one); +++>>>>>>> upstream/main + +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- // Try to resolve without raising dispute first +- cc.resolve_dispute(&1u64, &2500i128, &2500i128); +- } +- +- #[test] +- fn test_raise_dispute_blocks_release_funds() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); ++ assert_eq!(cc.get_escrow_balance(&1u64), 6000); ++ assert_eq!(cc.get_escrow_balance(&2u64), 4000); ++ assert_eq!( ++ cc.get_milestone(&1u64, &0u32).status, ++ MilestoneStatus::Released ++ ); ++ assert_eq!( ++ cc.get_milestone(&1u64, &1u32).status, ++ MilestoneStatus::Pending ++ ); ++ assert_eq!( ++ cc.get_milestone(&2u64, &0u32).status, ++ MilestoneStatus::Pending ++ ); + +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); ++ cc.release_funds(&2u64, &client_two, &1u32); + +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.deposit(&1u64, &9000i128); ++ assert_eq!(cc.get_escrow_balance(&1u64), 6000); ++ assert_eq!(cc.get_escrow_balance(&2u64), 1500); ++ assert_eq!( ++ cc.get_milestone(&2u64, &0u32).status, ++ MilestoneStatus::Pending ++ ); ++ assert_eq!( ++ cc.get_milestone(&2u64, &1u32).status, ++ MilestoneStatus::Released ++ ); + +- // Release first milestone +- cc.release_milestone(&1u64, &client); + let tc = token::Client::new(&env, &token_addr); +- assert_eq!(tc.balance(&freelancer), 3000); +- +- // Raise dispute +- cc.raise_dispute(&1u64, &freelancer); +- +- // Verify job is in Disputed state +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Disputed); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #3)")] +- fn test_refund_by_non_client_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- // Freelancer cannot refund +- cc.refund(&1u64, &freelancer); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #5)")] +- fn test_get_job_not_found_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.get_job(&999u64); +- } +- +- #[test] +- fn test_cancel_brief_in_setup_marks_refunded_without_transfer() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- let token_addr = setup_token(&env, &admin); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&77u64, &client, &freelancer, &token_addr); +- cc.cancel_brief(&77u64, &client); +- +- let job = cc.get_job(&77u64); +- assert_eq!(job.status, EscrowStatus::Refunded); +- assert_eq!(job.released_amount, 0); +- } +- +- #[test] +- fn test_dispute_event_emission() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- // Raise dispute and verify state +- cc.raise_dispute(&1u64, &client); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Disputed); +- assert_eq!(job.total_amount, 5000); +- assert_eq!(job.released_amount, 0); +- } +- +- // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +- // SC-ESC-005: Token Decimals Compatibility +- // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +- +- #[test] +- fn test_token_decimals_stored_on_deposit() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- // Stellar asset contract has 7 decimals; verify captured during deposit +- assert_eq!(cc.get_token_decimals(&1u64), 7); +- } +- +- // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +- // SC-ESC-007: Instance Storage Optimisation +- // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +- +- #[test] +- fn test_instance_config_getters() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- assert_eq!(cc.get_admin(), admin); +- assert_eq!(cc.get_agent_judge(), agent_judge); +- } +- +- #[test] +- fn test_set_agent_judge_updates_packed_config() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let new_judge = Address::generate(&env); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.set_agent_judge(&new_judge); +- +- assert_eq!(cc.get_agent_judge(), new_judge); +- assert_eq!(cc.get_admin(), admin); +- } +- +- // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +- // SC-ESC-008: Double-Spending Prevention +- // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +- +- #[test] +- #[should_panic(expected = "Error(Contract, #6)")] +- fn test_double_release_milestone_is_blocked() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- cc.release_milestone(&1u64, &client); +- // Job is now Completed; status guard fires first -> InvalidState (#6) +- cc.release_milestone(&1u64, &client); +- } +- +- #[test] +- fn test_released_amount_matches_transferred_on_sequential_release() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &4000i128); +- cc.deposit(&1u64, &10000i128); +- +- let tc = token::Client::new(&env, &token_addr); +- +- cc.release_milestone(&1u64, &client); +- assert_eq!(cc.get_job(&1u64).released_amount, tc.balance(&freelancer)); +- +- cc.release_milestone(&1u64, &client); +- assert_eq!(cc.get_job(&1u64).released_amount, tc.balance(&freelancer)); +- +- cc.release_milestone(&1u64, &client); +- let job = cc.get_job(&1u64); +- assert_eq!(job.released_amount, job.total_amount); +- assert_eq!(job.released_amount, tc.balance(&freelancer)); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #12)")] +- fn test_reentrant_release_milestone_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- env.as_contract(&contract_id, || { +- env.storage().instance().set(&DataKey::Locked, &()); +- }); +- cc.release_milestone(&1u64, &client); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #12)")] +- fn test_reentrant_release_funds_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- env.as_contract(&contract_id, || { +- env.storage().instance().set(&DataKey::Locked, &()); +- }); +- cc.release_funds(&1u64, &client, &0u32); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #12)")] +- fn test_reentrant_refund_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- env.as_contract(&contract_id, || { +- env.storage().instance().set(&DataKey::Locked, &()); +- }); +- cc.refund(&1u64, &client); +- } +- +- // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +- // SC-ESC-009: Dispute Timeout Enforcement +- // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ +- +- #[test] +- fn test_dispute_deadline_set_on_raise() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- let ts_before = env.ledger().timestamp(); +- cc.raise_dispute(&1u64, &client); +- +- assert_eq!(cc.get_dispute_deadline(&1u64), ts_before + 7 * 24 * 60 * 60); +- } +- +- #[test] +- fn test_resolve_before_deadline_succeeds() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &6000i128); +- cc.deposit(&1u64, &6000i128); +- +- cc.raise_dispute(&1u64, &client); +- +- env.ledger() +- .set_timestamp(env.ledger().timestamp() + 3 * 24 * 60 * 60); +- +- cc.resolve_dispute(&1u64, &6000i128, &0i128); +- assert_eq!(cc.get_job(&1u64).status, EscrowStatus::Resolved); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #20)")] +- fn test_resolve_after_deadline_fails() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- cc.raise_dispute(&1u64, &client); +- env.ledger() +- .set_timestamp(env.ledger().timestamp() + 8 * 24 * 60 * 60); +- +- cc.resolve_dispute(&1u64, &5000i128, &0i128); // DisputeResolutionExpired (#18) +- } +- +- #[test] +- fn test_expire_dispute_refunds_client_after_deadline() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &8000i128); +- cc.deposit(&1u64, &8000i128); +- +- let tc = token::Client::new(&env, &token_addr); +- assert_eq!(tc.balance(&client), 92000); +- +- cc.raise_dispute(&1u64, &client); +- env.ledger() +- .set_timestamp(env.ledger().timestamp() + 8 * 24 * 60 * 60); +- +- cc.expire_dispute(&1u64); +- assert_eq!(cc.get_job(&1u64).status, EscrowStatus::Refunded); +- assert_eq!(tc.balance(&client), 100000); +- } +- +- #[test] +- fn test_version() { +- let env = Env::default(); +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- assert_eq!(cc.version(), 1); +- } +- +- #[test] +- fn test_get_multisig_config() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- let signer1 = Address::generate(&env); +- let signer2 = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- +- let signers = soroban_sdk::vec![&env, signer1.clone(), signer2.clone()]; +- cc.configure_multisig(&1u64, &signers, &2u32); +- +- let config = cc.get_multisig_config(&1u64); +- assert_eq!(config.required_signatures, 2); +- assert_eq!(config.signers.len(), 2); ++ assert_eq!(tc.balance(&freelancer_one), 4000); ++ assert_eq!(tc.balance(&freelancer_two), 2500); + } + } diff --git a/contracts/escrow/my_changes.patch b/contracts/escrow/my_changes.patch new file mode 100644 index 00000000..247686fb --- /dev/null +++ b/contracts/escrow/my_changes.patch @@ -0,0 +1,145737 @@ +diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml +index 182d0d9..c3773a8 100644 +--- a/.github/workflows/CI.yml ++++ b/.github/workflows/CI.yml +@@ -9,12 +9,12 @@ on: + env: + # Real Cloud Run Backend URL for the Frontend + NEXT_PUBLIC_API_URL: https://lance-api-641037923100.us-central1.run.app +- ++ + # Securely injected via GitHub Actions Secrets + DATABASE_URL: ${{ secrets.DATABASE_URL }} + JUDGE_AUTHORITY_SECRET: ${{ secrets.JUDGE_AUTHORITY_SECRET }} + OPENCLAW_API_KEY: ${{ secrets.OPENCLAW_API_KEY }} +- ++ + # Contract IDs (Public information, safe to commit) + ESCROW_CONTRACT_ID: CD5E6AXK2J5C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6 + REPUTATION_CONTRACT_ID: CD5E6AXK2J5C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6C6A6 +@@ -40,6 +40,33 @@ jobs: + - name: Build + run: npm run build --prefix backend + ++ contracts: ++ name: Smart Contracts ++ runs-on: ubuntu-latest ++ steps: ++ - uses: actions/checkout@v4 ++ - name: Install Rust toolchain ++ uses: dtolnay/rust-toolchain@v1 ++ with: ++ toolchain: 1.88.0 ++ targets: wasm32-unknown-unknown ++ - name: Rust Cache ++ uses: Swatinem/rust-cache@v2 ++ - name: Test Escrow ++ run: cargo test -p escrow ++ - name: Build Contracts ++ run: cargo build --target wasm32-unknown-unknown --release -p escrow -p reputation -p job_registry ++ - name: Verify Escrow WASM Size ++ run: | ++ wasm="target/wasm32-unknown-unknown/release/escrow.wasm" ++ size=$(stat -c%s "$wasm") ++ limit=$((80 * 1024)) ++ echo "Escrow WASM size: ${size} bytes" ++ if [ "$size" -gt "$limit" ]; then ++ echo "Escrow WASM exceeds ${limit} bytes" ++ exit 1 ++ fi ++ + web-build: + name: Web Frontend + runs-on: ubuntu-latest +diff --git a/Cargo.toml b/Cargo.toml +index 23f1f77..8d87746 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -28,11 +28,24 @@ tower-http = { version = "0.5", features = ["cors", "trace"] } + futures = "0.3" + + [profile.release] +-opt-level = "z" +-overflow-checks = true +-debug = 0 +-strip = "symbols" +-debug-assertions = false +-panic = "abort" +-codegen-units = 1 +-lto = true ++opt-level = "z" ++overflow-checks = true ++debug = 0 ++strip = "symbols" ++debug-assertions = false ++panic = "abort" ++codegen-units = 1 ++lto = true ++ ++[profile.contract-release] ++inherits = "release" ++# Soroban deployment artifacts should prioritize small WASM output and deterministic ++# checked arithmetic over host-side debug metadata. ++opt-level = "z" ++overflow-checks = true ++debug = 0 ++strip = "symbols" ++debug-assertions = false ++panic = "abort" ++codegen-units = 1 ++lto = true +diff --git a/apps/web/components/__tests__/activity-log.test.tsx b/apps/web/components/__tests__/activity-log.test.tsx +index 36e05ab..eb76180 100644 +--- a/apps/web/components/__tests__/activity-log.test.tsx ++++ b/apps/web/components/__tests__/activity-log.test.tsx +@@ -1,6 +1,6 @@ + import React from "react"; + import { render, screen } from "@testing-library/react"; +-import { vi } from "vitest"; ++import { describe, it, expect, vi } from "vitest"; + import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + + const logs = [ +diff --git a/apps/web/components/jobs/bid-status-badge.test.tsx b/apps/web/components/jobs/bid-status-badge.test.tsx +index 4703c59..94803eb 100644 +--- a/apps/web/components/jobs/bid-status-badge.test.tsx ++++ b/apps/web/components/jobs/bid-status-badge.test.tsx +@@ -1,6 +1,6 @@ + import { describe, it, expect } from "vitest"; + import { render, screen } from "@testing-library/react"; +-import { BidStatusBadge, BidStatusIndicator } from "../bid-status-badge"; ++import { BidStatusBadge, BidStatusIndicator } from "./bid-status-badge"; + + describe("BidStatusBadge Component", () => { + describe("Rendering", () => { +diff --git a/apps/web/lib/api.ts b/apps/web/lib/api.ts +index 68cfbc1..bf4443f 100644 +--- a/apps/web/lib/api.ts ++++ b/apps/web/lib/api.ts +@@ -46,14 +46,15 @@ export const api = { + }), + }, + jobs: { +- list: (params?: { query?: string; tag?: string; sort?: string; status?: string }) => { ++ list: async (params?: { query?: string; tag?: string; sort?: string; status?: string }) => { + const qs = new URLSearchParams(); + if (params?.query) qs.set("query", params.query); + if (params?.tag) qs.set("tag", params.tag); + if (params?.sort) qs.set("sort", params.sort); + if (params?.status) qs.set("status", params.status); + const path = `/v1/jobs${qs.toString() ? `?${qs.toString()}` : ""}`; +- return request(path); ++ const response = await request(path); ++ return Array.isArray(response) ? response : response.items; + }, + get: (id: string) => request(`/v1/jobs/${id}`), + create: (body: CreateJobBody) => +@@ -210,6 +211,15 @@ export interface Job { + updated_at: string; + } + ++export interface JobsListResponse { ++ items: Job[]; ++ next_cursor: { ++ created_at: string; ++ id: string; ++ } | null; ++ limit: number; ++} ++ + export interface CreateJobBody { + title: string; + description: string; +diff --git a/apps/web/lib/reputation.ts b/apps/web/lib/reputation.ts +index 9f2e63a..5a348ae 100644 +--- a/apps/web/lib/reputation.ts ++++ b/apps/web/lib/reputation.ts +@@ -28,6 +28,7 @@ export interface ReputationMetrics { + reviews: number; + starRating: number; + averageStars: number; ++ badgeLevel?: number; + } + + export interface ReputationViewMetrics { +@@ -42,6 +43,7 @@ interface ContractReputationScore { + total_jobs: number | string | bigint; + total_points: number | string | bigint; + reviews: number | string | bigint; ++ badge_level?: number | string | bigint; + } + + interface ContractReputationView { +@@ -66,6 +68,7 @@ function fallbackMetrics(): ReputationMetrics { + reviews: 0, + starRating: toStarRating(scoreBps), + averageStars: 2.5, ++ badgeLevel: 0, + }; + } + +@@ -82,6 +85,7 @@ function metricsFromScore(score: ContractReputationScore): ReputationMetrics { + const totalPoints = normalizeNumber(score.total_points); + const reviews = normalizeNumber(score.reviews); + const averageStars = reviews > 0 ? totalPoints / reviews : toStarRating(scoreBps); ++ const badgeLevel = normalizeNumber(score.badge_level); + + return { + scoreBps, +@@ -90,6 +94,7 @@ function metricsFromScore(score: ContractReputationScore): ReputationMetrics { + reviews, + starRating: toStarRating(scoreBps), + averageStars, ++ badgeLevel, + }; + } + +diff --git a/apps/web/package.json b/apps/web/package.json +index 76307f4..d0fdf1b 100644 +--- a/apps/web/package.json ++++ b/apps/web/package.json +@@ -36,21 +36,23 @@ + "zod": "4.3.6", + "zustand": "^5.0.3" + }, +- "devDependencies": { +- "@tailwindcss/postcss": "^4", +- "@testing-library/jest-dom": "^6.6.3", +- "@testing-library/react": "^16.3.0", +- "@types/node": "^20.19.39", +- "@types/react": "^19", +- "@types/react-dom": "^19", +- "@vitest/coverage-v8": "^4.1.5", +- "eslint": "^9", +- "eslint-config-next": "16.1.6", +- "jsdom": "^26.1.0", +- "tailwindcss": "^4.2.2", +- "typescript": "^5", +- "vitest": "^4.1.5" +-}, ++ "devDependencies": { ++ "@tailwindcss/postcss": "^4", ++ "@testing-library/dom": "^10.4.1", ++ "@testing-library/jest-dom": "^6.6.3", ++ "@testing-library/react": "^16.3.0", ++ "@testing-library/user-event": "^14.6.1", ++ "@types/node": "^20.19.39", ++ "@types/react": "^19", ++ "@types/react-dom": "^19", ++ "@vitest/coverage-v8": "^4.1.5", ++ "eslint": "^9", ++ "eslint-config-next": "16.1.6", ++ "jsdom": "^26.1.0", ++ "tailwindcss": "^4.2.2", ++ "typescript": "^5", ++ "vitest": "^4.1.5" ++ }, + "optionalDependencies": { + "@next/swc-linux-x64-gnu": "16.1.6", + "@next/swc-linux-x64-musl": "16.1.6", +diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json +index 14cbb17..91095f3 100644 +--- a/apps/web/tsconfig.json ++++ b/apps/web/tsconfig.json +@@ -21,7 +21,7 @@ + "paths": { + "@/*": ["./*"] + }, +- "types": ["node", "react", "react-dom"] ++ "types": ["node", "react", "react-dom", "@testing-library/jest-dom"] + }, + "include": [ + "next-env.d.ts", +diff --git a/backend/.env.example b/backend/.env.example +index de84410..cd16209 100644 +--- a/backend/.env.example ++++ b/backend/.env.example +@@ -10,6 +10,26 @@ ESCROW_CONTRACT_ID=TODO_after_deploy + REPUTATION_CONTRACT_ID=TODO_after_deploy + JOB_REGISTRY_CONTRACT_ID=TODO_after_deploy + PORT=3001 ++ ++# --- Connection Pool Configuration --- ++POOL_MAX_CONNECTIONS=20 ++POOL_MIN_CONNECTIONS=2 ++POOL_IDLE_TIMEOUT_MS=30000 ++POOL_CONNECTION_TIMEOUT_MS=5000 ++POOL_HEALTH_CHECK_INTERVAL_MS=30000 ++POOL_CONNECT_RETRY_LIMIT=3 ++POOL_CONNECT_RETRY_BASE_DELAY_MS=500 ++ ++# Per-IP token bucket on public intake POST routes (auth, job create, bids, uploads, bulk). ++# Effective RPM scales down automatically when the connection pool is busy. ++RATE_LIMIT_RPM=60 ++RATE_LIMIT_BURST=10 ++RATE_LIMIT_MIN_RPM=15 ++ + RUST_LOG=backend=debug,tower_http=debug + # Set to "json" for structured JSON log output (e.g. in production) + LOG_FORMAT=pretty ++# Comma-separated list of additional header names to redact from logs (case-insensitive). ++# Defaults already include: authorization, cookie, set-cookie, x-api-key, x-auth-token, x-secret, etc. ++SENSITIVE_HEADERS= ++ +diff --git a/backend/dist/config/db.js b/backend/dist/config/db.js +index eff48ba..acd5e74 100644 +--- a/backend/dist/config/db.js ++++ b/backend/dist/config/db.js +@@ -3,20 +3,217 @@ var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); +-exports.prisma = void 0; ++exports.prisma = exports.pool = void 0; ++exports.getPoolHealthStats = getPoolHealthStats; ++exports.startPoolHealthCheck = startPoolHealthCheck; ++exports.stopPoolHealthCheck = stopPoolHealthCheck; ++exports.connectWithRetry = connectWithRetry; + const client_1 = require("@prisma/client"); + const pg_1 = require("pg"); + const adapter_pg_1 = require("@prisma/adapter-pg"); + const dotenv_1 = __importDefault(require("dotenv")); ++const tracing_1 = require("./tracing"); + dotenv_1.default.config(); + const connectionString = process.env.DATABASE_URL; +-const pool = new pg_1.Pool({ connectionString }); +-const adapter = new adapter_pg_1.PrismaPg(pool); ++// --------------------------------------------------------------------------- ++// Pool configuration — tuneable via environment variables ++// --------------------------------------------------------------------------- ++const POOL_MAX = parseInt(process.env.POOL_MAX_CONNECTIONS || "20", 10); ++const POOL_MIN = parseInt(process.env.POOL_MIN_CONNECTIONS || "2", 10); ++const POOL_IDLE_TIMEOUT_MS = parseInt(process.env.POOL_IDLE_TIMEOUT_MS || "30000", 10); ++const POOL_CONNECTION_TIMEOUT_MS = parseInt(process.env.POOL_CONNECTION_TIMEOUT_MS || "5000", 10); ++const POOL_HEALTH_CHECK_INTERVAL_MS = parseInt(process.env.POOL_HEALTH_CHECK_INTERVAL_MS || "30000", 10); ++const POOL_CONNECT_RETRY_LIMIT = parseInt(process.env.POOL_CONNECT_RETRY_LIMIT || "3", 10); ++const POOL_CONNECT_RETRY_BASE_DELAY_MS = parseInt(process.env.POOL_CONNECT_RETRY_BASE_DELAY_MS || "500", 10); ++// --------------------------------------------------------------------------- ++// Build the pool with resilient options ++// --------------------------------------------------------------------------- ++exports.pool = new pg_1.Pool({ ++ connectionString, ++ max: POOL_MAX, ++ min: POOL_MIN, ++ idleTimeoutMillis: POOL_IDLE_TIMEOUT_MS, ++ connectionTimeoutMillis: POOL_CONNECTION_TIMEOUT_MS, ++ allowExitOnIdle: false, // Keep the pool alive even when the event loop has no other work ++}); ++// --------------------------------------------------------------------------- ++// Pool event listeners — structured logging for diagnostics ++// --------------------------------------------------------------------------- ++exports.pool.on("connect", (client) => { ++ client ++ .query("SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED") ++ .catch((err) => { ++ console.error("[POOL] Failed to configure transaction isolation:", err.message); ++ }); ++ if (process.env.NODE_ENV !== "production") { ++ console.log(`[POOL] New client connected | total=${exports.pool.totalCount} idle=${exports.pool.idleCount} waiting=${exports.pool.waitingCount}`); ++ } ++}); ++exports.pool.on("acquire", () => { ++ if (process.env.NODE_ENV !== "production") { ++ console.log(`[POOL] Client acquired | total=${exports.pool.totalCount} idle=${exports.pool.idleCount} waiting=${exports.pool.waitingCount}`); ++ } ++}); ++exports.pool.on("remove", () => { ++ if (process.env.NODE_ENV !== "production") { ++ console.log(`[POOL] Client removed | total=${exports.pool.totalCount} idle=${exports.pool.idleCount} waiting=${exports.pool.waitingCount}`); ++ } ++}); ++exports.pool.on("error", (err) => { ++ console.error("[POOL] Unexpected pool error:", err.message); ++}); ++let lastHealthCheckAt = null; ++let lastHealthCheckOk = true; ++let healthChecksPassed = 0; ++let healthChecksFailed = 0; ++const poolStartedAt = Date.now(); ++function getPoolHealthStats() { ++ return { ++ totalConnections: exports.pool.totalCount, ++ idleConnections: exports.pool.idleCount, ++ activeConnections: exports.pool.totalCount - exports.pool.idleCount, ++ waitingRequests: exports.pool.waitingCount, ++ maxConnections: POOL_MAX, ++ minConnections: POOL_MIN, ++ idleTimeoutMs: POOL_IDLE_TIMEOUT_MS, ++ connectionTimeoutMs: POOL_CONNECTION_TIMEOUT_MS, ++ healthCheckIntervalMs: POOL_HEALTH_CHECK_INTERVAL_MS, ++ lastHealthCheckAt: lastHealthCheckAt ? lastHealthCheckAt.toISOString() : null, ++ lastHealthCheckOk, ++ uptimeSeconds: Math.floor((Date.now() - poolStartedAt) / 1000), ++ healthChecksPassed, ++ healthChecksFailed, ++ }; ++} ++// --------------------------------------------------------------------------- ++// Background health-check — validates an idle connection periodically ++// --------------------------------------------------------------------------- ++let healthCheckTimer = null; ++async function runPoolHealthCheck() { ++ let client; ++ try { ++ client = await exports.pool.connect(); ++ await client.query("SELECT 1"); ++ lastHealthCheckOk = true; ++ healthChecksPassed++; ++ } ++ catch (err) { ++ lastHealthCheckOk = false; ++ healthChecksFailed++; ++ console.error("[POOL HEALTH] Background health-check failed:", err.message); ++ } ++ finally { ++ lastHealthCheckAt = new Date(); ++ if (client) { ++ client.release(); ++ } ++ } ++} ++function startPoolHealthCheck() { ++ if (healthCheckTimer) ++ return; // already running ++ // Run once immediately then on an interval ++ runPoolHealthCheck(); ++ healthCheckTimer = setInterval(runPoolHealthCheck, POOL_HEALTH_CHECK_INTERVAL_MS); ++ // Allow the process to exit even if the timer is still active ++ if (healthCheckTimer && typeof healthCheckTimer === "object" && "unref" in healthCheckTimer) { ++ healthCheckTimer.unref(); ++ } ++ console.log(`[POOL HEALTH] Background health-check started (interval: ${POOL_HEALTH_CHECK_INTERVAL_MS}ms)`); ++} ++function stopPoolHealthCheck() { ++ if (healthCheckTimer) { ++ clearInterval(healthCheckTimer); ++ healthCheckTimer = null; ++ } ++} ++// --------------------------------------------------------------------------- ++// connectWithRetry — Wraps initial connection with exponential backoff so the ++// API doesn't crash on cold-start if the database is momentarily unavailable. ++// --------------------------------------------------------------------------- ++async function connectWithRetry() { ++ for (let attempt = 1; attempt <= POOL_CONNECT_RETRY_LIMIT; attempt++) { ++ try { ++ const client = await exports.pool.connect(); ++ await client.query("SELECT 1"); ++ client.release(); ++ console.log(`[POOL] Database connected successfully on attempt ${attempt}`); ++ return; ++ } ++ catch (err) { ++ const delay = Math.min(POOL_CONNECT_RETRY_BASE_DELAY_MS * Math.pow(2, attempt - 1) + Math.random() * 100, 5000); ++ console.error(`[POOL] Connection attempt ${attempt}/${POOL_CONNECT_RETRY_LIMIT} failed: ${err.message}. ` + ++ `Retrying in ${delay.toFixed(0)}ms...`); ++ if (attempt === POOL_CONNECT_RETRY_LIMIT) { ++ throw new Error(`Failed to connect to the database after ${POOL_CONNECT_RETRY_LIMIT} attempts: ${err.message}`); ++ } ++ await new Promise((resolve) => setTimeout(resolve, delay)); ++ } ++ } ++} ++// --------------------------------------------------------------------------- ++// Prisma Client with the pg pool adapter ++// --------------------------------------------------------------------------- ++const adapter = new adapter_pg_1.PrismaPg(exports.pool); + const globalForPrisma = global; ++// Initialize Prisma with optimized middleware for tracing and performance monitoring + exports.prisma = globalForPrisma.prisma || + new client_1.PrismaClient({ + adapter, + log: process.env.NODE_ENV === "development" ? ["query", "error", "warn"] : ["error"], + }); ++// Add query middleware for tracing and performance monitoring ++exports.prisma.$use(async (params, next) => { ++ const spanContext = tracing_1.context.active(); ++ const startTime = Date.now(); ++ const logger = tracing_1.trace.getLogger("db-query"); ++ try { ++ const result = await next(params); ++ const duration = Date.now() - startTime; ++ // Log slow queries (> 1000ms) ++ if (duration > 1000) { ++ logger.warn(`Slow query detected: ${params.model}.${params.action}`, { ++ duration, ++ model: params.model, ++ action: params.action, ++ args: JSON.stringify(params.args).substring(0, 200), ++ }); ++ } ++ logger.debug(`Query completed: ${params.model}.${params.action}`, { ++ duration, ++ model: params.model, ++ action: params.action, ++ }); ++ return result; ++ } ++ catch (error) { ++ const duration = Date.now() - startTime; ++ logger.error(`Query failed: ${params.model}.${params.action}`, { ++ duration, ++ model: params.model, ++ action: params.action, ++ error: error instanceof Error ? error.message : String(error), ++ }); ++ throw error; ++ } ++}); + if (process.env.NODE_ENV !== "production") + globalForPrisma.prisma = exports.prisma; ++// --------------------------------------------------------------------------- ++// Graceful shutdown — release pool connections on process exit signals ++// --------------------------------------------------------------------------- ++async function gracefulShutdown(signal) { ++ console.log(`[POOL] Received ${signal}. Draining connection pool...`); ++ stopPoolHealthCheck(); ++ try { ++ await exports.prisma.$disconnect(); ++ await exports.pool.end(); ++ console.log("[POOL] Connection pool drained successfully."); ++ } ++ catch (err) { ++ console.error("[POOL] Error during pool shutdown:", err.message); ++ } ++ process.exit(0); ++} ++process.on("SIGTERM", () => gracefulShutdown("SIGTERM")); ++process.on("SIGINT", () => gracefulShutdown("SIGINT")); +diff --git a/backend/dist/config/tracing.js b/backend/dist/config/tracing.js +new file mode 100644 +index 0000000..c3439d0 +--- /dev/null ++++ b/backend/dist/config/tracing.js +@@ -0,0 +1,71 @@ ++"use strict"; ++// Tracing and logging instrumentation for diagnostic visibility ++// Provides structured logging context for all backend operations ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.context = exports.trace = void 0; ++class TraceLogger { ++ name; ++ constructor(name) { ++ this.name = name; ++ } ++ log(level, message, context) { ++ const entry = { ++ timestamp: new Date().toISOString(), ++ level, ++ message, ++ logger: this.name, ++ ...context, ++ }; ++ if (process.env.LOG_FORMAT === "json") { ++ console.log(JSON.stringify(entry)); ++ } ++ else { ++ const contextStr = context ? ` ${JSON.stringify(context)}` : ""; ++ console.log(`[${entry.timestamp}] [${level}] [${this.name}] ${message}${contextStr}`); ++ } ++ } ++ debug(message, context) { ++ if (process.env.LOG_LEVEL === "debug" || process.env.NODE_ENV === "development") { ++ this.log("DEBUG", message, context); ++ } ++ } ++ info(message, context) { ++ this.log("INFO", message, context); ++ } ++ warn(message, context) { ++ this.log("WARN", message, context); ++ } ++ error(message, context) { ++ this.log("ERROR", message, context); ++ } ++} ++class TraceContext { ++ contextMap = new Map(); ++ active() { ++ return Object.fromEntries(this.contextMap); ++ } ++ set(key, value) { ++ this.contextMap.set(key, value); ++ } ++ get(key) { ++ return this.contextMap.get(key); ++ } ++ clear() { ++ this.contextMap.clear(); ++ } ++} ++class Trace { ++ loggers = new Map(); ++ context = new TraceContext(); ++ getLogger(name) { ++ if (!this.loggers.has(name)) { ++ this.loggers.set(name, new TraceLogger(name)); ++ } ++ return this.loggers.get(name); ++ } ++ getContext() { ++ return this.context; ++ } ++} ++exports.trace = new Trace(); ++exports.context = exports.trace.getContext(); +diff --git a/backend/dist/index.js b/backend/dist/index.js +index 3356cb2..0de864e 100644 +--- a/backend/dist/index.js ++++ b/backend/dist/index.js +@@ -7,6 +7,7 @@ const express_1 = __importDefault(require("express")); + const cors_1 = __importDefault(require("cors")); + const dotenv_1 = __importDefault(require("dotenv")); + const db_1 = require("./config/db"); ++const tracing_1 = require("./utils/tracing"); + const auth_1 = __importDefault(require("./routes/auth")); + const jobs_1 = __importDefault(require("./routes/jobs")); + const disputes_1 = __importDefault(require("./routes/disputes")); +@@ -14,12 +15,17 @@ const appeals_1 = __importDefault(require("./routes/appeals")); + const users_1 = __importDefault(require("./routes/users")); + const activity_1 = __importDefault(require("./routes/activity")); + const uploads_1 = __importDefault(require("./routes/uploads")); ++const bulk_1 = __importDefault(require("./routes/bulk")); ++const pool_1 = __importDefault(require("./routes/pool")); ++const state_1 = __importDefault(require("./routes/state")); + dotenv_1.default.config(); + const app = (0, express_1.default)(); + const port = process.env.PORT || 3001; ++const logger = tracing_1.trace.getLogger("server"); + // Enable CORS for frontend requests + app.use((0, cors_1.default)({ origin: "*" })); + app.use(express_1.default.json()); ++app.use(tracing_1.tracingMiddleware); // Global request tracing and diagnostics + // Mount API routes + app.use("/api/v1/auth", auth_1.default); + app.use("/api/v1/jobs", jobs_1.default); +@@ -28,17 +34,73 @@ app.use("/api/v1/appeals", appeals_1.default); + app.use("/api/v1/users", users_1.default); + app.use("/api/v1/activity", activity_1.default); + app.use("/api/v1/uploads", uploads_1.default); ++app.use("/api/v1/bulk", bulk_1.default); ++app.use("/api/v1/pool", pool_1.default); ++app.use("/api/v1/state", state_1.default); + // Basic healthcheck route + app.get("/health", async (req, res) => { ++ const startTime = Date.now(); ++ logger.debug("Health check requested"); + try { + // Ping DB to ensure it's alive + await db_1.prisma.$queryRaw `SELECT 1`; +- res.status(200).json({ status: "ok", db: "connected" }); ++ const duration = Date.now() - startTime; ++ logger.info("Health check passed", { ++ status: "ok", ++ db: "connected", ++ duration, ++ }); ++ res.status(200).json({ ++ status: "ok", ++ db: "connected", ++ timestamp: new Date().toISOString(), ++ uptime: process.uptime(), ++ }); + } + catch (error) { +- res.status(503).json({ status: "error", db: "disconnected" }); ++ const duration = Date.now() - startTime; ++ logger.error("Health check failed", { ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); ++ res.status(503).json({ ++ status: "error", ++ db: "disconnected", ++ error: error instanceof Error ? error.message : "Unknown error", ++ timestamp: new Date().toISOString(), ++ }); + } + }); +-app.listen(port, () => { +- console.log(`⚡️[server]: Server is running at http://localhost:${port}`); ++// Graceful shutdown handler ++process.on("SIGTERM", async () => { ++ logger.info("SIGTERM received, shutting down gracefully"); ++ try { ++ await db_1.prisma.$disconnect(); ++ logger.info("Database connection closed"); ++ process.exit(0); ++ } ++ catch (error) { ++ logger.error("Error during shutdown", { ++ error: error instanceof Error ? error.message : String(error), ++ }); ++ process.exit(1); ++ } + }); ++// --------------------------------------------------------------------------- ++// Start the server — validate the DB connection with retry backoff first, ++// then kick off background pool health-checking. ++// --------------------------------------------------------------------------- ++async function bootstrap() { ++ try { ++ await (0, db_1.connectWithRetry)(); ++ (0, db_1.startPoolHealthCheck)(); ++ app.listen(port, () => { ++ console.log(`⚡️[server]: Server is running at http://localhost:${port}`); ++ }); ++ } ++ catch (err) { ++ console.error(`❌ Failed to start server: ${err.message}`); ++ process.exit(1); ++ } ++} ++bootstrap(); +diff --git a/backend/dist/routes/bulk.js b/backend/dist/routes/bulk.js +new file mode 100644 +index 0000000..0eda417 +--- /dev/null ++++ b/backend/dist/routes/bulk.js +@@ -0,0 +1,204 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++const express_1 = require("express"); ++const zod_1 = require("zod"); ++const transaction_1 = require("../utils/transaction"); ++const tracing_1 = require("../utils/tracing"); ++const router = (0, express_1.Router)(); ++// Validation Schemas ++const singleJobSchema = zod_1.z.object({ ++ title: zod_1.z.string().min(1, "Title is required"), ++ description: zod_1.z.string().optional().default(""), ++ budget_usdc: zod_1.z.number().int().positive("Budget must be greater than zero"), ++ milestones: zod_1.z.number().int().min(1, "Milestones count must be at least 1"), ++ client_address: zod_1.z.string().min(1, "Client address is required"), ++}); ++const bulkJobsSchema = zod_1.z.object({ ++ jobs: zod_1.z.array(singleJobSchema).min(1, "At least one job is required for bulk creation"), ++}); ++const singleReleaseSchema = zod_1.z.object({ ++ jobId: zod_1.z.string().uuid("Invalid jobId UUID format"), ++ milestoneId: zod_1.z.string().uuid("Invalid milestoneId UUID format"), ++}); ++const bulkReleaseSchema = zod_1.z.object({ ++ releases: zod_1.z.array(singleReleaseSchema).min(1, "At least one milestone release request is required"), ++}); ++/** ++ * POST /api/v1/bulk/jobs ++ * Atomically creates multiple jobs, each with its respective milestones. ++ * If any validation or creation step fails, the ENTIRE batch is rolled back. ++ */ ++router.post("/jobs", async (req, res) => { ++ try { ++ // 1. Validate bulk request format ++ const parsed = bulkJobsSchema.parse(req.body); ++ tracing_1.logger.info(`Starting bulk job creation for ${parsed.jobs.length} jobs`); ++ // 2. Execute within an atomic repeatable read transaction to guarantee lock isolation ++ const createdJobs = await (0, transaction_1.runInTransaction)(async (tx) => { ++ const results = []; ++ for (let i = 0; i < parsed.jobs.length; i++) { ++ const data = parsed.jobs[i]; ++ tracing_1.logger.debug(`Processing bulk creation for job index ${i}: "${data.title}"`); ++ // Create parent Job record ++ const job = await tx.jobs.create({ ++ data: { ++ title: data.title, ++ description: data.description, ++ budget_usdc: BigInt(data.budget_usdc), ++ milestones: data.milestones, ++ client_address: data.client_address, ++ status: "open", ++ }, ++ }); ++ // Compute milestone allocations ++ const perMilestone = Math.floor(data.budget_usdc / data.milestones); ++ const remainder = data.budget_usdc % data.milestones; ++ const milestoneRecords = Array.from({ length: data.milestones }).map((_, index) => { ++ const amount_usdc = index === data.milestones - 1 ? perMilestone + remainder : perMilestone; ++ return { ++ job_id: job.id, ++ index: index + 1, ++ title: `Milestone ${index + 1} of ${data.milestones}`, ++ amount_usdc: BigInt(amount_usdc), ++ status: "pending", ++ }; ++ }); ++ // Create child Milestone records ++ await tx.milestones.createMany({ ++ data: milestoneRecords, ++ }); ++ // Fetch back milestones for serializable return ++ const dbMilestones = await tx.milestones.findMany({ ++ where: { job_id: job.id }, ++ orderBy: { index: "asc" }, ++ }); ++ results.push({ ++ ...job, ++ budget_usdc: Number(job.budget_usdc), ++ on_chain_job_id: job.on_chain_job_id ? Number(job.on_chain_job_id) : null, ++ milestones: dbMilestones.map((m) => ({ ++ ...m, ++ amount_usdc: Number(m.amount_usdc), ++ })), ++ }); ++ } ++ return results; ++ }, { isolationLevel: "REPEATABLE READ" }); ++ res.status(201).json({ ++ success: true, ++ message: `Successfully created ${createdJobs.length} jobs atomically`, ++ jobs: createdJobs, ++ }); ++ } ++ catch (error) { ++ if (error instanceof zod_1.z.ZodError) { ++ return res.status(400).json({ ++ success: false, ++ error: "Validation failed", ++ issues: error.issues, ++ }); ++ } ++ tracing_1.logger.error(`Bulk job creation aborted and rolled back. Error: ${error.message || error}`); ++ res.status(500).json({ ++ success: false, ++ error: "Transaction rolled back due to error", ++ details: error.message || error, ++ }); ++ } ++}); ++/** ++ * POST /api/v1/bulk/milestones/release ++ * Atomically releases multiple milestones, updates their respective parent jobs, ++ * and records auditing milestone events. ++ * Strictly rolls back if any individual release requirement (e.g. missing deliverable) fails. ++ */ ++router.post("/milestones/release", async (req, res) => { ++ try { ++ const parsed = bulkReleaseSchema.parse(req.body); ++ tracing_1.logger.info(`Starting bulk milestone release for ${parsed.releases.length} milestones`); ++ const releaseResults = await (0, transaction_1.runInTransaction)(async (tx) => { ++ const results = []; ++ for (let i = 0; i < parsed.releases.length; i++) { ++ const { jobId, milestoneId } = parsed.releases[i]; ++ tracing_1.logger.debug(`Verifying and releasing milestone ID ${milestoneId} for Job ${jobId}`); ++ // Find existing milestone ++ const milestone = await tx.milestones.findUnique({ ++ where: { id: milestoneId, job_id: jobId }, ++ }); ++ if (!milestone) { ++ throw new Error(`Milestone ID ${milestoneId} was not found under Job ID ${jobId}`); ++ } ++ if (milestone.status !== "pending") { ++ throw new Error(`Milestone ID ${milestoneId} cannot be released because its status is '${milestone.status}' (expected 'pending')`); ++ } ++ // Verify milestone deliverable is submitted ++ const deliverableExists = await tx.deliverables.findFirst({ ++ where: { job_id: jobId, milestone_index: milestone.index }, ++ }); ++ if (!deliverableExists) { ++ throw new Error(`A deliverable must be submitted for Milestone index ${milestone.index} under Job ID ${jobId} before releasing it`); ++ } ++ const txHash = `mock-bulk-release-tx-${milestoneId.slice(0, 8)}`; ++ // Update Milestone Status ++ const updatedMilestone = await tx.milestones.update({ ++ where: { id: milestoneId }, ++ data: { ++ status: "released", ++ tx_hash: txHash, ++ released_at: new Date(), ++ completed_at: new Date(), ++ }, ++ }); ++ // Create Milestone Audit Event ++ await tx.milestone_events.create({ ++ data: { ++ milestone_id: milestoneId, ++ job_id: jobId, ++ event_type: "released", ++ tx_hash: txHash, ++ note: "Released atomically via bulk operation", ++ }, ++ }); ++ // Recalculate remaining pending milestones ++ const remainingPending = await tx.milestones.count({ ++ where: { job_id: jobId, status: "pending" }, ++ }); ++ const nextJobStatus = remainingPending === 0 ? "completed" : "funded"; ++ // Update Job Status ++ const updatedJob = await tx.jobs.update({ ++ where: { id: jobId }, ++ data: { status: nextJobStatus }, ++ }); ++ results.push({ ++ milestoneId, ++ jobId, ++ status: "released", ++ jobStatus: nextJobStatus, ++ amount_usdc: Number(updatedMilestone.amount_usdc), ++ }); ++ } ++ return results; ++ }, { isolationLevel: "SERIALIZABLE" }); // Use Serializable isolation to prevent double-release race conditions ++ res.status(200).json({ ++ success: true, ++ message: `Successfully released ${releaseResults.length} milestones atomically`, ++ releases: releaseResults, ++ }); ++ } ++ catch (error) { ++ if (error instanceof zod_1.z.ZodError) { ++ return res.status(400).json({ ++ success: false, ++ error: "Validation failed", ++ issues: error.issues, ++ }); ++ } ++ tracing_1.logger.error(`Bulk milestone release aborted and rolled back. Error: ${error.message || error}`); ++ res.status(500).json({ ++ success: false, ++ error: "Transaction rolled back due to error", ++ details: error.message || error, ++ }); ++ } ++}); ++exports.default = router; +diff --git a/backend/dist/routes/diagnostics.js b/backend/dist/routes/diagnostics.js +new file mode 100644 +index 0000000..4b70a71 +--- /dev/null ++++ b/backend/dist/routes/diagnostics.js +@@ -0,0 +1,84 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++const express_1 = require("express"); ++const tracing_1 = require("../utils/tracing"); ++const db_1 = require("../config/db"); ++const router = (0, express_1.Router)(); ++/** ++ * GET /api/v1/diagnostics/request-info ++ * ++ * Returns sanitized request diagnostics for the current request. ++ * Sensitive headers (authorization, cookies, API keys, tokens, etc.) ++ * are automatically redacted so this endpoint is safe to expose to ++ * monitoring dashboards and log aggregators. ++ */ ++router.get("/request-info", async (req, res) => { ++ try { ++ const safeHeaders = (0, tracing_1.sanitizeHeaders)(req.headers); ++ tracing_1.logger.info("Diagnostics: request-info endpoint accessed", { ++ method: req.method, ++ url: req.originalUrl, ++ }); ++ res.status(200).json({ ++ request: { ++ method: req.method, ++ url: req.originalUrl, ++ path: req.path, ++ protocol: req.protocol, ++ ip: req.ip, ++ hostname: req.hostname, ++ headers: safeHeaders, ++ query: req.query, ++ }, ++ server: { ++ nodeVersion: process.version, ++ platform: process.platform, ++ uptime: Math.floor(process.uptime()), ++ memoryUsage: { ++ rss: Math.round(process.memoryUsage().rss / 1024 / 1024), ++ heapUsed: Math.round(process.memoryUsage().heapUsed / 1024 / 1024), ++ heapTotal: Math.round(process.memoryUsage().heapTotal / 1024 / 1024), ++ external: Math.round(process.memoryUsage().external / 1024 / 1024), ++ }, ++ }, ++ pool: { ++ totalConnections: db_1.pool.totalCount, ++ idleConnections: db_1.pool.idleCount, ++ waitingRequests: db_1.pool.waitingCount, ++ }, ++ }); ++ } ++ catch (error) { ++ tracing_1.logger.error("Diagnostics: request-info error", { error: error.message }); ++ res.status(500).json({ error: "Failed to retrieve diagnostics" }); ++ } ++}); ++/** ++ * POST /api/v1/diagnostics/sanitize-test ++ * ++ * Accepts an arbitrary JSON body and returns the sanitized version. ++ * Useful for verifying that the sanitization rules are correctly ++ * stripping secrets from structured payloads before they reach logs. ++ * ++ * Example request body: ++ * { ++ * "authorization": "Bearer eyJhbG...", ++ * "user": "alice", ++ * "nested": { "password": "s3cret", "data": 42 } ++ * } ++ */ ++router.post("/sanitize-test", async (req, res) => { ++ try { ++ const sanitized = (0, tracing_1.sanitizeMeta)(req.body); ++ tracing_1.logger.debug("Diagnostics: sanitize-test endpoint invoked"); ++ res.status(200).json({ ++ original_keys: Object.keys(req.body || {}), ++ sanitized, ++ }); ++ } ++ catch (error) { ++ tracing_1.logger.error("Diagnostics: sanitize-test error", { error: error.message }); ++ res.status(500).json({ error: "Failed to sanitize payload" }); ++ } ++}); ++exports.default = router; +diff --git a/backend/dist/routes/jobs.js b/backend/dist/routes/jobs.js +index de4bde6..270083f 100644 +--- a/backend/dist/routes/jobs.js ++++ b/backend/dist/routes/jobs.js +@@ -10,6 +10,7 @@ const bids_1 = __importDefault(require("./bids")); + const milestones_1 = __importDefault(require("./milestones")); + const deliverables_1 = __importDefault(require("./deliverables")); + const job_disputes_1 = __importDefault(require("./job-disputes")); ++const tracing_1 = require("../utils/tracing"); + const router = (0, express_1.Router)(); + // Validation schemas + const getJobsQuerySchema = zod_1.z.object({ +@@ -17,6 +18,13 @@ const getJobsQuerySchema = zod_1.z.object({ + status: zod_1.z.string().optional(), + tag: zod_1.z.string().optional(), + sort: zod_1.z.string().optional(), ++ limit: zod_1.z.coerce.number().int().min(1).max(100).default(25), ++ cursor_created_at: zod_1.z.coerce.date().optional(), ++ cursor_id: zod_1.z.string().uuid().optional(), ++ min_budget: zod_1.z.coerce.number().int().nonnegative().optional(), ++ max_budget: zod_1.z.coerce.number().int().nonnegative().optional(), ++ skills: zod_1.z.string().optional(), ++ deadline_before: zod_1.z.coerce.date().optional(), + }); + const createJobSchema = zod_1.z.object({ + title: zod_1.z.string().min(1, "title is required"), +@@ -24,40 +32,100 @@ const createJobSchema = zod_1.z.object({ + budget_usdc: zod_1.z.number().int().positive("budget must be greater than zero"), + milestones: zod_1.z.number().int().min(1, "milestones must be at least 1"), + client_address: zod_1.z.string().min(1), ++ skills: zod_1.z.array(zod_1.z.string()).optional().default([]), ++ deadline_at: zod_1.z.coerce.date().optional(), + }); + const markFundedSchema = zod_1.z.object({ + client_address: zod_1.z.string().min(1), + }); ++function serializeJob(row) { ++ return { ++ ...row, ++ budget_usdc: Number(row.budget_usdc), ++ on_chain_job_id: row.on_chain_job_id ? Number(row.on_chain_job_id) : null, ++ }; ++} + // GET /api/v1/jobs + router.get("/", async (req, res) => { + try { + const query = getJobsQuerySchema.parse(req.query); +- let whereClause = {}; ++ if ((query.cursor_created_at && !query.cursor_id) || (!query.cursor_created_at && query.cursor_id)) { ++ return res.status(400).json({ ++ error: "cursor_created_at and cursor_id must be provided together", ++ }); ++ } ++ if (query.min_budget !== undefined && ++ query.max_budget !== undefined && ++ query.min_budget > query.max_budget) { ++ return res.status(400).json({ error: "min_budget cannot be greater than max_budget" }); ++ } ++ const conditions = []; ++ const params = []; ++ const addParam = (value) => { ++ params.push(value); ++ return `$${params.length}`; ++ }; + if (query.query || (query.tag && query.tag !== "all")) { + const searchTerm = query.query || query.tag; +- whereClause.OR = [ +- { title: { contains: searchTerm, mode: "insensitive" } }, +- { description: { contains: searchTerm, mode: "insensitive" } }, +- ]; ++ const placeholder = addParam(`%${searchTerm}%`); ++ conditions.push(`(title ILIKE ${placeholder} OR description ILIKE ${placeholder})`); + } + if (query.status) { +- whereClause.status = query.status; ++ conditions.push(`status = ${addParam(query.status)}`); ++ } ++ if (query.min_budget !== undefined) { ++ conditions.push(`budget_usdc >= ${addParam(query.min_budget)}`); ++ } ++ if (query.max_budget !== undefined) { ++ conditions.push(`budget_usdc <= ${addParam(query.max_budget)}`); ++ } ++ if (query.skills) { ++ const skills = query.skills ++ .split(",") ++ .map((skill) => skill.trim()) ++ .filter(Boolean); ++ if (skills.length > 0) { ++ conditions.push(`skills && ${addParam(skills)}::text[]`); ++ } + } +- let orderByClause = { created_at: "desc" }; +- if (query.sort === "budget") { +- orderByClause = { budget_usdc: "desc" }; ++ if (query.deadline_before) { ++ conditions.push(`deadline_at <= ${addParam(query.deadline_before)}`); + } +- const jobs = await db_1.prisma.jobs.findMany({ +- where: whereClause, +- orderBy: orderByClause, ++ if (query.cursor_created_at && query.cursor_id) { ++ conditions.push(`(created_at, id) < (${addParam(query.cursor_created_at)}, ${addParam(query.cursor_id)}::uuid)`); ++ } ++ const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : ""; ++ const orderSql = query.sort === "budget" ++ ? "ORDER BY budget_usdc DESC, created_at DESC, id DESC" ++ : "ORDER BY created_at DESC, id DESC"; ++ const limitPlaceholder = addParam(query.limit + 1); ++ const result = await db_1.pool.query(`SELECT id, title, description, budget_usdc, milestones, client_address, ++ freelancer_address, status, metadata_hash, on_chain_job_id, skills, deadline_at, ++ created_at, updated_at ++ FROM jobs ++ ${whereSql} ++ ${orderSql} ++ LIMIT ${limitPlaceholder}`, params); ++ const rows = result.rows; ++ const hasNext = rows.length > query.limit; ++ const items = (hasNext ? rows.slice(0, query.limit) : rows).map(serializeJob); ++ const cursorSource = hasNext ? items[items.length - 1] : null; ++ tracing_1.logger.info("Paginated jobs queried", { ++ returned: items.length, ++ hasNext, ++ status: query.status || "any", ++ sort: query.sort || "created_at", ++ }); ++ res.json({ ++ items, ++ next_cursor: cursorSource ++ ? { ++ created_at: cursorSource.created_at, ++ id: cursorSource.id, ++ } ++ : null, ++ limit: query.limit, + }); +- // Convert BigInt to Number/String for JSON serialization +- const serializedJobs = jobs.map((job) => ({ +- ...job, +- budget_usdc: Number(job.budget_usdc), +- on_chain_job_id: job.on_chain_job_id ? Number(job.on_chain_job_id) : null, +- })); +- res.json(serializedJobs); + } + catch (error) { + if (error instanceof zod_1.z.ZodError) { +@@ -80,6 +148,8 @@ router.post("/", async (req, res) => { + milestones: data.milestones, + client_address: data.client_address, + status: "open", ++ skills: data.skills, ++ deadline_at: data.deadline_at, + }, + }); + const perMilestone = Math.floor(data.budget_usdc / data.milestones); +diff --git a/backend/dist/routes/pool.js b/backend/dist/routes/pool.js +new file mode 100644 +index 0000000..5c4ff08 +--- /dev/null ++++ b/backend/dist/routes/pool.js +@@ -0,0 +1,114 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++const express_1 = require("express"); ++const db_1 = require("../config/db"); ++const tracing_1 = require("../utils/tracing"); ++const router = (0, express_1.Router)(); ++/** ++ * GET /api/v1/pool/health ++ * ++ * Returns detailed connection pool health statistics including: ++ * - current total / idle / active connection counts ++ * - waiting request queue depth ++ * - configured pool limits and timeouts ++ * - background health-check status and history ++ * - pool uptime ++ * ++ * Responds 200 when the last background health-check passed, 503 otherwise. ++ */ ++router.get("/health", async (req, res) => { ++ const startTime = process.hrtime(); ++ try { ++ const stats = (0, db_1.getPoolHealthStats)(); ++ // Perform a live probe so the caller gets real-time validation ++ let liveProbeOk = false; ++ let liveProbeLatencyMs = 0; ++ try { ++ const probeStart = process.hrtime(); ++ const client = await db_1.pool.connect(); ++ await client.query("SELECT 1"); ++ client.release(); ++ const probeDuration = process.hrtime(probeStart); ++ liveProbeLatencyMs = parseFloat((probeDuration[0] * 1000 + probeDuration[1] / 1_000_000).toFixed(2)); ++ liveProbeOk = true; ++ } ++ catch (probeErr) { ++ tracing_1.logger.error("Pool live-probe failed", { error: probeErr.message }); ++ } ++ const duration = process.hrtime(startTime); ++ const totalLatencyMs = parseFloat((duration[0] * 1000 + duration[1] / 1_000_000).toFixed(2)); ++ const healthy = liveProbeOk && stats.lastHealthCheckOk; ++ tracing_1.logger.info("Pool health endpoint hit", { ++ healthy, ++ liveProbeOk, ++ liveProbeLatencyMs, ++ ...stats, ++ }); ++ res.status(healthy ? 200 : 503).json({ ++ status: healthy ? "healthy" : "degraded", ++ pool: { ++ totalConnections: stats.totalConnections, ++ idleConnections: stats.idleConnections, ++ activeConnections: stats.activeConnections, ++ waitingRequests: stats.waitingRequests, ++ }, ++ config: { ++ maxConnections: stats.maxConnections, ++ minConnections: stats.minConnections, ++ idleTimeoutMs: stats.idleTimeoutMs, ++ connectionTimeoutMs: stats.connectionTimeoutMs, ++ healthCheckIntervalMs: stats.healthCheckIntervalMs, ++ }, ++ healthCheck: { ++ lastCheckAt: stats.lastHealthCheckAt, ++ lastCheckOk: stats.lastHealthCheckOk, ++ passed: stats.healthChecksPassed, ++ failed: stats.healthChecksFailed, ++ }, ++ liveProbe: { ++ ok: liveProbeOk, ++ latencyMs: liveProbeLatencyMs, ++ }, ++ uptimeSeconds: stats.uptimeSeconds, ++ responseTimeMs: totalLatencyMs, ++ }); ++ } ++ catch (error) { ++ tracing_1.logger.error("Pool health endpoint error", { error: error.message }); ++ res.status(500).json({ ++ status: "error", ++ error: "Failed to retrieve pool health statistics", ++ }); ++ } ++}); ++/** ++ * GET /api/v1/pool/stats ++ * ++ * Lightweight endpoint returning only numeric pool counters. ++ * Suitable for Prometheus-style scraping or lightweight monitoring. ++ */ ++router.get("/stats", async (req, res) => { ++ try { ++ const stats = (0, db_1.getPoolHealthStats)(); ++ tracing_1.logger.debug("Pool stats endpoint hit", { ++ total: stats.totalConnections, ++ idle: stats.idleConnections, ++ }); ++ res.status(200).json({ ++ totalConnections: stats.totalConnections, ++ idleConnections: stats.idleConnections, ++ activeConnections: stats.activeConnections, ++ waitingRequests: stats.waitingRequests, ++ maxConnections: stats.maxConnections, ++ minConnections: stats.minConnections, ++ uptimeSeconds: stats.uptimeSeconds, ++ healthChecksPassed: stats.healthChecksPassed, ++ healthChecksFailed: stats.healthChecksFailed, ++ }); ++ } ++ catch (error) { ++ tracing_1.logger.error("Pool stats endpoint error", { error: error.message }); ++ res.status(500).json({ error: "Failed to retrieve pool statistics" }); ++ } ++}); ++exports.default = router; +diff --git a/backend/dist/routes/state.js b/backend/dist/routes/state.js +new file mode 100644 +index 0000000..afb19b6 +--- /dev/null ++++ b/backend/dist/routes/state.js +@@ -0,0 +1,51 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++const express_1 = require("express"); ++const zod_1 = require("zod"); ++const db_1 = require("../config/db"); ++const tracing_1 = require("../utils/tracing"); ++const router = (0, express_1.Router)(); ++const recoveryQuerySchema = zod_1.z.object({ ++ status: zod_1.z.enum(["pending", "committed", "failed", "abandoned"]).optional(), ++ limit: zod_1.z.coerce.number().int().min(1).max(200).default(50), ++}); ++/** ++ * GET /api/v1/state/write-recovery ++ * ++ * Lists durable write-recovery rows for interrupted or retryable database ++ * mutations. The query is intentionally bounded and ordered by the indexed ++ * status/updated_at tuple from the migration to avoid table scans under load. ++ */ ++router.get("/write-recovery", async (req, res) => { ++ try { ++ const query = recoveryQuerySchema.parse(req.query); ++ const params = [query.limit]; ++ let sql = ` ++ SELECT id, idempotency_key, operation, entity_type, entity_id, status, ++ attempts, last_error, recovery_payload, created_at, updated_at ++ FROM write_recovery_records ++ `; ++ if (query.status) { ++ params.unshift(query.status); ++ sql += " WHERE status = $1 ORDER BY updated_at DESC, id DESC LIMIT $2"; ++ } ++ else { ++ sql += " ORDER BY updated_at DESC, id DESC LIMIT $1"; ++ } ++ const result = await db_1.pool.query(sql, params); ++ tracing_1.logger.info("Write recovery state queried", { ++ status: query.status || "any", ++ limit: query.limit, ++ returned: result.rowCount, ++ }); ++ res.status(200).json(result.rows); ++ } ++ catch (error) { ++ if (error instanceof zod_1.z.ZodError) { ++ return res.status(400).json({ error: error.issues }); ++ } ++ tracing_1.logger.error("Write recovery state query failed", { error: error.message }); ++ res.status(500).json({ error: "Failed to retrieve write recovery state" }); ++ } ++}); ++exports.default = router; +diff --git a/backend/dist/routes/users.js b/backend/dist/routes/users.js +index 0a661e9..f0f65f8 100644 +--- a/backend/dist/routes/users.js ++++ b/backend/dist/routes/users.js +@@ -2,33 +2,75 @@ + Object.defineProperty(exports, "__esModule", { value: true }); + const express_1 = require("express"); + const db_1 = require("../config/db"); ++const tracing_1 = require("../config/tracing"); + const zod_1 = require("zod"); + const router = (0, express_1.Router)(); ++const logger = tracing_1.trace.getLogger("users-routes"); ++// Pagination schema for all address mapping queries ++const paginationSchema = zod_1.z.object({ ++ page: zod_1.z.string().optional().default("1").transform(v => Math.max(1, parseInt(v, 10) || 1)), ++ limit: zod_1.z.string().optional().default("50").transform(v => { ++ const parsed = parseInt(v, 10) || 50; ++ return Math.min(Math.max(1, parsed), 100); // Enforce 1-100 limit ++ }), ++}); + const updateProfileSchema = zod_1.z.object({ + display_name: zod_1.z.string().optional().nullable(), + headline: zod_1.z.string().optional().default(""), + bio: zod_1.z.string().optional().default(""), + portfolio_links: zod_1.z.array(zod_1.z.string()).optional().default([]), + }); +-// GET /api/v1/users ++// GET /api/v1/users - List all user addresses with pagination + router.get("/", async (req, res) => { ++ const startTime = Date.now(); ++ logger.debug("GET /users request received", { query: req.query }); + try { +- const users = await db_1.prisma.profiles.findMany({ +- select: { address: true }, +- distinct: ["address"], +- orderBy: { address: "asc" }, ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ logger.info("Fetching paginated user addresses", { page, limit, skip }); ++ const [users, total] = await Promise.all([ ++ db_1.prisma.profiles.findMany({ ++ select: { address: true }, ++ distinct: ["address"], ++ orderBy: { address: "asc" }, ++ skip, ++ take: limit, ++ }), ++ db_1.prisma.profiles.count(), ++ ]); ++ const duration = Date.now() - startTime; ++ logger.info("User addresses fetched successfully", { ++ count: users.length, ++ total, ++ page, ++ limit, ++ duration, ++ }); ++ res.status(200).json({ ++ data: users.map(u => u.address), ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, + }); +- res.json(users.map(u => u.address)); + } + catch (error) { +- console.error("GET /users error:", error); ++ const duration = Date.now() - startTime; ++ logger.error("GET /users error", { ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); + res.status(500).json({ error: "Internal server error" }); + } + }); + // GET /api/v1/users/:address/profile + router.get("/:address/profile", async (req, res) => { ++ const startTime = Date.now(); ++ const { address } = req.params; ++ logger.debug("GET /users/:address/profile request", { address }); + try { +- const { address } = req.params; + const profile = await db_1.prisma.profiles.findUnique({ + where: { address }, + }); +@@ -77,7 +119,14 @@ router.get("/:address/profile", async (req, res) => { + dispute_rate, + }; + const portfolio_links = profile?.portfolio_links ? profile.portfolio_links.filter(v => typeof v === "string") : []; +- res.json({ ++ const duration = Date.now() - startTime; ++ logger.info("User profile fetched successfully", { ++ address, ++ total_jobs, ++ completed_jobs, ++ duration, ++ }); ++ res.status(200).json({ + address, + display_name: profile?.display_name || null, + headline: profile?.headline || "", +@@ -89,14 +138,21 @@ router.get("/:address/profile", async (req, res) => { + }); + } + catch (error) { +- console.error("GET /users/:address/profile error:", error); ++ const duration = Date.now() - startTime; ++ logger.error("GET /users/:address/profile error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); + res.status(500).json({ error: "Internal server error" }); + } + }); + // PUT /api/v1/users/:address/profile + router.put("/:address/profile", async (req, res) => { ++ const startTime = Date.now(); ++ const { address } = req.params; ++ logger.debug("PUT /users/:address/profile request", { address }); + try { +- const { address } = req.params; + const data = updateProfileSchema.parse(req.body); + const portfolio_links = data.portfolio_links + .map(l => l.trim()) +@@ -118,31 +174,262 @@ router.put("/:address/profile", async (req, res) => { + portfolio_links, + }, + }); +- // Re-fetch to return full profile +- // Note: To match exact Rust functionality, we would redirect to the GET function, +- // but fetching directly here is cleaner. We will just redirect or return success. ++ const duration = Date.now() - startTime; ++ logger.info("User profile updated successfully", { ++ address, ++ duration, ++ }); + res.status(200).json({ success: true }); + } + catch (error) { ++ const duration = Date.now() - startTime; + if (error instanceof zod_1.z.ZodError) { ++ logger.warn("Profile validation failed", { ++ address, ++ errors: error.issues, ++ duration, ++ }); + return res.status(400).json({ error: error.issues[0]?.message || "Validation failed" }); + } +- console.error("PUT /users/:address/profile error:", error); ++ logger.error("PUT /users/:address/profile error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); + res.status(500).json({ error: "Internal server error" }); + } + }); +-// GET /api/v1/users/:address/saved-jobs ++// GET /api/v1/users/:address/saved-jobs - Get paginated saved jobs for user + router.get("/:address/saved-jobs", async (req, res) => { ++ const startTime = Date.now(); ++ const { address } = req.params; + try { +- const { address } = req.params; +- const savedJobs = await db_1.prisma.saved_jobs.findMany({ +- where: { user_address: address }, +- orderBy: { created_at: "desc" }, ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ logger.debug("GET /users/:address/saved-jobs request", { address, page, limit }); ++ const [savedJobs, total] = await Promise.all([ ++ db_1.prisma.saved_jobs.findMany({ ++ where: { user_address: address }, ++ orderBy: { created_at: "desc" }, ++ skip, ++ take: limit, ++ }), ++ db_1.prisma.saved_jobs.count({ where: { user_address: address } }), ++ ]); ++ const duration = Date.now() - startTime; ++ logger.info("Saved jobs fetched successfully", { ++ address, ++ count: savedJobs.length, ++ total, ++ page, ++ limit, ++ duration, ++ }); ++ res.status(200).json({ ++ data: savedJobs, ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, + }); +- res.json(savedJobs); + } + catch (error) { +- console.error("GET /users/:address/saved-jobs error:", error); ++ const duration = Date.now() - startTime; ++ logger.error("GET /users/:address/saved-jobs error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); ++ res.status(500).json({ error: "Internal server error" }); ++ } ++}); ++// GET /api/v1/users/address-mappings - List all user address mappings with pagination and filtering ++router.get("/address-mappings/list", async (req, res) => { ++ const startTime = Date.now(); ++ logger.debug("GET /address-mappings request", { query: req.query }); ++ try { ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ const filterType = req.query.type?.toLowerCase() || "all"; ++ logger.info("Fetching address mappings", { page, limit, filterType }); ++ let addressMappings = []; ++ let total = 0; ++ if (filterType === "profiles" || filterType === "all") { ++ const profiles = await db_1.prisma.profiles.findMany({ ++ select: { address: true, display_name: true, updated_at: true }, ++ orderBy: { updated_at: "desc" }, ++ skip, ++ take: limit, ++ }); ++ const profileCount = await db_1.prisma.profiles.count(); ++ addressMappings = profiles.map(p => ({ ++ address: p.address, ++ type: "profile", ++ display_name: p.display_name, ++ updated_at: p.updated_at, ++ })); ++ total = profileCount; ++ } ++ else if (filterType === "sessions") { ++ const sessions = await db_1.prisma.sessions.findMany({ ++ select: { address: true, expires_at: true }, ++ orderBy: { expires_at: "desc" }, ++ skip, ++ take: limit, ++ }); ++ const sessionCount = await db_1.prisma.sessions.count(); ++ addressMappings = sessions.map(s => ({ ++ address: s.address, ++ type: "session", ++ expires_at: s.expires_at, ++ })); ++ total = sessionCount; ++ } ++ else if (filterType === "arbiters") { ++ const arbiters = await db_1.prisma.arbiters.findMany({ ++ select: { address: true, active: true, created_at: true }, ++ orderBy: { created_at: "desc" }, ++ skip, ++ take: limit, ++ }); ++ const arbiterCount = await db_1.prisma.arbiters.count(); ++ addressMappings = arbiters.map(a => ({ ++ address: a.address, ++ type: "arbiter", ++ active: a.active, ++ created_at: a.created_at, ++ })); ++ total = arbiterCount; ++ } ++ const duration = Date.now() - startTime; ++ logger.info("Address mappings fetched successfully", { ++ count: addressMappings.length, ++ total, ++ filterType, ++ duration, ++ }); ++ res.status(200).json({ ++ data: addressMappings, ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, ++ filter: filterType, ++ }); ++ } ++ catch (error) { ++ const duration = Date.now() - startTime; ++ logger.error("GET /address-mappings error", { ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); ++ res.status(500).json({ error: "Internal server error" }); ++ } ++}); ++// GET /api/v1/users/:address/activity - Get paginated activity log for user address ++router.get("/:address/activity", async (req, res) => { ++ const startTime = Date.now(); ++ const { address } = req.params; ++ try { ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ logger.debug("GET /users/:address/activity request", { address, page, limit }); ++ const [activities, total] = await Promise.all([ ++ db_1.prisma.activity_logs.findMany({ ++ where: { user_address: address }, ++ orderBy: { created_at: "desc" }, ++ skip, ++ take: limit, ++ }), ++ db_1.prisma.activity_logs.count({ where: { user_address: address } }), ++ ]); ++ const duration = Date.now() - startTime; ++ logger.info("User activity fetched successfully", { ++ address, ++ count: activities.length, ++ total, ++ page, ++ limit, ++ duration, ++ }); ++ res.status(200).json({ ++ data: activities, ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, ++ }); ++ } ++ catch (error) { ++ const duration = Date.now() - startTime; ++ logger.error("GET /users/:address/activity error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); ++ res.status(500).json({ error: "Internal server error" }); ++ } ++}); ++// GET /api/v1/users/:address/jobs - Get paginated jobs for user (as client or freelancer) ++router.get("/:address/jobs", async (req, res) => { ++ const startTime = Date.now(); ++ const { address } = req.params; ++ try { ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ const status = req.query.status?.toLowerCase() || "all"; ++ logger.debug("GET /users/:address/jobs request", { address, page, limit, status }); ++ const whereCondition = status === "all" ++ ? { ++ OR: [{ client_address: address }, { freelancer_address: address }], ++ } ++ : { ++ status, ++ OR: [{ client_address: address }, { freelancer_address: address }], ++ }; ++ const [jobs, total] = await Promise.all([ ++ db_1.prisma.jobs.findMany({ ++ where: whereCondition, ++ orderBy: { created_at: "desc" }, ++ skip, ++ take: limit, ++ }), ++ db_1.prisma.jobs.count({ where: whereCondition }), ++ ]); ++ const duration = Date.now() - startTime; ++ logger.info("User jobs fetched successfully", { ++ address, ++ count: jobs.length, ++ total, ++ page, ++ limit, ++ status, ++ duration, ++ }); ++ res.status(200).json({ ++ data: jobs, ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, ++ filter: { status }, ++ }); ++ } ++ catch (error) { ++ const duration = Date.now() - startTime; ++ logger.error("GET /users/:address/jobs error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); + res.status(500).json({ error: "Internal server error" }); + } + }); +diff --git a/backend/dist/test-bulk-transactions.js b/backend/dist/test-bulk-transactions.js +new file mode 100644 +index 0000000..de05b19 +--- /dev/null ++++ b/backend/dist/test-bulk-transactions.js +@@ -0,0 +1,197 @@ ++"use strict"; ++var __importDefault = (this && this.__importDefault) || function (mod) { ++ return (mod && mod.__esModule) ? mod : { "default": mod }; ++}; ++Object.defineProperty(exports, "__esModule", { value: true }); ++const express_1 = __importDefault(require("express")); ++const db_1 = require("./config/db"); ++const tracing_1 = require("./utils/tracing"); ++const bulk_1 = __importDefault(require("./routes/bulk")); ++const node_crypto_1 = require("node:crypto"); ++const app = (0, express_1.default)(); ++app.use(express_1.default.json()); ++app.use(tracing_1.tracingMiddleware); ++app.use("/api/v1/bulk", bulk_1.default); ++const PORT = 3009; ++const server = app.listen(PORT, async () => { ++ console.log(`\n======================================================`); ++ console.log(`🧪 STARTING AUTOMATED TRANSACTIONAL BULK ROLLBACK TEST`); ++ console.log(`======================================================\n`); ++ try { ++ // 0. Ensure Database connection is active ++ console.log("Checking DB connection..."); ++ await db_1.prisma.$queryRaw `SELECT 1`; ++ console.log("DB connection OK.\n"); ++ const clientAddress = `GD${(0, node_crypto_1.randomUUID)().replace(/-/g, "").slice(0, 30).toUpperCase()}`; ++ const freelancerAddress = `GD${(0, node_crypto_1.randomUUID)().replace(/-/g, "").slice(0, 30).toUpperCase()}`; ++ // Test 1: Successful Bulk Job Creation ++ console.log("------------------------------------------------------"); ++ console.log("TEST 1: Successful Bulk Job Creation (Atomic Commit)"); ++ console.log("------------------------------------------------------"); ++ const validJobsPayload = { ++ jobs: [ ++ { ++ title: "Verify Soroban Bridge Performance", ++ description: "Measure lock/unlock times under load", ++ budget_usdc: 5000, ++ milestones: 2, ++ client_address: clientAddress, ++ }, ++ { ++ title: "Audit Reputation scoring dynamic thresholds", ++ description: "Run statistical verification across 100 historical profiles", ++ budget_usdc: 15000, ++ milestones: 3, ++ client_address: clientAddress, ++ } ++ ] ++ }; ++ const res1 = await fetch(`http://127.0.0.1:${PORT}/api/v1/bulk/jobs`, { ++ method: "POST", ++ headers: { "Content-Type": "application/json" }, ++ body: JSON.stringify(validJobsPayload), ++ }); ++ const body1 = await res1.json(); ++ console.log(`Response Status: ${res1.status}`); ++ console.log(`Response Success: ${body1.success}`); ++ if (res1.status === 201) { ++ console.log(`Created jobs count: ${body1.jobs.length}`); ++ console.log(`Job 1 Title: ${body1.jobs[0].title} (${body1.jobs[0].milestones.length} milestones)`); ++ console.log(`Job 2 Title: ${body1.jobs[1].title} (${body1.jobs[1].milestones.length} milestones)`); ++ console.log("✅ TEST 1 PASSED: Atomic commit succeeded!"); ++ } ++ else { ++ throw new Error(`TEST 1 FAILED: Unexpected status code: ${res1.status}`); ++ } ++ // Test 2: Bulk Job Creation Rollback on Validation Failure ++ console.log("\n------------------------------------------------------"); ++ console.log("TEST 2: Bulk Job Creation Rollback on Zod Error"); ++ console.log("------------------------------------------------------"); ++ // Capture initial job count ++ const initialJobsCount = await db_1.prisma.jobs.count(); ++ const invalidJobsPayload = { ++ jobs: [ ++ { ++ title: "This job has valid configurations", ++ description: "Should not be persisted if transaction rolls back", ++ budget_usdc: 2000, ++ milestones: 1, ++ client_address: clientAddress, ++ }, ++ { ++ title: "This job has an INVALID negative budget", ++ description: "Will trigger validation failure and abort the transaction", ++ budget_usdc: -500, // Invalid: must be positive ++ milestones: 1, ++ client_address: clientAddress, ++ } ++ ] ++ }; ++ const res2 = await fetch(`http://127.0.0.1:${PORT}/api/v1/bulk/jobs`, { ++ method: "POST", ++ headers: { "Content-Type": "application/json" }, ++ body: JSON.stringify(invalidJobsPayload), ++ }); ++ const body2 = await res2.json(); ++ console.log(`Response Status: ${res2.status} (Expected: 400)`); ++ console.log(`Response Success: ${body2.success} (Expected: false)`); ++ // Verify that NO jobs were written to the database (atomic rollback!) ++ const finalJobsCount = await db_1.prisma.jobs.count(); ++ console.log(`Initial jobs count: ${initialJobsCount}`); ++ console.log(`Final jobs count: ${finalJobsCount}`); ++ if (initialJobsCount === finalJobsCount) { ++ console.log("🛡️ VERIFIED: The first valid job was NOT created. Transaction rolled back completely!"); ++ console.log("✅ TEST 2 PASSED: Rollback verified!"); ++ } ++ else { ++ throw new Error("❌ TEST 2 FAILED: A job was persisted despite transaction failure!"); ++ } ++ // Test 3: Bulk Milestone Release & Rollback Safety ++ console.log("\n------------------------------------------------------"); ++ console.log("TEST 3: Bulk Milestone Release Rollback on Missing Deliverable"); ++ console.log("------------------------------------------------------"); ++ // 1. Create a job manually inside DB to test release ++ const testJob = await db_1.prisma.jobs.create({ ++ data: { ++ title: "Milestone Release Rollback Test Job", ++ budget_usdc: BigInt(1000), ++ milestones: 2, ++ client_address: clientAddress, ++ freelancer_address: freelancerAddress, ++ status: "funded", ++ } ++ }); ++ const milestone1 = await db_1.prisma.milestones.create({ ++ data: { ++ job_id: testJob.id, ++ index: 1, ++ title: "Milestone 1", ++ amount_usdc: BigInt(500), ++ status: "pending", ++ } ++ }); ++ const milestone2 = await db_1.prisma.milestones.create({ ++ data: { ++ job_id: testJob.id, ++ index: 2, ++ title: "Milestone 2", ++ amount_usdc: BigInt(500), ++ status: "pending", ++ } ++ }); ++ // 2. Submit a deliverable ONLY for milestone 1 ++ await db_1.prisma.deliverables.create({ ++ data: { ++ job_id: testJob.id, ++ milestone_index: 1, ++ submitted_by: freelancerAddress, ++ label: "Deliverable 1 link", ++ url: "https://github.com/dxmakers/lance", ++ } ++ }); ++ // Try to bulk-release both Milestone 1 AND Milestone 2. ++ // Since Milestone 2 has no deliverable submitted, this request MUST fail, ++ // and Milestone 1 must NOT be released (rolled back atomically!). ++ const releasePayload = { ++ releases: [ ++ { jobId: testJob.id, milestoneId: milestone1.id }, ++ { jobId: testJob.id, milestoneId: milestone2.id } // This one has no deliverable, will fail! ++ ] ++ }; ++ const res3 = await fetch(`http://127.0.0.1:${PORT}/api/v1/bulk/milestones/release`, { ++ method: "POST", ++ headers: { "Content-Type": "application/json" }, ++ body: JSON.stringify(releasePayload), ++ }); ++ const body3 = await res3.json(); ++ console.log(`Response Status: ${res3.status} (Expected: 500)`); ++ console.log(`Error detail: ${body3.details}`); ++ // Verify that Milestone 1 status is STILL 'pending' (fully rolled back!) ++ const dbMilestone1 = await db_1.prisma.milestones.findUnique({ where: { id: milestone1.id } }); ++ const dbMilestone2 = await db_1.prisma.milestones.findUnique({ where: { id: milestone2.id } }); ++ console.log(`Milestone 1 Status in DB: ${dbMilestone1?.status} (Expected: pending)`); ++ console.log(`Milestone 2 Status in DB: ${dbMilestone2?.status} (Expected: pending)`); ++ if (dbMilestone1?.status === "pending" && dbMilestone2?.status === "pending") { ++ console.log("🛡️ VERIFIED: Both milestone statuses remained 'pending'. Transaction completely rolled back!"); ++ console.log("✅ TEST 3 PASSED: Rollback on failed bulk actions verified!"); ++ } ++ else { ++ throw new Error("❌ TEST 3 FAILED: Milestone 1 was released despite transaction rollback!"); ++ } ++ console.log("\n======================================================"); ++ console.log("🎉 ALL TESTS PASSED SUCCESSFULLY!"); ++ console.log("======================================================\n"); ++ cleanupAndExit(0); ++ } ++ catch (err) { ++ console.error("\n❌ TESTS FAILED WITH EXCEPTION:\n", err); ++ cleanupAndExit(1); ++ } ++}); ++function cleanupAndExit(code) { ++ server.close(() => { ++ db_1.pool.end().then(() => { ++ process.exit(code); ++ }); ++ }); ++} +diff --git a/backend/dist/utils/tracing.js b/backend/dist/utils/tracing.js +new file mode 100644 +index 0000000..43c3071 +--- /dev/null ++++ b/backend/dist/utils/tracing.js +@@ -0,0 +1,226 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.logger = exports.traceStorage = void 0; ++exports.sanitizeHeaders = sanitizeHeaders; ++exports.sanitizeMeta = sanitizeMeta; ++exports.getTraceContext = getTraceContext; ++exports.tracingMiddleware = tracingMiddleware; ++const node_async_hooks_1 = require("node:async_hooks"); ++const node_crypto_1 = require("node:crypto"); ++// --------------------------------------------------------------------------- ++// Sensitive Header Configuration ++// --------------------------------------------------------------------------- ++// Headers whose values must NEVER appear in logs. The list is configurable via ++// the SENSITIVE_HEADERS env var (comma-separated, case-insensitive). Defaults ++// cover the most common secret-carrying headers in web APIs. ++// --------------------------------------------------------------------------- ++const DEFAULT_SENSITIVE_HEADERS = [ ++ "authorization", ++ "cookie", ++ "set-cookie", ++ "x-api-key", ++ "x-auth-token", ++ "x-secret", ++ "x-csrf-token", ++ "x-forwarded-authorization", ++ "proxy-authorization", ++ "x-access-token", ++ "x-refresh-token", ++ "x-session-token", ++ "x-judge-authority-secret", ++]; ++/** ++ * Build the runtime set of sensitive header names (lowercased) by merging ++ * defaults with any additional entries from `process.env.SENSITIVE_HEADERS`. ++ */ ++function buildSensitiveHeaderSet() { ++ const extra = (process.env.SENSITIVE_HEADERS || "") ++ .split(",") ++ .map((h) => h.trim().toLowerCase()) ++ .filter(Boolean); ++ return new Set([ ++ ...DEFAULT_SENSITIVE_HEADERS.map((h) => h.toLowerCase()), ++ ...extra, ++ ]); ++} ++const sensitiveHeaders = buildSensitiveHeaderSet(); ++// --------------------------------------------------------------------------- ++// Header Sanitization Utilities ++// --------------------------------------------------------------------------- ++/** Redaction placeholder used in place of secret values */ ++const REDACTED = "[REDACTED]"; ++/** ++ * Returns a sanitized copy of the raw headers object. Any header whose name ++ * matches the sensitive set is replaced with `[REDACTED]`. ++ * ++ * Matching is performed case-insensitively against the header name. ++ */ ++function sanitizeHeaders(rawHeaders) { ++ const sanitized = {}; ++ for (const [key, value] of Object.entries(rawHeaders)) { ++ if (value === undefined) ++ continue; ++ sanitized[key] = sensitiveHeaders.has(key.toLowerCase()) ? REDACTED : value; ++ } ++ return sanitized; ++} ++/** ++ * Deep-sanitize an arbitrary metadata object before it is serialised to logs. ++ * Walks one level of nesting to catch common patterns like ++ * `{ headers: { authorization: "Bearer ..." } }` or ++ * `{ token: "abc123" }`. ++ * ++ * Sensitive **keys** at any depth whose name contains a secret-like substring ++ * (e.g. "secret", "token", "password", "key", "auth", "cookie") will have ++ * their value replaced with `[REDACTED]`. ++ */ ++const SENSITIVE_KEY_PATTERN = /secret|password|passwd|token|apikey|api_key|auth|cookie|credential|private/i; ++function sanitizeMeta(meta) { ++ if (meta === null || meta === undefined) ++ return meta; ++ if (typeof meta !== "object") ++ return meta; ++ if (Array.isArray(meta)) ++ return meta.map(sanitizeMeta); ++ const cleaned = {}; ++ for (const [key, value] of Object.entries(meta)) { ++ // Direct key-name match → redact the entire value ++ if (SENSITIVE_KEY_PATTERN.test(key)) { ++ cleaned[key] = REDACTED; ++ continue; ++ } ++ // If the value is an object (e.g. `headers`) recurse one more level ++ if (value !== null && typeof value === "object" && !Array.isArray(value)) { ++ cleaned[key] = sanitizeMeta(value); ++ continue; ++ } ++ // String values that look like JWTs or Bearer tokens → redact ++ if (typeof value === "string" && isLikelySecret(value)) { ++ cleaned[key] = REDACTED; ++ continue; ++ } ++ cleaned[key] = value; ++ } ++ return cleaned; ++} ++/** ++ * Heuristic check: returns true when a string value looks like it could be a ++ * leaked secret (JWT, Bearer token, long hex string, base64 blob, etc.). ++ */ ++function isLikelySecret(value) { ++ // Bearer tokens ++ if (/^Bearer\s+/i.test(value)) ++ return true; ++ // JWTs (three dot-separated base64url segments) ++ if (/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(value) && value.length > 40) ++ return true; ++ return false; ++} ++/** Global AsyncLocalStorage for trace correlation */ ++exports.traceStorage = new node_async_hooks_1.AsyncLocalStorage(); ++/** Helper to get current trace context */ ++function getTraceContext() { ++ return exports.traceStorage.getStore(); ++} ++// --------------------------------------------------------------------------- ++// Structured Logging Framework ++// --------------------------------------------------------------------------- ++exports.logger = { ++ /** ++ * Format a log message, automatically stripping any sensitive data from ++ * the `meta` payload and from the trace context before serialization. ++ */ ++ formatMessage(level, message, meta) { ++ const context = getTraceContext(); ++ const timestamp = new Date().toISOString(); ++ // Deep-sanitize the metadata *before* it reaches any serialisation path ++ const safeMeta = meta ? sanitizeMeta(meta) : undefined; ++ const logData = { ++ timestamp, ++ level, ++ message, ++ requestId: context?.requestId, ++ userAddress: context?.userAddress, ++ ...sanitizeMeta(context), ++ ...safeMeta, ++ }; ++ // Remove duplicates or circular objects if any ++ delete logData.jobs; // prevent deep serialization of DB objects ++ if (process.env.NODE_ENV === "production") { ++ return JSON.stringify(logData); ++ } ++ else { ++ const colorMap = { ++ DEBUG: "\x1b[36m", // Cyan ++ INFO: "\x1b[32m", // Green ++ WARN: "\x1b[33m", // Yellow ++ ERROR: "\x1b[31m", // Red ++ }; ++ const reset = "\x1b[0m"; ++ const color = colorMap[level] || reset; ++ const reqIdStr = context?.requestId ? ` [reqId:${context.requestId.slice(0, 8)}]` : ""; ++ const metaStr = safeMeta && Object.keys(safeMeta).length > 0 ++ ? ` | meta: ${JSON.stringify(safeMeta)}` ++ : ""; ++ return `${color}[${timestamp}] [${level}]${reqIdStr}: ${message}${metaStr}${reset}`; ++ } ++ }, ++ debug(message, meta) { ++ if (process.env.NODE_ENV !== "production" || process.env.LOG_LEVEL === "debug") { ++ console.log(this.formatMessage("DEBUG", message, meta)); ++ } ++ }, ++ info(message, meta) { ++ console.log(this.formatMessage("INFO", message, meta)); ++ }, ++ warn(message, meta) { ++ console.warn(this.formatMessage("WARN", message, meta)); ++ }, ++ error(message, meta) { ++ console.error(this.formatMessage("ERROR", message, meta)); ++ }, ++}; ++// --------------------------------------------------------------------------- ++// Express Tracing Middleware ++// --------------------------------------------------------------------------- ++/** ++ * Express middleware that: ++ * 1. Generates / propagates a unique request ID for distributed tracing. ++ * 2. Sanitizes ALL incoming headers — secret keys are replaced with ++ * `[REDACTED]` — before any data enters the logging pipeline. ++ * 3. Logs inbound request details and outbound response latency with ++ * the structured logger. ++ */ ++function tracingMiddleware(req, res, next) { ++ const requestId = req.headers["x-request-id"] || (0, node_crypto_1.randomUUID)(); ++ const userAddress = req.headers["x-wallet-address"] || undefined; ++ res.setHeader("x-request-id", requestId); ++ // Build a sanitized snapshot of the request headers for diagnostic logging. ++ // The original `req.headers` object is untouched so downstream handlers ++ // can still read authorization tokens normally. ++ const safeHeaders = sanitizeHeaders(req.headers); ++ const context = { ++ requestId, ++ userAddress, ++ method: req.method, ++ url: req.originalUrl, ++ }; ++ exports.traceStorage.run(context, () => { ++ const startTime = process.hrtime(); ++ exports.logger.info(`Incoming Request: ${req.method} ${req.originalUrl}`, { ++ ip: req.ip, ++ userAgent: req.headers["user-agent"], ++ headers: safeHeaders, ++ }); ++ // Capture response completion to log latency ++ res.on("finish", () => { ++ const duration = process.hrtime(startTime); ++ const durationMs = (duration[0] * 1000 + duration[1] / 1000000).toFixed(2); ++ exports.logger.info(`Request Completed: ${req.method} ${req.originalUrl} - Status ${res.statusCode} in ${durationMs}ms`, { ++ statusCode: res.statusCode, ++ durationMs: parseFloat(durationMs), ++ }); ++ }); ++ next(); ++ }); ++} +diff --git a/backend/dist/utils/transaction.js b/backend/dist/utils/transaction.js +new file mode 100644 +index 0000000..9f1c190 +--- /dev/null ++++ b/backend/dist/utils/transaction.js +@@ -0,0 +1,82 @@ ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.runInTransaction = runInTransaction; ++const db_1 = require("../config/db"); ++const tracing_1 = require("./tracing"); ++/** ++ * Executes operations inside a highly resilient PostgreSQL transaction using Prisma. ++ * Implements auto-rollback on failures and intelligent retry mechanisms for transient errors (deadlocks, serialization failures). ++ * Fully instrumented via the global tracing framework. ++ */ ++async function runInTransaction(callback, options = {}) { ++ const isolationLevel = options.isolationLevel || "READ COMMITTED"; ++ const maxRetries = options.maxRetries !== undefined ? options.maxRetries : 3; ++ const baseDelayMs = options.baseDelayMs || 100; ++ const context = (0, tracing_1.getTraceContext)(); ++ let attempt = 0; ++ while (true) { ++ attempt++; ++ const startTime = process.hrtime(); ++ tracing_1.logger.info(`Starting transaction block: Attempt ${attempt}/${maxRetries + 1}`, { ++ isolationLevel, ++ attempt, ++ activeConnections: db_1.pool.totalCount, ++ idleConnections: db_1.pool.idleCount, ++ waitingRequests: db_1.pool.waitingCount, ++ }); ++ try { ++ // Execute transaction via Prisma Client ++ const result = await db_1.prisma.$transaction(async (tx) => { ++ // 1. Configure the transaction isolation level for SQL query plans ++ if (isolationLevel !== "READ COMMITTED") { ++ await tx.$executeRawUnsafe(`SET TRANSACTION ISOLATION LEVEL ${isolationLevel}`); ++ tracing_1.logger.debug(`Transaction isolation level elevated to ${isolationLevel}`); ++ } ++ // 2. Execute the caller's business database operations ++ return await callback(tx); ++ }, { ++ timeout: options.timeoutMs || 5000 // default 5 seconds transaction timeout ++ }); ++ const duration = process.hrtime(startTime); ++ const durationMs = (duration[0] * 1000 + duration[1] / 1000000).toFixed(2); ++ tracing_1.logger.info(`Transaction successfully committed on attempt ${attempt} in ${durationMs}ms`, { ++ attempts: attempt, ++ durationMs: parseFloat(durationMs), ++ }); ++ return result; ++ } ++ catch (error) { ++ const duration = process.hrtime(startTime); ++ const durationMs = (duration[0] * 1000 + duration[1] / 1000000).toFixed(2); ++ // Extract pg error code if present ++ const pgCode = error?.code || error?.meta?.code || error?.originalError?.code; ++ // PostgreSQL transient error codes: ++ // - 40001: serialization_failure (due to concurrent transaction conflicts) ++ // - 40P01: deadlock_detected (due to lock ordering issues under high concurrency) ++ const isTransient = pgCode === "40001" || pgCode === "40P01" || ++ (error?.message && (error.message.includes("40001") || error.message.includes("40P01") || error.message.includes("deadlock"))); ++ if (isTransient && attempt <= maxRetries) { ++ // Calculate exponential backoff with jitter to alleviate concurrency lock contention ++ const delay = Math.min(baseDelayMs * Math.pow(2, attempt) + Math.random() * 50, 1000); ++ tracing_1.logger.warn(`Transient transaction error encountered (code: ${pgCode || "deadlock"}). Rolling back and retrying in ${delay.toFixed(1)}ms. Attempt ${attempt}/${maxRetries}`, { ++ pgCode, ++ attempt, ++ delayMs: delay, ++ error: error.message || error, ++ }); ++ // Wait before next attempt ++ await new Promise((resolve) => setTimeout(resolve, delay)); ++ continue; ++ } ++ // Permanent error or retries exhausted: log explicit rollback diagnostics and propagate the exception ++ tracing_1.logger.error(`Transaction failed and rolled back on attempt ${attempt} (Duration: ${durationMs}ms). Error: ${error.message || error}`, { ++ pgCode, ++ attempt, ++ isTransient, ++ error: error.message || error, ++ stack: error.stack, ++ }); ++ throw error; ++ } ++ } ++} +diff --git a/backend/migrations/20260429000001_user_address_indexes.sql b/backend/migrations/20260429000001_user_address_indexes.sql +new file mode 100644 +index 0000000..090e7f5 +--- /dev/null ++++ b/backend/migrations/20260429000001_user_address_indexes.sql +@@ -0,0 +1,48 @@ ++-- Configure PostgreSQL Indexes on Sensitive User Address Mappings ++-- BE-API-085: Optimize queries on address fields for high concurrency and connection pooling ++ ++-- Index on profiles.address for fast profile lookups by wallet address ++CREATE INDEX IF NOT EXISTS idx_profiles_address ON profiles(address); ++ ++-- Index on saved_jobs.user_address for efficient user-saved job queries with pagination ++CREATE INDEX IF NOT EXISTS idx_saved_jobs_user_address ON saved_jobs(user_address, created_at DESC); ++ ++-- Composite index on activity_logs for address-based activity queries with timestamp ordering ++CREATE INDEX IF NOT EXISTS idx_activity_logs_user_address ON activity_logs(user_address, created_at DESC) ++WHERE user_address IS NOT NULL; ++ ++-- Index on sessions.address for efficient session lookup and cleanup ++CREATE INDEX IF NOT EXISTS idx_sessions_address_created ON sessions(address, expires_at DESC); ++ ++-- Index on arbiters.address for fast arbiter lookups ++CREATE INDEX IF NOT EXISTS idx_arbiters_address_active ON arbiters(address, active); ++ ++-- Composite index on jobs for efficient client/freelancer queries with sorting ++CREATE INDEX IF NOT EXISTS idx_jobs_client_address ON jobs(client_address, status, created_at DESC); ++CREATE INDEX IF NOT EXISTS idx_jobs_freelancer_address ON jobs(freelancer_address, status, created_at DESC) ++WHERE freelancer_address IS NOT NULL; ++ ++-- Index on bids for efficient freelancer bid queries ++CREATE INDEX IF NOT EXISTS idx_bids_freelancer_address ON bids(freelancer_address, created_at DESC); ++ ++-- Index on disputes for efficient dispute tracking by participant ++CREATE INDEX IF NOT EXISTS idx_disputes_opened_by ON disputes(opened_by, created_at DESC); ++ ++-- Partial index on transaction_queue for active transactions (excludes completed/failed) ++CREATE INDEX IF NOT EXISTS idx_transaction_queue_active ON transaction_queue(status, scheduled_at) ++WHERE status IN ('queued', 'processing', 'pending'); ++ ++-- Add constraint for connection pool validation (ensures addresses are non-empty when present) ++ALTER TABLE profiles ADD CONSTRAINT chk_profiles_address_not_empty CHECK (address != ''); ++ALTER TABLE saved_jobs ADD CONSTRAINT chk_saved_jobs_user_address_not_empty CHECK (user_address != ''); ++ ++-- VACUUM ANALYZE to update statistics after index creation ++VACUUM ANALYZE profiles; ++VACUUM ANALYZE saved_jobs; ++VACUUM ANALYZE activity_logs; ++VACUUM ANALYZE sessions; ++VACUUM ANALYZE arbiters; ++VACUUM ANALYZE jobs; ++VACUUM ANALYZE bids; ++VACUUM ANALYZE disputes; ++VACUUM ANALYZE transaction_queue; +diff --git a/backend/migrations/20260527000001_job_bulletin_pagination_indexes.sql b/backend/migrations/20260527000001_job_bulletin_pagination_indexes.sql +new file mode 100644 +index 0000000..0a26c9d +--- /dev/null ++++ b/backend/migrations/20260527000001_job_bulletin_pagination_indexes.sql +@@ -0,0 +1,18 @@ ++-- Adds optional bulletin search fields and indexes for cursor-paginated job listings. ++-- Existing jobs remain queryable because both columns are nullable/defaulted. ++ALTER TABLE jobs ++ ADD COLUMN IF NOT EXISTS skills TEXT[] NOT NULL DEFAULT '{}', ++ ADD COLUMN IF NOT EXISTS deadline_at TIMESTAMPTZ; ++ ++CREATE INDEX IF NOT EXISTS idx_jobs_created_id_desc ++ ON jobs (created_at DESC, id DESC); ++ ++CREATE INDEX IF NOT EXISTS idx_jobs_budget_created_id_desc ++ ON jobs (budget_usdc, created_at DESC, id DESC); ++ ++CREATE INDEX IF NOT EXISTS idx_jobs_deadline_at ++ ON jobs (deadline_at) ++ WHERE deadline_at IS NOT NULL; ++ ++CREATE INDEX IF NOT EXISTS idx_jobs_skills_gin ++ ON jobs USING GIN (skills); +diff --git a/backend/migrations/20260527000001_performance_indexes.sql b/backend/migrations/20260527000001_performance_indexes.sql +new file mode 100644 +index 0000000..47632e5 +--- /dev/null ++++ b/backend/migrations/20260527000001_performance_indexes.sql +@@ -0,0 +1,14 @@ ++-- Add high-concurrency database indexes to eliminate table scans and prevent lock contention ++ ++-- 1. Indexes on jobs table ++CREATE INDEX IF NOT EXISTS idx_jobs_client_address ON jobs(client_address); ++CREATE INDEX IF NOT EXISTS idx_jobs_freelancer_address ON jobs(freelancer_address); ++CREATE INDEX IF NOT EXISTS idx_jobs_status ON jobs(status); ++ ++-- 2. Indexes on bids table ++CREATE INDEX IF NOT EXISTS idx_bids_freelancer_address ON bids(freelancer_address); ++CREATE INDEX IF NOT EXISTS idx_bids_job_id ON bids(job_id); ++ ++-- 3. Indexes on activity_logs table ++CREATE INDEX IF NOT EXISTS idx_activity_logs_user_address ON activity_logs(user_address); ++CREATE INDEX IF NOT EXISTS idx_activity_logs_job_id ON activity_logs(job_id); +diff --git a/backend/migrations/20260527000002_write_recovery_records.sql b/backend/migrations/20260527000002_write_recovery_records.sql +new file mode 100644 +index 0000000..1ea9d83 +--- /dev/null ++++ b/backend/migrations/20260527000002_write_recovery_records.sql +@@ -0,0 +1,28 @@ ++-- Durable ledger for database writes that may be interrupted after the request is accepted. ++-- A pending/failed row gives operators and retry workers a stable idempotency key to inspect. ++CREATE TABLE IF NOT EXISTS write_recovery_records ( ++ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), ++ idempotency_key TEXT NOT NULL UNIQUE, ++ operation TEXT NOT NULL, ++ entity_type TEXT NOT NULL, ++ entity_id UUID, ++ status TEXT NOT NULL DEFAULT 'pending', ++ attempts INT NOT NULL DEFAULT 0, ++ last_error TEXT, ++ recovery_payload JSONB NOT NULL DEFAULT '{}'::jsonb, ++ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), ++ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), ++ CONSTRAINT write_recovery_status_check ++ CHECK (status IN ('pending', 'committed', 'failed', 'abandoned')) ++); ++ ++CREATE INDEX IF NOT EXISTS idx_write_recovery_status_updated ++ ON write_recovery_records (status, updated_at DESC, id DESC); ++ ++CREATE INDEX IF NOT EXISTS idx_write_recovery_entity ++ ON write_recovery_records (entity_type, entity_id) ++ WHERE entity_id IS NOT NULL; ++ ++CREATE TRIGGER write_recovery_records_updated_at ++ BEFORE UPDATE ON write_recovery_records ++ FOR EACH ROW EXECUTE FUNCTION set_updated_at(); +diff --git a/backend/package-lock.json b/backend/package-lock.json +index 9e5ac2b..df75af7 100644 +--- a/backend/package-lock.json ++++ b/backend/package-lock.json +@@ -54,8 +54,7 @@ + "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.4.1.tgz", + "integrity": "sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==", + "devOptional": true, +- "license": "Apache-2.0", +- "peer": true ++ "license": "Apache-2.0" + }, + "node_modules/@electric-sql/pglite-socket": { + "version": "0.1.1", +@@ -799,7 +798,6 @@ + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "license": "MIT", +- "peer": true, + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } +@@ -1477,7 +1475,8 @@ + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, +- "license": "MIT" ++ "license": "MIT", ++ "peer": true + }, + "node_modules/debug": { + "version": "4.4.3", +@@ -2185,7 +2184,6 @@ + "integrity": "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==", + "devOptional": true, + "license": "MIT", +- "peer": true, + "engines": { + "node": ">=16.9.0" + } +@@ -2933,7 +2931,6 @@ + "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", + "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", + "license": "MIT", +- "peer": true, + "dependencies": { + "pg-connection-string": "^2.13.0", + "pg-pool": "^3.14.0", +@@ -3121,7 +3118,6 @@ + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", +- "peer": true, + "dependencies": { + "@prisma/config": "7.8.0", + "@prisma/dev": "0.24.3", +@@ -3423,7 +3419,8 @@ + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "devOptional": true, +- "license": "MIT" ++ "license": "MIT", ++ "peer": true + }, + "node_modules/semver": { + "version": "7.8.0", +@@ -3882,7 +3879,6 @@ + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "devOptional": true, + "license": "Apache-2.0", +- "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" +diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma +index cee1686..21a66ef 100644 +--- a/backend/prisma/schema.prisma ++++ b/backend/prisma/schema.prisma +@@ -30,6 +30,8 @@ model activity_logs { + jobs jobs? @relation(fields: [job_id], references: [id], onUpdate: NoAction) + + @@index([created_at(sort: Desc)], map: "activity_logs_created_idx") ++ @@index([user_address], map: "idx_activity_logs_user_address") ++ @@index([job_id], map: "idx_activity_logs_job_id") + } + + model appeals { +@@ -90,6 +92,9 @@ model bids { + updated_at DateTime? @default(now()) @db.Timestamptz(6) + bid_status_transitions bid_status_transitions[] + jobs jobs @relation(fields: [job_id], references: [id], onDelete: Cascade, onUpdate: NoAction) ++ ++ @@index([freelancer_address], map: "idx_bids_freelancer_address") ++ @@index([job_id], map: "idx_bids_job_id") + } + + model deliverables { +@@ -194,6 +199,8 @@ model jobs { + status String @default("open") + metadata_hash String? + on_chain_job_id BigInt? ++ skills String[] @default([]) ++ deadline_at DateTime? @db.Timestamptz(6) + created_at DateTime @default(now()) @db.Timestamptz(6) + updated_at DateTime @default(now()) @db.Timestamptz(6) + activity_logs activity_logs[] +@@ -203,6 +210,10 @@ model jobs { + milestone_events milestone_events[] + milestone_records milestones[] + saved_jobs saved_jobs[] ++ ++ @@index([client_address], map: "idx_jobs_client_address") ++ @@index([freelancer_address], map: "idx_jobs_freelancer_address") ++ @@index([status], map: "idx_jobs_status") + } + + model milestone_events { +diff --git a/backend/src/config/db.ts b/backend/src/config/db.ts +index 8bf9c32..2d75277 100644 +--- a/backend/src/config/db.ts ++++ b/backend/src/config/db.ts +@@ -1,21 +1,269 @@ + import { PrismaClient } from "@prisma/client"; +-import { Pool } from "pg"; ++import { Pool, PoolClient } from "pg"; + import { PrismaPg } from "@prisma/adapter-pg"; + import dotenv from "dotenv"; ++import { trace } from "./tracing"; + + dotenv.config(); + + const connectionString = process.env.DATABASE_URL; +-const pool = new Pool({ connectionString }); ++ ++// --------------------------------------------------------------------------- ++// Pool configuration — tuneable via environment variables ++// --------------------------------------------------------------------------- ++const POOL_MAX = parseInt(process.env.POOL_MAX_CONNECTIONS || "20", 10); ++const POOL_MIN = parseInt(process.env.POOL_MIN_CONNECTIONS || "2", 10); ++const POOL_IDLE_TIMEOUT_MS = parseInt(process.env.POOL_IDLE_TIMEOUT_MS || "30000", 10); ++const POOL_CONNECTION_TIMEOUT_MS = parseInt(process.env.POOL_CONNECTION_TIMEOUT_MS || "5000", 10); ++const POOL_HEALTH_CHECK_INTERVAL_MS = parseInt(process.env.POOL_HEALTH_CHECK_INTERVAL_MS || "30000", 10); ++const POOL_CONNECT_RETRY_LIMIT = parseInt(process.env.POOL_CONNECT_RETRY_LIMIT || "3", 10); ++const POOL_CONNECT_RETRY_BASE_DELAY_MS = parseInt(process.env.POOL_CONNECT_RETRY_BASE_DELAY_MS || "500", 10); ++ ++// --------------------------------------------------------------------------- ++// Build the pool with resilient options ++// --------------------------------------------------------------------------- ++export const pool = new Pool({ ++ connectionString, ++ max: POOL_MAX, ++ min: POOL_MIN, ++ idleTimeoutMillis: POOL_IDLE_TIMEOUT_MS, ++ connectionTimeoutMillis: POOL_CONNECTION_TIMEOUT_MS, ++ allowExitOnIdle: false, // Keep the pool alive even when the event loop has no other work ++}); ++ ++// --------------------------------------------------------------------------- ++// Pool event listeners — structured logging for diagnostics ++// --------------------------------------------------------------------------- ++pool.on("connect", (client: PoolClient) => { ++ client ++ .query("SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED") ++ .catch((err) => { ++ console.error("[POOL] Failed to configure transaction isolation:", err.message); ++ }); ++ ++ if (process.env.NODE_ENV !== "production") { ++ console.log( ++ `[POOL] New client connected | total=${pool.totalCount} idle=${pool.idleCount} waiting=${pool.waitingCount}` ++ ); ++ } ++}); ++ ++pool.on("acquire", () => { ++ if (process.env.NODE_ENV !== "production") { ++ console.log( ++ `[POOL] Client acquired | total=${pool.totalCount} idle=${pool.idleCount} waiting=${pool.waitingCount}` ++ ); ++ } ++}); ++ ++pool.on("remove", () => { ++ if (process.env.NODE_ENV !== "production") { ++ console.log( ++ `[POOL] Client removed | total=${pool.totalCount} idle=${pool.idleCount} waiting=${pool.waitingCount}` ++ ); ++ } ++}); ++ ++pool.on("error", (err: Error) => { ++ console.error("[POOL] Unexpected pool error:", err.message); ++}); ++ ++// --------------------------------------------------------------------------- ++// Pool health statistics — exposed for the /api/v1/pool/health endpoint ++// --------------------------------------------------------------------------- ++export interface PoolHealthStats { ++ totalConnections: number; ++ idleConnections: number; ++ activeConnections: number; ++ waitingRequests: number; ++ maxConnections: number; ++ minConnections: number; ++ idleTimeoutMs: number; ++ connectionTimeoutMs: number; ++ healthCheckIntervalMs: number; ++ lastHealthCheckAt: string | null; ++ lastHealthCheckOk: boolean; ++ uptimeSeconds: number; ++ healthChecksPassed: number; ++ healthChecksFailed: number; ++} ++ ++let lastHealthCheckAt: Date | null = null; ++let lastHealthCheckOk = true; ++let healthChecksPassed = 0; ++let healthChecksFailed = 0; ++const poolStartedAt = Date.now(); ++ ++export function getPoolHealthStats(): PoolHealthStats { ++ return { ++ totalConnections: pool.totalCount, ++ idleConnections: pool.idleCount, ++ activeConnections: pool.totalCount - pool.idleCount, ++ waitingRequests: pool.waitingCount, ++ maxConnections: POOL_MAX, ++ minConnections: POOL_MIN, ++ idleTimeoutMs: POOL_IDLE_TIMEOUT_MS, ++ connectionTimeoutMs: POOL_CONNECTION_TIMEOUT_MS, ++ healthCheckIntervalMs: POOL_HEALTH_CHECK_INTERVAL_MS, ++ lastHealthCheckAt: lastHealthCheckAt ? lastHealthCheckAt.toISOString() : null, ++ lastHealthCheckOk, ++ uptimeSeconds: Math.floor((Date.now() - poolStartedAt) / 1000), ++ healthChecksPassed, ++ healthChecksFailed, ++ }; ++} ++ ++// --------------------------------------------------------------------------- ++// Background health-check — validates an idle connection periodically ++// --------------------------------------------------------------------------- ++let healthCheckTimer: ReturnType | null = null; ++ ++async function runPoolHealthCheck(): Promise { ++ let client: PoolClient | undefined; ++ try { ++ client = await pool.connect(); ++ await client.query("SELECT 1"); ++ lastHealthCheckOk = true; ++ healthChecksPassed++; ++ } catch (err: any) { ++ lastHealthCheckOk = false; ++ healthChecksFailed++; ++ console.error("[POOL HEALTH] Background health-check failed:", err.message); ++ } finally { ++ lastHealthCheckAt = new Date(); ++ if (client) { ++ client.release(); ++ } ++ } ++} ++ ++export function startPoolHealthCheck(): void { ++ if (healthCheckTimer) return; // already running ++ // Run once immediately then on an interval ++ runPoolHealthCheck(); ++ healthCheckTimer = setInterval(runPoolHealthCheck, POOL_HEALTH_CHECK_INTERVAL_MS); ++ // Allow the process to exit even if the timer is still active ++ if (healthCheckTimer && typeof healthCheckTimer === "object" && "unref" in healthCheckTimer) { ++ healthCheckTimer.unref(); ++ } ++ console.log( ++ `[POOL HEALTH] Background health-check started (interval: ${POOL_HEALTH_CHECK_INTERVAL_MS}ms)` ++ ); ++} ++ ++export function stopPoolHealthCheck(): void { ++ if (healthCheckTimer) { ++ clearInterval(healthCheckTimer); ++ healthCheckTimer = null; ++ } ++} ++ ++// --------------------------------------------------------------------------- ++// connectWithRetry — Wraps initial connection with exponential backoff so the ++// API doesn't crash on cold-start if the database is momentarily unavailable. ++// --------------------------------------------------------------------------- ++export async function connectWithRetry(): Promise { ++ for (let attempt = 1; attempt <= POOL_CONNECT_RETRY_LIMIT; attempt++) { ++ try { ++ const client = await pool.connect(); ++ await client.query("SELECT 1"); ++ client.release(); ++ console.log(`[POOL] Database connected successfully on attempt ${attempt}`); ++ return; ++ } catch (err: any) { ++ const delay = Math.min( ++ POOL_CONNECT_RETRY_BASE_DELAY_MS * Math.pow(2, attempt - 1) + Math.random() * 100, ++ 5000 ++ ); ++ console.error( ++ `[POOL] Connection attempt ${attempt}/${POOL_CONNECT_RETRY_LIMIT} failed: ${err.message}. ` + ++ `Retrying in ${delay.toFixed(0)}ms...` ++ ); ++ if (attempt === POOL_CONNECT_RETRY_LIMIT) { ++ throw new Error( ++ `Failed to connect to the database after ${POOL_CONNECT_RETRY_LIMIT} attempts: ${err.message}` ++ ); ++ } ++ await new Promise((resolve) => setTimeout(resolve, delay)); ++ } ++ } ++} ++ ++// --------------------------------------------------------------------------- ++// Prisma Client with the pg pool adapter ++// --------------------------------------------------------------------------- + const adapter = new PrismaPg(pool); + +-const globalForPrisma = global as unknown as { prisma: PrismaClient }; ++const globalForPrisma = global as unknown as { prisma: ReturnType }; + +-export const prisma = +- globalForPrisma.prisma || +- new PrismaClient({ ++function createPrismaClient() { ++ const client = new PrismaClient({ + adapter, + log: process.env.NODE_ENV === "development" ? ["query", "error", "warn"] : ["error"], + }); + ++ return client.$extends({ ++ query: { ++ $allModels: { ++ async $allOperations({ model, operation, args, query }) { ++ const startTime = Date.now(); ++ const logger = trace.getLogger("db-query"); ++ ++ try { ++ const result = await query(args); ++ const duration = Date.now() - startTime; ++ ++ if (duration > 1000) { ++ logger.warn(`Slow query detected: ${model}.${operation}`, { ++ duration, ++ model, ++ action: operation, ++ args: JSON.stringify(args).substring(0, 200), ++ }); ++ } ++ ++ logger.debug(`Query completed: ${model}.${operation}`, { ++ duration, ++ model, ++ action: operation, ++ }); ++ ++ return result; ++ } catch (error) { ++ const duration = Date.now() - startTime; ++ logger.error(`Query failed: ${model}.${operation}`, { ++ duration, ++ model, ++ action: operation, ++ error: error instanceof Error ? error.message : String(error), ++ }); ++ throw error; ++ } ++ }, ++ }, ++ }, ++ }); ++} ++ ++export const prisma = globalForPrisma.prisma || createPrismaClient(); ++ + if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma; ++ ++// --------------------------------------------------------------------------- ++// Graceful shutdown — release pool connections on process exit signals ++// --------------------------------------------------------------------------- ++async function gracefulShutdown(signal: string): Promise { ++ console.log(`[POOL] Received ${signal}. Draining connection pool...`); ++ stopPoolHealthCheck(); ++ try { ++ await prisma.$disconnect(); ++ await pool.end(); ++ console.log("[POOL] Connection pool drained successfully."); ++ } catch (err: any) { ++ console.error("[POOL] Error during pool shutdown:", err.message); ++ } ++ process.exit(0); ++} ++ ++process.on("SIGTERM", () => gracefulShutdown("SIGTERM")); ++process.on("SIGINT", () => gracefulShutdown("SIGINT")); +diff --git a/backend/src/config/tracing.ts b/backend/src/config/tracing.ts +new file mode 100644 +index 0000000..6963d4d +--- /dev/null ++++ b/backend/src/config/tracing.ts +@@ -0,0 +1,99 @@ ++// Tracing and logging instrumentation for diagnostic visibility ++// Provides structured logging context for all backend operations ++ ++interface LogEntry { ++ timestamp: string; ++ level: string; ++ message: string; ++ context?: Record; ++ [key: string]: any; ++} ++ ++interface Logger { ++ debug(message: string, context?: Record): void; ++ info(message: string, context?: Record): void; ++ warn(message: string, context?: Record): void; ++ error(message: string, context?: Record): void; ++} ++ ++class TraceLogger implements Logger { ++ private name: string; ++ ++ constructor(name: string) { ++ this.name = name; ++ } ++ ++ private log(level: string, message: string, context?: Record) { ++ const entry: LogEntry = { ++ timestamp: new Date().toISOString(), ++ level, ++ message, ++ logger: this.name, ++ ...context, ++ }; ++ ++ if (process.env.LOG_FORMAT === "json") { ++ console.log(JSON.stringify(entry)); ++ } else { ++ const contextStr = context ? ` ${JSON.stringify(context)}` : ""; ++ console.log(`[${entry.timestamp}] [${level}] [${this.name}] ${message}${contextStr}`); ++ } ++ } ++ ++ debug(message: string, context?: Record) { ++ if (process.env.LOG_LEVEL === "debug" || process.env.NODE_ENV === "development") { ++ this.log("DEBUG", message, context); ++ } ++ } ++ ++ info(message: string, context?: Record) { ++ this.log("INFO", message, context); ++ } ++ ++ warn(message: string, context?: Record) { ++ this.log("WARN", message, context); ++ } ++ ++ error(message: string, context?: Record) { ++ this.log("ERROR", message, context); ++ } ++} ++ ++class TraceContext { ++ private contextMap: Map = new Map(); ++ ++ active(): Record { ++ return Object.fromEntries(this.contextMap); ++ } ++ ++ set(key: string, value: any) { ++ this.contextMap.set(key, value); ++ } ++ ++ get(key: string) { ++ return this.contextMap.get(key); ++ } ++ ++ clear() { ++ this.contextMap.clear(); ++ } ++} ++ ++class Trace { ++ private loggers: Map = new Map(); ++ private readonly context: TraceContext = new TraceContext(); ++ ++ getLogger(name: string): Logger { ++ if (!this.loggers.has(name)) { ++ this.loggers.set(name, new TraceLogger(name)); ++ } ++ return this.loggers.get(name)!; ++ } ++ ++ getContext(): TraceContext { ++ return this.context; ++ } ++} ++ ++export const trace = new Trace(); ++export const context = trace.getContext(); +diff --git a/backend/src/index.ts b/backend/src/index.ts +index 30e2f9b..0612756 100644 +--- a/backend/src/index.ts ++++ b/backend/src/index.ts +@@ -1,7 +1,10 @@ + import express, { Express, Request, Response } from "express"; + import cors from "cors"; + import dotenv from "dotenv"; +-import { prisma } from "./config/db"; ++import { prisma, connectWithRetry, startPoolHealthCheck } from "./config/db"; ++import { trace } from "./config/tracing"; ++import { intakeRateLimit } from "./middleware/intakeRateLimit"; ++import { tracingMiddleware } from "./utils/tracing"; + import authRoutes from "./routes/auth"; + import jobsRoutes from "./routes/jobs"; + import disputesRoutes from "./routes/disputes"; +@@ -9,15 +12,43 @@ import appealsRoutes from "./routes/appeals"; + import usersRoutes from "./routes/users"; + import activityRoutes from "./routes/activity"; + import uploadsRoutes from "./routes/uploads"; ++import bulkRoutes from "./routes/bulk"; ++import poolRoutes from "./routes/pool"; ++import stateRoutes from "./routes/state"; + + dotenv.config(); + + const app: Express = express(); + const port = process.env.PORT || 3001; ++const logger = trace.getLogger("server"); + + // Enable CORS for frontend requests + app.use(cors({ origin: "*" })); + app.use(express.json()); ++app.use(tracingMiddleware); // Global request tracing and diagnostics ++app.use(intakeRateLimit); ++ ++// Request logging middleware with tracing ++app.use((req: Request, res: Response, next) => { ++ const startTime = Date.now(); ++ const requestLogger = trace.getLogger(`http-${req.method}`); ++ ++ res.on("finish", () => { ++ const duration = Date.now() - startTime; ++ const status = res.statusCode; ++ const statusCategory = status < 400 ? "success" : status < 500 ? "client_error" : "server_error"; ++ ++ requestLogger.info(`${req.method} ${req.path}`, { ++ method: req.method, ++ path: req.path, ++ status, ++ duration, ++ statusCategory, ++ }); ++ }); ++ ++ next(); ++}); + + // Mount API routes + app.use("/api/v1/auth", authRoutes); +@@ -27,18 +58,78 @@ app.use("/api/v1/appeals", appealsRoutes); + app.use("/api/v1/users", usersRoutes); + app.use("/api/v1/activity", activityRoutes); + app.use("/api/v1/uploads", uploadsRoutes); ++app.use("/api/v1/bulk", bulkRoutes); ++app.use("/api/v1/pool", poolRoutes); ++app.use("/api/v1/state", stateRoutes); + +-// Basic healthcheck route ++// Health check endpoint with database connectivity verification + app.get("/health", async (req: Request, res: Response) => { ++ const startTime = Date.now(); ++ logger.debug("Health check requested"); ++ + try { + // Ping DB to ensure it's alive + await prisma.$queryRaw`SELECT 1`; +- res.status(200).json({ status: "ok", db: "connected" }); ++ const duration = Date.now() - startTime; ++ ++ logger.info("Health check passed", { ++ status: "ok", ++ db: "connected", ++ duration, ++ }); ++ ++ res.status(200).json({ ++ status: "ok", ++ db: "connected", ++ timestamp: new Date().toISOString(), ++ uptime: process.uptime(), ++ }); + } catch (error) { +- res.status(503).json({ status: "error", db: "disconnected" }); ++ const duration = Date.now() - startTime; ++ logger.error("Health check failed", { ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); ++ ++ res.status(503).json({ ++ status: "error", ++ db: "disconnected", ++ error: error instanceof Error ? error.message : "Unknown error", ++ timestamp: new Date().toISOString(), ++ }); + } + }); + +-app.listen(port, () => { +- console.log(`⚡️[server]: Server is running at http://localhost:${port}`); ++// Graceful shutdown handler ++process.on("SIGTERM", async () => { ++ logger.info("SIGTERM received, shutting down gracefully"); ++ try { ++ await prisma.$disconnect(); ++ logger.info("Database connection closed"); ++ process.exit(0); ++ } catch (error) { ++ logger.error("Error during shutdown", { ++ error: error instanceof Error ? error.message : String(error), ++ }); ++ process.exit(1); ++ } + }); ++ ++// --------------------------------------------------------------------------- ++// Start the server — validate the DB connection with retry backoff first, ++// then kick off background pool health-checking. ++// --------------------------------------------------------------------------- ++async function bootstrap(): Promise { ++ try { ++ await connectWithRetry(); ++ startPoolHealthCheck(); ++ app.listen(port, () => { ++ console.log(`⚡️[server]: Server is running at http://localhost:${port}`); ++ }); ++ } catch (err: any) { ++ console.error(`❌ Failed to start server: ${err.message}`); ++ process.exit(1); ++ } ++} ++ ++bootstrap(); +diff --git a/backend/src/middleware/intakeRateLimit.ts b/backend/src/middleware/intakeRateLimit.ts +new file mode 100644 +index 0000000..85f48b2 +--- /dev/null ++++ b/backend/src/middleware/intakeRateLimit.ts +@@ -0,0 +1,127 @@ ++import { Request, Response, NextFunction } from "express"; ++import { getPoolHealthStats } from "../config/db"; ++import { logger } from "../utils/tracing"; ++ ++interface Bucket { ++ tokens: number; ++ lastMs: number; ++} ++ ++const buckets = new Map(); ++ ++function envInt(key: string, fallback: number): number { ++ const v = process.env[key]; ++ if (!v) return fallback; ++ const n = parseInt(v, 10); ++ return Number.isFinite(n) && n > 0 ? n : fallback; ++} ++ ++/** Shrink the per-minute quota when the pg pool is under pressure. */ ++export function effectiveRpm(): number { ++ const base = envInt("RATE_LIMIT_RPM", 60); ++ const floor = envInt("RATE_LIMIT_MIN_RPM", 15); ++ const stats = getPoolHealthStats(); ++ const max = Math.max(stats.maxConnections, 1); ++ const activeRatio = stats.activeConnections / max; ++ const waitPenalty = stats.waitingRequests > 0 ? 0.35 + Math.min(0.35, stats.waitingRequests / 8) : 0; ++ const pressure = Math.min(0.85, activeRatio * 0.45 + waitPenalty); ++ return Math.max(floor, Math.floor(base * (1 - pressure))); ++} ++ ++function burstCap(rpm: number): number { ++ const burst = envInt("RATE_LIMIT_BURST", 10); ++ return rpm + burst; ++} ++ ++function takeToken(key: string): { ok: true } | { ok: false; retryAfter: number } { ++ const rpm = effectiveRpm(); ++ const cap = burstCap(rpm); ++ const refillPerMs = rpm / 60_000; ++ const now = Date.now(); ++ ++ let bucket = buckets.get(key); ++ if (!bucket) { ++ bucket = { tokens: cap, lastMs: now }; ++ buckets.set(key, bucket); ++ } ++ ++ const elapsed = now - bucket.lastMs; ++ bucket.tokens = Math.min(cap, bucket.tokens + elapsed * refillPerMs); ++ bucket.lastMs = now; ++ ++ if (bucket.tokens < 1) { ++ const retryAfter = Math.max(1, Math.ceil((1 - bucket.tokens) / refillPerMs / 1000)); ++ return { ok: false, retryAfter }; ++ } ++ ++ bucket.tokens -= 1; ++ return { ok: true }; ++} ++ ++export function clientIp(req: Request): string { ++ const forwarded = req.headers["x-forwarded-for"]; ++ if (typeof forwarded === "string" && forwarded.length > 0) { ++ const first = forwarded.split(",")[0]?.trim(); ++ if (first) return first; ++ } ++ return req.ip || req.socket.remoteAddress || "127.0.0.1"; ++} ++ ++/** Unauthenticated write paths that accept external submissions. */ ++export function isPublicIntakeRoute(req: Request): boolean { ++ if (req.method !== "POST") return false; ++ const path = req.originalUrl.split("?")[0] ?? req.path; ++ ++ if (path.startsWith("/api/v1/auth")) return true; ++ if (path === "/api/v1/jobs" || path === "/api/v1/jobs/") return true; ++ if (/^\/api\/v1\/jobs\/[^/]+\/bids\/?$/.test(path)) return true; ++ if (path.startsWith("/api/v1/uploads")) return true; ++ if (path.startsWith("/api/v1/bulk")) return true; ++ ++ return false; ++} ++ ++export function intakeRateLimit(req: Request, res: Response, next: NextFunction): void { ++ if (!isPublicIntakeRoute(req)) { ++ next(); ++ return; ++ } ++ ++ const key = clientIp(req); ++ const result = takeToken(key); ++ ++ if (result.ok) { ++ next(); ++ return; ++ } ++ ++ const rpm = effectiveRpm(); ++ logger.warn("Public intake rate limit exceeded", { ++ ip: key, ++ path: req.originalUrl, ++ retryAfterSeconds: result.retryAfter, ++ effectiveRpm: rpm, ++ }); ++ ++ res.setHeader("Retry-After", String(result.retryAfter)); ++ res.status(429).json({ ++ error: "rate limit exceeded", ++ retry_after_seconds: result.retryAfter, ++ }); ++} ++ ++// Drop idle buckets so long-running processes do not grow memory without bound. ++const pruneMs = 10 * 60 * 1000; ++const pruneTimer = setInterval(() => { ++ const cutoff = Date.now() - pruneMs; ++ for (const [key, bucket] of buckets) { ++ if (bucket.lastMs < cutoff) buckets.delete(key); ++ } ++}, 60_000); ++if (typeof pruneTimer === "object" && "unref" in pruneTimer) { ++ pruneTimer.unref(); ++} ++ ++export function intakeBucketCount(): number { ++ return buckets.size; ++} +diff --git a/backend/src/routes/bulk.ts b/backend/src/routes/bulk.ts +new file mode 100644 +index 0000000..62e440d +--- /dev/null ++++ b/backend/src/routes/bulk.ts +@@ -0,0 +1,236 @@ ++import { Router, Request, Response } from "express"; ++import { z } from "zod"; ++import { runInTransaction } from "../utils/transaction"; ++import { logger } from "../utils/tracing"; ++ ++const router = Router(); ++ ++// Validation Schemas ++const singleJobSchema = z.object({ ++ title: z.string().min(1, "Title is required"), ++ description: z.string().optional().default(""), ++ budget_usdc: z.number().int().positive("Budget must be greater than zero"), ++ milestones: z.number().int().min(1, "Milestones count must be at least 1"), ++ client_address: z.string().min(1, "Client address is required"), ++}); ++ ++const bulkJobsSchema = z.object({ ++ jobs: z.array(singleJobSchema).min(1, "At least one job is required for bulk creation"), ++}); ++ ++const singleReleaseSchema = z.object({ ++ jobId: z.string().uuid("Invalid jobId UUID format"), ++ milestoneId: z.string().uuid("Invalid milestoneId UUID format"), ++}); ++ ++const bulkReleaseSchema = z.object({ ++ releases: z.array(singleReleaseSchema).min(1, "At least one milestone release request is required"), ++}); ++ ++/** ++ * POST /api/v1/bulk/jobs ++ * Atomically creates multiple jobs, each with its respective milestones. ++ * If any validation or creation step fails, the ENTIRE batch is rolled back. ++ */ ++router.post("/jobs", async (req: Request, res: Response) => { ++ try { ++ // 1. Validate bulk request format ++ const parsed = bulkJobsSchema.parse(req.body); ++ logger.info(`Starting bulk job creation for ${parsed.jobs.length} jobs`); ++ ++ // 2. Execute within an atomic repeatable read transaction to guarantee lock isolation ++ const createdJobs = await runInTransaction(async (tx) => { ++ const results = []; ++ ++ for (let i = 0; i < parsed.jobs.length; i++) { ++ const data = parsed.jobs[i]; ++ logger.debug(`Processing bulk creation for job index ${i}: "${data.title}"`); ++ ++ // Create parent Job record ++ const job = await tx.jobs.create({ ++ data: { ++ title: data.title, ++ description: data.description, ++ budget_usdc: BigInt(data.budget_usdc), ++ milestones: data.milestones, ++ client_address: data.client_address, ++ status: "open", ++ }, ++ }); ++ ++ // Compute milestone allocations ++ const perMilestone = Math.floor(data.budget_usdc / data.milestones); ++ const remainder = data.budget_usdc % data.milestones; ++ ++ const milestoneRecords = Array.from({ length: data.milestones }).map((_, index) => { ++ const amount_usdc = index === data.milestones - 1 ? perMilestone + remainder : perMilestone; ++ return { ++ job_id: job.id, ++ index: index + 1, ++ title: `Milestone ${index + 1} of ${data.milestones}`, ++ amount_usdc: BigInt(amount_usdc), ++ status: "pending", ++ }; ++ }); ++ ++ // Create child Milestone records ++ await tx.milestones.createMany({ ++ data: milestoneRecords, ++ }); ++ ++ // Fetch back milestones for serializable return ++ const dbMilestones = await tx.milestones.findMany({ ++ where: { job_id: job.id }, ++ orderBy: { index: "asc" }, ++ }); ++ ++ results.push({ ++ ...job, ++ budget_usdc: Number(job.budget_usdc), ++ on_chain_job_id: job.on_chain_job_id ? Number(job.on_chain_job_id) : null, ++ milestones: dbMilestones.map((m: any) => ({ ++ ...m, ++ amount_usdc: Number(m.amount_usdc), ++ })), ++ }); ++ } ++ ++ return results; ++ }, { isolationLevel: "REPEATABLE READ" }); ++ ++ res.status(201).json({ ++ success: true, ++ message: `Successfully created ${createdJobs.length} jobs atomically`, ++ jobs: createdJobs, ++ }); ++ } catch (error: any) { ++ if (error instanceof z.ZodError) { ++ return res.status(400).json({ ++ success: false, ++ error: "Validation failed", ++ issues: error.issues, ++ }); ++ } ++ ++ logger.error(`Bulk job creation aborted and rolled back. Error: ${error.message || error}`); ++ res.status(500).json({ ++ success: false, ++ error: "Transaction rolled back due to error", ++ details: error.message || error, ++ }); ++ } ++}); ++ ++/** ++ * POST /api/v1/bulk/milestones/release ++ * Atomically releases multiple milestones, updates their respective parent jobs, ++ * and records auditing milestone events. ++ * Strictly rolls back if any individual release requirement (e.g. missing deliverable) fails. ++ */ ++router.post("/milestones/release", async (req: Request, res: Response) => { ++ try { ++ const parsed = bulkReleaseSchema.parse(req.body); ++ logger.info(`Starting bulk milestone release for ${parsed.releases.length} milestones`); ++ ++ const releaseResults = await runInTransaction(async (tx) => { ++ const results = []; ++ ++ for (let i = 0; i < parsed.releases.length; i++) { ++ const { jobId, milestoneId } = parsed.releases[i]; ++ logger.debug(`Verifying and releasing milestone ID ${milestoneId} for Job ${jobId}`); ++ ++ // Find existing milestone ++ const milestone = await tx.milestones.findUnique({ ++ where: { id: milestoneId, job_id: jobId }, ++ }); ++ ++ if (!milestone) { ++ throw new Error(`Milestone ID ${milestoneId} was not found under Job ID ${jobId}`); ++ } ++ ++ if (milestone.status !== "pending") { ++ throw new Error(`Milestone ID ${milestoneId} cannot be released because its status is '${milestone.status}' (expected 'pending')`); ++ } ++ ++ // Verify milestone deliverable is submitted ++ const deliverableExists = await tx.deliverables.findFirst({ ++ where: { job_id: jobId, milestone_index: milestone.index }, ++ }); ++ ++ if (!deliverableExists) { ++ throw new Error(`A deliverable must be submitted for Milestone index ${milestone.index} under Job ID ${jobId} before releasing it`); ++ } ++ ++ const txHash = `mock-bulk-release-tx-${milestoneId.slice(0, 8)}`; ++ ++ // Update Milestone Status ++ const updatedMilestone = await tx.milestones.update({ ++ where: { id: milestoneId }, ++ data: { ++ status: "released", ++ tx_hash: txHash, ++ released_at: new Date(), ++ completed_at: new Date(), ++ }, ++ }); ++ ++ // Create Milestone Audit Event ++ await tx.milestone_events.create({ ++ data: { ++ milestone_id: milestoneId, ++ job_id: jobId, ++ event_type: "released", ++ tx_hash: txHash, ++ note: "Released atomically via bulk operation", ++ }, ++ }); ++ ++ // Recalculate remaining pending milestones ++ const remainingPending = await tx.milestones.count({ ++ where: { job_id: jobId, status: "pending" }, ++ }); ++ ++ const nextJobStatus = remainingPending === 0 ? "completed" : "funded"; ++ ++ // Update Job Status ++ const updatedJob = await tx.jobs.update({ ++ where: { id: jobId }, ++ data: { status: nextJobStatus }, ++ }); ++ ++ results.push({ ++ milestoneId, ++ jobId, ++ status: "released", ++ jobStatus: nextJobStatus, ++ amount_usdc: Number(updatedMilestone.amount_usdc), ++ }); ++ } ++ ++ return results; ++ }, { isolationLevel: "SERIALIZABLE" }); // Use Serializable isolation to prevent double-release race conditions ++ ++ res.status(200).json({ ++ success: true, ++ message: `Successfully released ${releaseResults.length} milestones atomically`, ++ releases: releaseResults, ++ }); ++ } catch (error: any) { ++ if (error instanceof z.ZodError) { ++ return res.status(400).json({ ++ success: false, ++ error: "Validation failed", ++ issues: error.issues, ++ }); ++ } ++ ++ logger.error(`Bulk milestone release aborted and rolled back. Error: ${error.message || error}`); ++ res.status(500).json({ ++ success: false, ++ error: "Transaction rolled back due to error", ++ details: error.message || error, ++ }); ++ } ++}); ++ ++export default router; +diff --git a/backend/src/routes/diagnostics.ts b/backend/src/routes/diagnostics.ts +new file mode 100644 +index 0000000..0f92a6c +--- /dev/null ++++ b/backend/src/routes/diagnostics.ts +@@ -0,0 +1,90 @@ ++import { Router, Request, Response } from "express"; ++import { sanitizeHeaders, sanitizeMeta, logger } from "../utils/tracing"; ++import { pool } from "../config/db"; ++ ++const router = Router(); ++ ++/** ++ * GET /api/v1/diagnostics/request-info ++ * ++ * Returns sanitized request diagnostics for the current request. ++ * Sensitive headers (authorization, cookies, API keys, tokens, etc.) ++ * are automatically redacted so this endpoint is safe to expose to ++ * monitoring dashboards and log aggregators. ++ */ ++router.get("/request-info", async (req: Request, res: Response) => { ++ try { ++ const safeHeaders = sanitizeHeaders( ++ req.headers as Record ++ ); ++ ++ logger.info("Diagnostics: request-info endpoint accessed", { ++ method: req.method, ++ url: req.originalUrl, ++ }); ++ ++ res.status(200).json({ ++ request: { ++ method: req.method, ++ url: req.originalUrl, ++ path: req.path, ++ protocol: req.protocol, ++ ip: req.ip, ++ hostname: req.hostname, ++ headers: safeHeaders, ++ query: req.query, ++ }, ++ server: { ++ nodeVersion: process.version, ++ platform: process.platform, ++ uptime: Math.floor(process.uptime()), ++ memoryUsage: { ++ rss: Math.round(process.memoryUsage().rss / 1024 / 1024), ++ heapUsed: Math.round(process.memoryUsage().heapUsed / 1024 / 1024), ++ heapTotal: Math.round(process.memoryUsage().heapTotal / 1024 / 1024), ++ external: Math.round(process.memoryUsage().external / 1024 / 1024), ++ }, ++ }, ++ pool: { ++ totalConnections: pool.totalCount, ++ idleConnections: pool.idleCount, ++ waitingRequests: pool.waitingCount, ++ }, ++ }); ++ } catch (error: any) { ++ logger.error("Diagnostics: request-info error", { error: error.message }); ++ res.status(500).json({ error: "Failed to retrieve diagnostics" }); ++ } ++}); ++ ++/** ++ * POST /api/v1/diagnostics/sanitize-test ++ * ++ * Accepts an arbitrary JSON body and returns the sanitized version. ++ * Useful for verifying that the sanitization rules are correctly ++ * stripping secrets from structured payloads before they reach logs. ++ * ++ * Example request body: ++ * { ++ * "authorization": "Bearer eyJhbG...", ++ * "user": "alice", ++ * "nested": { "password": "s3cret", "data": 42 } ++ * } ++ */ ++router.post("/sanitize-test", async (req: Request, res: Response) => { ++ try { ++ const sanitized = sanitizeMeta(req.body); ++ ++ logger.debug("Diagnostics: sanitize-test endpoint invoked"); ++ ++ res.status(200).json({ ++ original_keys: Object.keys(req.body || {}), ++ sanitized, ++ }); ++ } catch (error: any) { ++ logger.error("Diagnostics: sanitize-test error", { error: error.message }); ++ res.status(500).json({ error: "Failed to sanitize payload" }); ++ } ++}); ++ ++export default router; +diff --git a/backend/src/routes/jobs.ts b/backend/src/routes/jobs.ts +index 6a8bf59..d8292b8 100644 +--- a/backend/src/routes/jobs.ts ++++ b/backend/src/routes/jobs.ts +@@ -1,10 +1,11 @@ + import { Router, Request, Response } from "express"; +-import { prisma } from "../config/db"; ++import { pool, prisma } from "../config/db"; + import { z } from "zod"; + import bidsRoutes from "./bids"; + import milestonesRoutes from "./milestones"; + import deliverablesRoutes from "./deliverables"; + import jobDisputesRoutes from "./job-disputes"; ++import { logger } from "../utils/tracing"; + + const router = Router(); + +@@ -14,6 +15,13 @@ const getJobsQuerySchema = z.object({ + status: z.string().optional(), + tag: z.string().optional(), + sort: z.string().optional(), ++ limit: z.coerce.number().int().min(1).max(100).default(25), ++ cursor_created_at: z.coerce.date().optional(), ++ cursor_id: z.string().uuid().optional(), ++ min_budget: z.coerce.number().int().nonnegative().optional(), ++ max_budget: z.coerce.number().int().nonnegative().optional(), ++ skills: z.string().optional(), ++ deadline_before: z.coerce.date().optional(), + }); + + const createJobSchema = z.object({ +@@ -22,49 +30,121 @@ const createJobSchema = z.object({ + budget_usdc: z.number().int().positive("budget must be greater than zero"), + milestones: z.number().int().min(1, "milestones must be at least 1"), + client_address: z.string().min(1), ++ skills: z.array(z.string()).optional().default([]), ++ deadline_at: z.coerce.date().optional(), + }); + + const markFundedSchema = z.object({ + client_address: z.string().min(1), + }); + ++function serializeJob(row: any) { ++ return { ++ ...row, ++ budget_usdc: Number(row.budget_usdc), ++ on_chain_job_id: row.on_chain_job_id ? Number(row.on_chain_job_id) : null, ++ }; ++} ++ + // GET /api/v1/jobs + router.get("/", async (req: Request, res: Response) => { + try { + const query = getJobsQuerySchema.parse(req.query); + +- let whereClause: any = {}; ++ if ((query.cursor_created_at && !query.cursor_id) || (!query.cursor_created_at && query.cursor_id)) { ++ return res.status(400).json({ ++ error: "cursor_created_at and cursor_id must be provided together", ++ }); ++ } ++ ++ if ( ++ query.min_budget !== undefined && ++ query.max_budget !== undefined && ++ query.min_budget > query.max_budget ++ ) { ++ return res.status(400).json({ error: "min_budget cannot be greater than max_budget" }); ++ } ++ ++ const conditions: string[] = []; ++ const params: any[] = []; ++ const addParam = (value: any): string => { ++ params.push(value); ++ return `$${params.length}`; ++ }; + + if (query.query || (query.tag && query.tag !== "all")) { + const searchTerm = query.query || query.tag; +- whereClause.OR = [ +- { title: { contains: searchTerm, mode: "insensitive" } }, +- { description: { contains: searchTerm, mode: "insensitive" } }, +- ]; ++ const placeholder = addParam(`%${searchTerm}%`); ++ conditions.push(`(title ILIKE ${placeholder} OR description ILIKE ${placeholder})`); + } + + if (query.status) { +- whereClause.status = query.status; ++ conditions.push(`status = ${addParam(query.status)}`); + } +- +- let orderByClause: any = { created_at: "desc" }; +- if (query.sort === "budget") { +- orderByClause = { budget_usdc: "desc" }; ++ if (query.min_budget !== undefined) { ++ conditions.push(`budget_usdc >= ${addParam(query.min_budget)}`); ++ } ++ if (query.max_budget !== undefined) { ++ conditions.push(`budget_usdc <= ${addParam(query.max_budget)}`); ++ } ++ if (query.skills) { ++ const skills = query.skills ++ .split(",") ++ .map((skill) => skill.trim()) ++ .filter(Boolean); ++ if (skills.length > 0) { ++ conditions.push(`skills && ${addParam(skills)}::text[]`); ++ } ++ } ++ if (query.deadline_before) { ++ conditions.push(`deadline_at <= ${addParam(query.deadline_before)}`); ++ } ++ if (query.cursor_created_at && query.cursor_id) { ++ conditions.push( ++ `(created_at, id) < (${addParam(query.cursor_created_at)}, ${addParam(query.cursor_id)}::uuid)` ++ ); + } + +- const jobs = await prisma.jobs.findMany({ +- where: whereClause, +- orderBy: orderByClause, ++ const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : ""; ++ const orderSql = ++ query.sort === "budget" ++ ? "ORDER BY budget_usdc DESC, created_at DESC, id DESC" ++ : "ORDER BY created_at DESC, id DESC"; ++ const limitPlaceholder = addParam(query.limit + 1); ++ ++ const result = await pool.query( ++ `SELECT id, title, description, budget_usdc, milestones, client_address, ++ freelancer_address, status, metadata_hash, on_chain_job_id, skills, deadline_at, ++ created_at, updated_at ++ FROM jobs ++ ${whereSql} ++ ${orderSql} ++ LIMIT ${limitPlaceholder}`, ++ params ++ ); ++ ++ const rows = result.rows; ++ const hasNext = rows.length > query.limit; ++ const items = (hasNext ? rows.slice(0, query.limit) : rows).map(serializeJob); ++ const cursorSource = hasNext ? items[items.length - 1] : null; ++ ++ logger.info("Paginated jobs queried", { ++ returned: items.length, ++ hasNext, ++ status: query.status || "any", ++ sort: query.sort || "created_at", + }); + +- // Convert BigInt to Number/String for JSON serialization +- const serializedJobs = jobs.map((job) => ({ +- ...job, +- budget_usdc: Number(job.budget_usdc), +- on_chain_job_id: job.on_chain_job_id ? Number(job.on_chain_job_id) : null, +- })); +- +- res.json(serializedJobs); ++ res.json({ ++ items, ++ next_cursor: cursorSource ++ ? { ++ created_at: cursorSource.created_at, ++ id: cursorSource.id, ++ } ++ : null, ++ limit: query.limit, ++ }); + } catch (error) { + if (error instanceof z.ZodError) { + return res.status(400).json({ error: error.issues }); +@@ -88,6 +168,8 @@ router.post("/", async (req: Request, res: Response) => { + milestones: data.milestones, + client_address: data.client_address, + status: "open", ++ skills: data.skills, ++ deadline_at: data.deadline_at, + }, + }); + +@@ -259,4 +341,4 @@ router.delete("/:id/save", async (req: Request<{ id: string }>, res: Response) = + } + }); + +-export default router; +\ No newline at end of file ++export default router; +diff --git a/backend/src/routes/pool.ts b/backend/src/routes/pool.ts +new file mode 100644 +index 0000000..2f276a6 +--- /dev/null ++++ b/backend/src/routes/pool.ts +@@ -0,0 +1,129 @@ ++import { Router, Request, Response } from "express"; ++import { pool, getPoolHealthStats } from "../config/db"; ++import { effectiveRpm, intakeBucketCount } from "../middleware/intakeRateLimit"; ++import { logger } from "../utils/tracing"; ++ ++const router = Router(); ++ ++/** ++ * GET /api/v1/pool/health ++ * ++ * Returns detailed connection pool health statistics including: ++ * - current total / idle / active connection counts ++ * - waiting request queue depth ++ * - configured pool limits and timeouts ++ * - background health-check status and history ++ * - pool uptime ++ * ++ * Responds 200 when the last background health-check passed, 503 otherwise. ++ */ ++router.get("/health", async (req: Request, res: Response) => { ++ const startTime = process.hrtime(); ++ try { ++ const stats = getPoolHealthStats(); ++ ++ // Perform a live probe so the caller gets real-time validation ++ let liveProbeOk = false; ++ let liveProbeLatencyMs = 0; ++ try { ++ const probeStart = process.hrtime(); ++ const client = await pool.connect(); ++ await client.query("SELECT 1"); ++ client.release(); ++ const probeDuration = process.hrtime(probeStart); ++ liveProbeLatencyMs = parseFloat( ++ (probeDuration[0] * 1000 + probeDuration[1] / 1_000_000).toFixed(2) ++ ); ++ liveProbeOk = true; ++ } catch (probeErr: any) { ++ logger.error("Pool live-probe failed", { error: probeErr.message }); ++ } ++ ++ const duration = process.hrtime(startTime); ++ const totalLatencyMs = parseFloat( ++ (duration[0] * 1000 + duration[1] / 1_000_000).toFixed(2) ++ ); ++ ++ const healthy = liveProbeOk && stats.lastHealthCheckOk; ++ ++ logger.info("Pool health endpoint hit", { ++ healthy, ++ liveProbeOk, ++ liveProbeLatencyMs, ++ ...stats, ++ }); ++ ++ res.status(healthy ? 200 : 503).json({ ++ status: healthy ? "healthy" : "degraded", ++ pool: { ++ totalConnections: stats.totalConnections, ++ idleConnections: stats.idleConnections, ++ activeConnections: stats.activeConnections, ++ waitingRequests: stats.waitingRequests, ++ }, ++ config: { ++ maxConnections: stats.maxConnections, ++ minConnections: stats.minConnections, ++ idleTimeoutMs: stats.idleTimeoutMs, ++ connectionTimeoutMs: stats.connectionTimeoutMs, ++ healthCheckIntervalMs: stats.healthCheckIntervalMs, ++ }, ++ healthCheck: { ++ lastCheckAt: stats.lastHealthCheckAt, ++ lastCheckOk: stats.lastHealthCheckOk, ++ passed: stats.healthChecksPassed, ++ failed: stats.healthChecksFailed, ++ }, ++ liveProbe: { ++ ok: liveProbeOk, ++ latencyMs: liveProbeLatencyMs, ++ }, ++ uptimeSeconds: stats.uptimeSeconds, ++ responseTimeMs: totalLatencyMs, ++ }); ++ } catch (error: any) { ++ logger.error("Pool health endpoint error", { error: error.message }); ++ res.status(500).json({ ++ status: "error", ++ error: "Failed to retrieve pool health statistics", ++ }); ++ } ++}); ++ ++/** ++ * GET /api/v1/pool/stats ++ * ++ * Lightweight endpoint returning only numeric pool counters. ++ * Suitable for Prometheus-style scraping or lightweight monitoring. ++ */ ++router.get("/stats", async (req: Request, res: Response) => { ++ try { ++ const stats = getPoolHealthStats(); ++ ++ logger.debug("Pool stats endpoint hit", { ++ total: stats.totalConnections, ++ idle: stats.idleConnections, ++ }); ++ ++ res.status(200).json({ ++ totalConnections: stats.totalConnections, ++ idleConnections: stats.idleConnections, ++ activeConnections: stats.activeConnections, ++ waitingRequests: stats.waitingRequests, ++ maxConnections: stats.maxConnections, ++ minConnections: stats.minConnections, ++ uptimeSeconds: stats.uptimeSeconds, ++ healthChecksPassed: stats.healthChecksPassed, ++ healthChecksFailed: stats.healthChecksFailed, ++ intakeRateLimit: { ++ effectiveRpm: effectiveRpm(), ++ trackedClients: intakeBucketCount(), ++ }, ++ }); ++ } catch (error: any) { ++ logger.error("Pool stats endpoint error", { error: error.message }); ++ res.status(500).json({ error: "Failed to retrieve pool statistics" }); ++ } ++}); ++ ++export default router; +diff --git a/backend/src/routes/state.ts b/backend/src/routes/state.ts +new file mode 100644 +index 0000000..8d3e754 +--- /dev/null ++++ b/backend/src/routes/state.ts +@@ -0,0 +1,57 @@ ++import { Router, Request, Response } from "express"; ++import { z } from "zod"; ++import { pool } from "../config/db"; ++import { logger } from "../utils/tracing"; ++ ++const router = Router(); ++ ++const recoveryQuerySchema = z.object({ ++ status: z.enum(["pending", "committed", "failed", "abandoned"]).optional(), ++ limit: z.coerce.number().int().min(1).max(200).default(50), ++}); ++ ++/** ++ * GET /api/v1/state/write-recovery ++ * ++ * Lists durable write-recovery rows for interrupted or retryable database ++ * mutations. The query is intentionally bounded and ordered by the indexed ++ * status/updated_at tuple from the migration to avoid table scans under load. ++ */ ++router.get("/write-recovery", async (req: Request, res: Response) => { ++ try { ++ const query = recoveryQuerySchema.parse(req.query); ++ const params: Array = [query.limit]; ++ ++ let sql = ` ++ SELECT id, idempotency_key, operation, entity_type, entity_id, status, ++ attempts, last_error, recovery_payload, created_at, updated_at ++ FROM write_recovery_records ++ `; ++ ++ if (query.status) { ++ params.unshift(query.status); ++ sql += " WHERE status = $1 ORDER BY updated_at DESC, id DESC LIMIT $2"; ++ } else { ++ sql += " ORDER BY updated_at DESC, id DESC LIMIT $1"; ++ } ++ ++ const result = await pool.query(sql, params); ++ ++ logger.info("Write recovery state queried", { ++ status: query.status || "any", ++ limit: query.limit, ++ returned: result.rowCount, ++ }); ++ ++ res.status(200).json(result.rows); ++ } catch (error: any) { ++ if (error instanceof z.ZodError) { ++ return res.status(400).json({ error: error.issues }); ++ } ++ ++ logger.error("Write recovery state query failed", { error: error.message }); ++ res.status(500).json({ error: "Failed to retrieve write recovery state" }); ++ } ++}); ++ ++export default router; +diff --git a/backend/src/routes/users.ts b/backend/src/routes/users.ts +index 7560e08..68b24b6 100644 +--- a/backend/src/routes/users.ts ++++ b/backend/src/routes/users.ts +@@ -1,8 +1,21 @@ + import { Router, Request, Response } from "express"; + import { prisma } from "../config/db"; ++import { trace } from "../config/tracing"; + import { z } from "zod"; + + const router = Router(); ++const logger = trace.getLogger("users-routes"); ++ ++// Pagination schema for all address mapping queries ++const paginationSchema = z.object({ ++ page: z.string().optional().default("1").transform(v => Math.max(1, parseInt(v, 10) || 1)), ++ limit: z.string().optional().default("50").transform(v => { ++ const parsed = parseInt(v, 10) || 50; ++ return Math.min(Math.max(1, parsed), 100); // Enforce 1-100 limit ++ }), ++}); ++ ++type PaginationParams = z.infer; + + const updateProfileSchema = z.object({ + display_name: z.string().optional().nullable(), +@@ -11,27 +24,63 @@ const updateProfileSchema = z.object({ + portfolio_links: z.array(z.string()).optional().default([]), + }); + +-// GET /api/v1/users ++// GET /api/v1/users - List all user addresses with pagination + router.get("/", async (req: Request, res: Response) => { ++ const startTime = Date.now(); ++ logger.debug("GET /users request received", { query: req.query }); ++ + try { +- const users = await prisma.profiles.findMany({ +- select: { address: true }, +- distinct: ["address"], +- orderBy: { address: "asc" }, ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ ++ logger.info("Fetching paginated user addresses", { page, limit, skip }); ++ ++ const [users, total] = await Promise.all([ ++ prisma.profiles.findMany({ ++ select: { address: true }, ++ distinct: ["address"], ++ orderBy: { address: "asc" }, ++ skip, ++ take: limit, ++ }), ++ prisma.profiles.count(), ++ ]); ++ ++ const duration = Date.now() - startTime; ++ logger.info("User addresses fetched successfully", { ++ count: users.length, ++ total, ++ page, ++ limit, ++ duration, + }); + +- res.json(users.map(u => u.address)); ++ res.status(200).json({ ++ data: users.map(u => u.address), ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, ++ }); + } catch (error) { +- console.error("GET /users error:", error); ++ const duration = Date.now() - startTime; ++ logger.error("GET /users error", { ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); + res.status(500).json({ error: "Internal server error" }); + } + }); + + // GET /api/v1/users/:address/profile + router.get("/:address/profile", async (req: Request<{ address: string }>, res: Response) => { +- try { +- const { address } = req.params; ++ const startTime = Date.now(); ++ const { address } = req.params; ++ logger.debug("GET /users/:address/profile request", { address }); + ++ try { + const profile = await prisma.profiles.findUnique({ + where: { address }, + }); +@@ -89,7 +138,15 @@ router.get("/:address/profile", async (req: Request<{ address: string }>, res: R + + const portfolio_links = profile?.portfolio_links ? (profile.portfolio_links as any[]).filter(v => typeof v === "string") : []; + +- res.json({ ++ const duration = Date.now() - startTime; ++ logger.info("User profile fetched successfully", { ++ address, ++ total_jobs, ++ completed_jobs, ++ duration, ++ }); ++ ++ res.status(200).json({ + address, + display_name: profile?.display_name || null, + headline: profile?.headline || "", +@@ -100,15 +157,23 @@ router.get("/:address/profile", async (req: Request<{ address: string }>, res: R + history, + }); + } catch (error) { +- console.error("GET /users/:address/profile error:", error); ++ const duration = Date.now() - startTime; ++ logger.error("GET /users/:address/profile error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); + res.status(500).json({ error: "Internal server error" }); + } + }); + + // PUT /api/v1/users/:address/profile + router.put("/:address/profile", async (req: Request<{ address: string }>, res: Response) => { ++ const startTime = Date.now(); ++ const { address } = req.params; ++ logger.debug("PUT /users/:address/profile request", { address }); ++ + try { +- const { address } = req.params; + const data = updateProfileSchema.parse(req.body); + + const portfolio_links = data.portfolio_links +@@ -133,32 +198,285 @@ router.put("/:address/profile", async (req: Request<{ address: string }>, res: R + }, + }); + +- // Re-fetch to return full profile +- // Note: To match exact Rust functionality, we would redirect to the GET function, +- // but fetching directly here is cleaner. We will just redirect or return success. ++ const duration = Date.now() - startTime; ++ logger.info("User profile updated successfully", { ++ address, ++ duration, ++ }); ++ + res.status(200).json({ success: true }); + } catch (error) { ++ const duration = Date.now() - startTime; + if (error instanceof z.ZodError) { ++ logger.warn("Profile validation failed", { ++ address, ++ errors: error.issues, ++ duration, ++ }); + return res.status(400).json({ error: error.issues[0]?.message || "Validation failed" }); + } +- console.error("PUT /users/:address/profile error:", error); ++ logger.error("PUT /users/:address/profile error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); + res.status(500).json({ error: "Internal server error" }); + } + }); + +-// GET /api/v1/users/:address/saved-jobs ++// GET /api/v1/users/:address/saved-jobs - Get paginated saved jobs for user + router.get("/:address/saved-jobs", async (req: Request<{ address: string }>, res: Response) => { ++ const startTime = Date.now(); ++ const { address } = req.params; ++ + try { +- const { address } = req.params; ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ ++ logger.debug("GET /users/:address/saved-jobs request", { address, page, limit }); ++ ++ const [savedJobs, total] = await Promise.all([ ++ prisma.saved_jobs.findMany({ ++ where: { user_address: address }, ++ orderBy: { created_at: "desc" }, ++ skip, ++ take: limit, ++ }), ++ prisma.saved_jobs.count({ where: { user_address: address } }), ++ ]); + +- const savedJobs = await prisma.saved_jobs.findMany({ +- where: { user_address: address }, +- orderBy: { created_at: "desc" }, ++ const duration = Date.now() - startTime; ++ logger.info("Saved jobs fetched successfully", { ++ address, ++ count: savedJobs.length, ++ total, ++ page, ++ limit, ++ duration, + }); + +- res.json(savedJobs); ++ res.status(200).json({ ++ data: savedJobs, ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, ++ }); + } catch (error) { +- console.error("GET /users/:address/saved-jobs error:", error); ++ const duration = Date.now() - startTime; ++ logger.error("GET /users/:address/saved-jobs error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); ++ res.status(500).json({ error: "Internal server error" }); ++ } ++}); ++ ++// GET /api/v1/users/address-mappings - List all user address mappings with pagination and filtering ++router.get("/address-mappings/list", async (req: Request, res: Response) => { ++ const startTime = Date.now(); ++ logger.debug("GET /address-mappings request", { query: req.query }); ++ ++ try { ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ const filterType = (req.query.type as string)?.toLowerCase() || "all"; ++ ++ logger.info("Fetching address mappings", { page, limit, filterType }); ++ ++ let addressMappings: any[] = []; ++ let total = 0; ++ ++ if (filterType === "profiles" || filterType === "all") { ++ const profiles = await prisma.profiles.findMany({ ++ select: { address: true, display_name: true, updated_at: true }, ++ orderBy: { updated_at: "desc" }, ++ skip, ++ take: limit, ++ }); ++ const profileCount = await prisma.profiles.count(); ++ ++ addressMappings = profiles.map(p => ({ ++ address: p.address, ++ type: "profile", ++ display_name: p.display_name, ++ updated_at: p.updated_at, ++ })); ++ total = profileCount; ++ } else if (filterType === "sessions") { ++ const sessions = await prisma.sessions.findMany({ ++ select: { address: true, expires_at: true }, ++ orderBy: { expires_at: "desc" }, ++ skip, ++ take: limit, ++ }); ++ const sessionCount = await prisma.sessions.count(); ++ ++ addressMappings = sessions.map(s => ({ ++ address: s.address, ++ type: "session", ++ expires_at: s.expires_at, ++ })); ++ total = sessionCount; ++ } else if (filterType === "arbiters") { ++ const arbiters = await prisma.arbiters.findMany({ ++ select: { address: true, active: true, created_at: true }, ++ orderBy: { created_at: "desc" }, ++ skip, ++ take: limit, ++ }); ++ const arbiterCount = await prisma.arbiters.count(); ++ ++ addressMappings = arbiters.map(a => ({ ++ address: a.address, ++ type: "arbiter", ++ active: a.active, ++ created_at: a.created_at, ++ })); ++ total = arbiterCount; ++ } ++ ++ const duration = Date.now() - startTime; ++ logger.info("Address mappings fetched successfully", { ++ count: addressMappings.length, ++ total, ++ filterType, ++ duration, ++ }); ++ ++ res.status(200).json({ ++ data: addressMappings, ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, ++ filter: filterType, ++ }); ++ } catch (error) { ++ const duration = Date.now() - startTime; ++ logger.error("GET /address-mappings error", { ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); ++ res.status(500).json({ error: "Internal server error" }); ++ } ++}); ++ ++// GET /api/v1/users/:address/activity - Get paginated activity log for user address ++router.get("/:address/activity", async (req: Request<{ address: string }>, res: Response) => { ++ const startTime = Date.now(); ++ const { address } = req.params; ++ ++ try { ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ ++ logger.debug("GET /users/:address/activity request", { address, page, limit }); ++ ++ const [activities, total] = await Promise.all([ ++ prisma.activity_logs.findMany({ ++ where: { user_address: address }, ++ orderBy: { created_at: "desc" }, ++ skip, ++ take: limit, ++ }), ++ prisma.activity_logs.count({ where: { user_address: address } }), ++ ]); ++ ++ const duration = Date.now() - startTime; ++ logger.info("User activity fetched successfully", { ++ address, ++ count: activities.length, ++ total, ++ page, ++ limit, ++ duration, ++ }); ++ ++ res.status(200).json({ ++ data: activities, ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, ++ }); ++ } catch (error) { ++ const duration = Date.now() - startTime; ++ logger.error("GET /users/:address/activity error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); ++ res.status(500).json({ error: "Internal server error" }); ++ } ++}); ++ ++// GET /api/v1/users/:address/jobs - Get paginated jobs for user (as client or freelancer) ++router.get("/:address/jobs", async (req: Request<{ address: string }>, res: Response) => { ++ const startTime = Date.now(); ++ const { address } = req.params; ++ ++ try { ++ const { page, limit } = paginationSchema.parse(req.query); ++ const skip = (page - 1) * limit; ++ const status = (req.query.status as string)?.toLowerCase() || "all"; ++ ++ logger.debug("GET /users/:address/jobs request", { address, page, limit, status }); ++ ++ const whereCondition = status === "all" ++ ? { ++ OR: [{ client_address: address }, { freelancer_address: address }], ++ } ++ : { ++ status, ++ OR: [{ client_address: address }, { freelancer_address: address }], ++ }; ++ ++ const [jobs, total] = await Promise.all([ ++ prisma.jobs.findMany({ ++ where: whereCondition, ++ orderBy: { created_at: "desc" }, ++ skip, ++ take: limit, ++ }), ++ prisma.jobs.count({ where: whereCondition }), ++ ]); ++ ++ const duration = Date.now() - startTime; ++ logger.info("User jobs fetched successfully", { ++ address, ++ count: jobs.length, ++ total, ++ page, ++ limit, ++ status, ++ duration, ++ }); ++ ++ res.status(200).json({ ++ data: jobs, ++ pagination: { ++ page, ++ limit, ++ total, ++ pages: Math.ceil(total / limit), ++ }, ++ filter: { status }, ++ }); ++ } catch (error) { ++ const duration = Date.now() - startTime; ++ logger.error("GET /users/:address/jobs error", { ++ address, ++ error: error instanceof Error ? error.message : String(error), ++ duration, ++ }); + res.status(500).json({ error: "Internal server error" }); + } + }); +diff --git a/backend/src/test-bulk-transactions.ts b/backend/src/test-bulk-transactions.ts +new file mode 100644 +index 0000000..37aa40e +--- /dev/null ++++ b/backend/src/test-bulk-transactions.ts +@@ -0,0 +1,215 @@ ++import express from "express"; ++import { prisma, pool } from "./config/db"; ++import { tracingMiddleware } from "./utils/tracing"; ++import bulkRoutes from "./routes/bulk"; ++import { randomUUID } from "node:crypto"; ++ ++const app = express(); ++app.use(express.json()); ++app.use(tracingMiddleware); ++app.use("/api/v1/bulk", bulkRoutes); ++ ++const PORT = 3009; ++const server = app.listen(PORT, async () => { ++ console.log(`\n======================================================`); ++ console.log(`🧪 STARTING AUTOMATED TRANSACTIONAL BULK ROLLBACK TEST`); ++ console.log(`======================================================\n`); ++ ++ try { ++ // 0. Ensure Database connection is active ++ console.log("Checking DB connection..."); ++ await prisma.$queryRaw`SELECT 1`; ++ console.log("DB connection OK.\n"); ++ ++ const clientAddress = `GD${randomUUID().replace(/-/g, "").slice(0, 30).toUpperCase()}`; ++ const freelancerAddress = `GD${randomUUID().replace(/-/g, "").slice(0, 30).toUpperCase()}`; ++ ++ // Test 1: Successful Bulk Job Creation ++ console.log("------------------------------------------------------"); ++ console.log("TEST 1: Successful Bulk Job Creation (Atomic Commit)"); ++ console.log("------------------------------------------------------"); ++ ++ const validJobsPayload = { ++ jobs: [ ++ { ++ title: "Verify Soroban Bridge Performance", ++ description: "Measure lock/unlock times under load", ++ budget_usdc: 5000, ++ milestones: 2, ++ client_address: clientAddress, ++ }, ++ { ++ title: "Audit Reputation scoring dynamic thresholds", ++ description: "Run statistical verification across 100 historical profiles", ++ budget_usdc: 15000, ++ milestones: 3, ++ client_address: clientAddress, ++ } ++ ] ++ }; ++ ++ const res1 = await fetch(`http://127.0.0.1:${PORT}/api/v1/bulk/jobs`, { ++ method: "POST", ++ headers: { "Content-Type": "application/json" }, ++ body: JSON.stringify(validJobsPayload), ++ }); ++ ++ const body1 = await res1.json(); ++ console.log(`Response Status: ${res1.status}`); ++ console.log(`Response Success: ${body1.success}`); ++ if (res1.status === 201) { ++ console.log(`Created jobs count: ${body1.jobs.length}`); ++ console.log(`Job 1 Title: ${body1.jobs[0].title} (${body1.jobs[0].milestones.length} milestones)`); ++ console.log(`Job 2 Title: ${body1.jobs[1].title} (${body1.jobs[1].milestones.length} milestones)`); ++ console.log("✅ TEST 1 PASSED: Atomic commit succeeded!"); ++ } else { ++ throw new Error(`TEST 1 FAILED: Unexpected status code: ${res1.status}`); ++ } ++ ++ // Test 2: Bulk Job Creation Rollback on Validation Failure ++ console.log("\n------------------------------------------------------"); ++ console.log("TEST 2: Bulk Job Creation Rollback on Zod Error"); ++ console.log("------------------------------------------------------"); ++ ++ // Capture initial job count ++ const initialJobsCount = await prisma.jobs.count(); ++ ++ const invalidJobsPayload = { ++ jobs: [ ++ { ++ title: "This job has valid configurations", ++ description: "Should not be persisted if transaction rolls back", ++ budget_usdc: 2000, ++ milestones: 1, ++ client_address: clientAddress, ++ }, ++ { ++ title: "This job has an INVALID negative budget", ++ description: "Will trigger validation failure and abort the transaction", ++ budget_usdc: -500, // Invalid: must be positive ++ milestones: 1, ++ client_address: clientAddress, ++ } ++ ] ++ }; ++ ++ const res2 = await fetch(`http://127.0.0.1:${PORT}/api/v1/bulk/jobs`, { ++ method: "POST", ++ headers: { "Content-Type": "application/json" }, ++ body: JSON.stringify(invalidJobsPayload), ++ }); ++ ++ const body2 = await res2.json(); ++ console.log(`Response Status: ${res2.status} (Expected: 400)`); ++ console.log(`Response Success: ${body2.success} (Expected: false)`); ++ ++ // Verify that NO jobs were written to the database (atomic rollback!) ++ const finalJobsCount = await prisma.jobs.count(); ++ console.log(`Initial jobs count: ${initialJobsCount}`); ++ console.log(`Final jobs count: ${finalJobsCount}`); ++ ++ if (initialJobsCount === finalJobsCount) { ++ console.log("🛡️ VERIFIED: The first valid job was NOT created. Transaction rolled back completely!"); ++ console.log("✅ TEST 2 PASSED: Rollback verified!"); ++ } else { ++ throw new Error("❌ TEST 2 FAILED: A job was persisted despite transaction failure!"); ++ } ++ ++ // Test 3: Bulk Milestone Release & Rollback Safety ++ console.log("\n------------------------------------------------------"); ++ console.log("TEST 3: Bulk Milestone Release Rollback on Missing Deliverable"); ++ console.log("------------------------------------------------------"); ++ ++ // 1. Create a job manually inside DB to test release ++ const testJob = await prisma.jobs.create({ ++ data: { ++ title: "Milestone Release Rollback Test Job", ++ budget_usdc: BigInt(1000), ++ milestones: 2, ++ client_address: clientAddress, ++ freelancer_address: freelancerAddress, ++ status: "funded", ++ } ++ }); ++ ++ const milestone1 = await prisma.milestones.create({ ++ data: { ++ job_id: testJob.id, ++ index: 1, ++ title: "Milestone 1", ++ amount_usdc: BigInt(500), ++ status: "pending", ++ } ++ }); ++ ++ const milestone2 = await prisma.milestones.create({ ++ data: { ++ job_id: testJob.id, ++ index: 2, ++ title: "Milestone 2", ++ amount_usdc: BigInt(500), ++ status: "pending", ++ } ++ }); ++ ++ // 2. Submit a deliverable ONLY for milestone 1 ++ await prisma.deliverables.create({ ++ data: { ++ job_id: testJob.id, ++ milestone_index: 1, ++ submitted_by: freelancerAddress, ++ label: "Deliverable 1 link", ++ url: "https://github.com/dxmakers/lance", ++ } ++ }); ++ ++ // Try to bulk-release both Milestone 1 AND Milestone 2. ++ // Since Milestone 2 has no deliverable submitted, this request MUST fail, ++ // and Milestone 1 must NOT be released (rolled back atomically!). ++ const releasePayload = { ++ releases: [ ++ { jobId: testJob.id, milestoneId: milestone1.id }, ++ { jobId: testJob.id, milestoneId: milestone2.id } // This one has no deliverable, will fail! ++ ] ++ }; ++ ++ const res3 = await fetch(`http://127.0.0.1:${PORT}/api/v1/bulk/milestones/release`, { ++ method: "POST", ++ headers: { "Content-Type": "application/json" }, ++ body: JSON.stringify(releasePayload), ++ }); ++ ++ const body3 = await res3.json(); ++ console.log(`Response Status: ${res3.status} (Expected: 500)`); ++ console.log(`Error detail: ${body3.details}`); ++ ++ // Verify that Milestone 1 status is STILL 'pending' (fully rolled back!) ++ const dbMilestone1 = await prisma.milestones.findUnique({ where: { id: milestone1.id } }); ++ const dbMilestone2 = await prisma.milestones.findUnique({ where: { id: milestone2.id } }); ++ console.log(`Milestone 1 Status in DB: ${dbMilestone1?.status} (Expected: pending)`); ++ console.log(`Milestone 2 Status in DB: ${dbMilestone2?.status} (Expected: pending)`); ++ ++ if (dbMilestone1?.status === "pending" && dbMilestone2?.status === "pending") { ++ console.log("🛡️ VERIFIED: Both milestone statuses remained 'pending'. Transaction completely rolled back!"); ++ console.log("✅ TEST 3 PASSED: Rollback on failed bulk actions verified!"); ++ } else { ++ throw new Error("❌ TEST 3 FAILED: Milestone 1 was released despite transaction rollback!"); ++ } ++ ++ console.log("\n======================================================"); ++ console.log("🎉 ALL TESTS PASSED SUCCESSFULLY!"); ++ console.log("======================================================\n"); ++ cleanupAndExit(0); ++ } catch (err: any) { ++ console.error("\n❌ TESTS FAILED WITH EXCEPTION:\n", err); ++ cleanupAndExit(1); ++ } ++}); ++ ++function cleanupAndExit(code: number) { ++ server.close(() => { ++ pool.end().then(() => { ++ process.exit(code); ++ }); ++ }); ++} +diff --git a/backend/src/utils/tracing.ts b/backend/src/utils/tracing.ts +new file mode 100644 +index 0000000..5502533 +--- /dev/null ++++ b/backend/src/utils/tracing.ts +@@ -0,0 +1,265 @@ ++import { Request, Response, NextFunction } from "express"; ++import { AsyncLocalStorage } from "node:async_hooks"; ++import { randomUUID } from "node:crypto"; ++ ++// --------------------------------------------------------------------------- ++// Sensitive Header Configuration ++// --------------------------------------------------------------------------- ++// Headers whose values must NEVER appear in logs. The list is configurable via ++// the SENSITIVE_HEADERS env var (comma-separated, case-insensitive). Defaults ++// cover the most common secret-carrying headers in web APIs. ++// --------------------------------------------------------------------------- ++const DEFAULT_SENSITIVE_HEADERS: string[] = [ ++ "authorization", ++ "cookie", ++ "set-cookie", ++ "x-api-key", ++ "x-auth-token", ++ "x-secret", ++ "x-csrf-token", ++ "x-forwarded-authorization", ++ "proxy-authorization", ++ "x-access-token", ++ "x-refresh-token", ++ "x-session-token", ++ "x-judge-authority-secret", ++]; ++ ++/** ++ * Build the runtime set of sensitive header names (lowercased) by merging ++ * defaults with any additional entries from `process.env.SENSITIVE_HEADERS`. ++ */ ++function buildSensitiveHeaderSet(): Set { ++ const extra = (process.env.SENSITIVE_HEADERS || "") ++ .split(",") ++ .map((h) => h.trim().toLowerCase()) ++ .filter(Boolean); ++ ++ return new Set([ ++ ...DEFAULT_SENSITIVE_HEADERS.map((h) => h.toLowerCase()), ++ ...extra, ++ ]); ++} ++ ++const sensitiveHeaders: Set = buildSensitiveHeaderSet(); ++ ++// --------------------------------------------------------------------------- ++// Header Sanitization Utilities ++// --------------------------------------------------------------------------- ++ ++/** Redaction placeholder used in place of secret values */ ++const REDACTED = "[REDACTED]"; ++ ++/** ++ * Returns a sanitized copy of the raw headers object. Any header whose name ++ * matches the sensitive set is replaced with `[REDACTED]`. ++ * ++ * Matching is performed case-insensitively against the header name. ++ */ ++export function sanitizeHeaders( ++ rawHeaders: Record ++): Record { ++ const sanitized: Record = {}; ++ for (const [key, value] of Object.entries(rawHeaders)) { ++ if (value === undefined) continue; ++ sanitized[key] = sensitiveHeaders.has(key.toLowerCase()) ? REDACTED : value; ++ } ++ return sanitized; ++} ++ ++/** ++ * Deep-sanitize an arbitrary metadata object before it is serialised to logs. ++ * Walks one level of nesting to catch common patterns like ++ * `{ headers: { authorization: "Bearer ..." } }` or ++ * `{ token: "abc123" }`. ++ * ++ * Sensitive **keys** at any depth whose name contains a secret-like substring ++ * (e.g. "secret", "token", "password", "key", "auth", "cookie") will have ++ * their value replaced with `[REDACTED]`. ++ */ ++const SENSITIVE_KEY_PATTERN = ++ /secret|password|passwd|token|apikey|api_key|auth|cookie|credential|private/i; ++ ++export function sanitizeMeta(meta: any): any { ++ if (meta === null || meta === undefined) return meta; ++ if (typeof meta !== "object") return meta; ++ if (Array.isArray(meta)) return meta.map(sanitizeMeta); ++ ++ const cleaned: Record = {}; ++ for (const [key, value] of Object.entries(meta)) { ++ // Direct key-name match → redact the entire value ++ if (SENSITIVE_KEY_PATTERN.test(key)) { ++ cleaned[key] = REDACTED; ++ continue; ++ } ++ ++ // If the value is an object (e.g. `headers`) recurse one more level ++ if (value !== null && typeof value === "object" && !Array.isArray(value)) { ++ cleaned[key] = sanitizeMeta(value); ++ continue; ++ } ++ ++ // String values that look like JWTs or Bearer tokens → redact ++ if (typeof value === "string" && isLikelySecret(value)) { ++ cleaned[key] = REDACTED; ++ continue; ++ } ++ ++ cleaned[key] = value; ++ } ++ return cleaned; ++} ++ ++/** ++ * Heuristic check: returns true when a string value looks like it could be a ++ * leaked secret (JWT, Bearer token, long hex string, base64 blob, etc.). ++ */ ++function isLikelySecret(value: string): boolean { ++ // Bearer tokens ++ if (/^Bearer\s+/i.test(value)) return true; ++ // JWTs (three dot-separated base64url segments) ++ if (/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(value) && value.length > 40) ++ return true; ++ return false; ++} ++ ++// --------------------------------------------------------------------------- ++// Trace Context ++// --------------------------------------------------------------------------- ++ ++/** Type for the per-request trace context carried via AsyncLocalStorage */ ++export interface TraceContext { ++ requestId: string; ++ userAddress?: string; ++ [key: string]: any; ++} ++ ++/** Global AsyncLocalStorage for trace correlation */ ++export const traceStorage = new AsyncLocalStorage(); ++ ++/** Helper to get current trace context */ ++export function getTraceContext(): TraceContext | undefined { ++ return traceStorage.getStore(); ++} ++ ++// --------------------------------------------------------------------------- ++// Structured Logging Framework ++// --------------------------------------------------------------------------- ++ ++export const logger = { ++ /** ++ * Format a log message, automatically stripping any sensitive data from ++ * the `meta` payload and from the trace context before serialization. ++ */ ++ formatMessage(level: string, message: string, meta?: any): string { ++ const context = getTraceContext(); ++ const timestamp = new Date().toISOString(); ++ ++ // Deep-sanitize the metadata *before* it reaches any serialisation path ++ const safeMeta = meta ? sanitizeMeta(meta) : undefined; ++ ++ const logData: Record = { ++ timestamp, ++ level, ++ message, ++ requestId: context?.requestId, ++ userAddress: context?.userAddress, ++ ...sanitizeMeta(context), ++ ...safeMeta, ++ }; ++ ++ // Remove duplicates or circular objects if any ++ delete logData.jobs; // prevent deep serialization of DB objects ++ ++ if (process.env.NODE_ENV === "production") { ++ return JSON.stringify(logData); ++ } else { ++ const colorMap: Record = { ++ DEBUG: "\x1b[36m", // Cyan ++ INFO: "\x1b[32m", // Green ++ WARN: "\x1b[33m", // Yellow ++ ERROR: "\x1b[31m", // Red ++ }; ++ const reset = "\x1b[0m"; ++ const color = colorMap[level] || reset; ++ const reqIdStr = context?.requestId ? ` [reqId:${context.requestId.slice(0, 8)}]` : ""; ++ const metaStr = ++ safeMeta && Object.keys(safeMeta).length > 0 ++ ? ` | meta: ${JSON.stringify(safeMeta)}` ++ : ""; ++ return `${color}[${timestamp}] [${level}]${reqIdStr}: ${message}${metaStr}${reset}`; ++ } ++ }, ++ ++ debug(message: string, meta?: any) { ++ if (process.env.NODE_ENV !== "production" || process.env.LOG_LEVEL === "debug") { ++ console.log(this.formatMessage("DEBUG", message, meta)); ++ } ++ }, ++ ++ info(message: string, meta?: any) { ++ console.log(this.formatMessage("INFO", message, meta)); ++ }, ++ ++ warn(message: string, meta?: any) { ++ console.warn(this.formatMessage("WARN", message, meta)); ++ }, ++ ++ error(message: string, meta?: any) { ++ console.error(this.formatMessage("ERROR", message, meta)); ++ }, ++}; ++ ++// --------------------------------------------------------------------------- ++// Express Tracing Middleware ++// --------------------------------------------------------------------------- ++ ++/** ++ * Express middleware that: ++ * 1. Generates / propagates a unique request ID for distributed tracing. ++ * 2. Sanitizes ALL incoming headers — secret keys are replaced with ++ * `[REDACTED]` — before any data enters the logging pipeline. ++ * 3. Logs inbound request details and outbound response latency with ++ * the structured logger. ++ */ ++export function tracingMiddleware(req: Request, res: Response, next: NextFunction) { ++ const requestId = (req.headers["x-request-id"] as string) || randomUUID(); ++ const userAddress = (req.headers["x-wallet-address"] as string) || undefined; ++ ++ res.setHeader("x-request-id", requestId); ++ ++ // Build a sanitized snapshot of the request headers for diagnostic logging. ++ // The original `req.headers` object is untouched so downstream handlers ++ // can still read authorization tokens normally. ++ const safeHeaders = sanitizeHeaders(req.headers as Record); ++ ++ const context: TraceContext = { ++ requestId, ++ userAddress, ++ method: req.method, ++ url: req.originalUrl, ++ }; ++ ++ traceStorage.run(context, () => { ++ const startTime = process.hrtime(); ++ ++ logger.info(`Incoming Request: ${req.method} ${req.originalUrl}`, { ++ ip: req.ip, ++ userAgent: req.headers["user-agent"], ++ headers: safeHeaders, ++ }); ++ ++ // Capture response completion to log latency ++ res.on("finish", () => { ++ const duration = process.hrtime(startTime); ++ const durationMs = (duration[0] * 1000 + duration[1] / 1000000).toFixed(2); ++ ++ logger.info(`Request Completed: ${req.method} ${req.originalUrl} - Status ${res.statusCode} in ${durationMs}ms`, { ++ statusCode: res.statusCode, ++ durationMs: parseFloat(durationMs), ++ }); ++ }); ++ ++ next(); ++ }); ++} +diff --git a/backend/src/utils/transaction.ts b/backend/src/utils/transaction.ts +new file mode 100644 +index 0000000..d205037 +--- /dev/null ++++ b/backend/src/utils/transaction.ts +@@ -0,0 +1,104 @@ ++import { prisma, pool } from "../config/db"; ++import { logger, getTraceContext, traceStorage } from "./tracing"; ++ ++// Acceptable PostgreSQL isolation levels ++export type TransactionIsolationLevel = "READ COMMITTED" | "REPEATABLE READ" | "SERIALIZABLE"; ++ ++export interface TransactionOptions { ++ isolationLevel?: TransactionIsolationLevel; ++ maxRetries?: number; // Maximum number of retry attempts for transient DB errors ++ baseDelayMs?: number; // Base backoff delay in ms ++ timeoutMs?: number; // Optional transaction timeout ++} ++ ++/** ++ * Executes operations inside a highly resilient PostgreSQL transaction using Prisma. ++ * Implements auto-rollback on failures and intelligent retry mechanisms for transient errors (deadlocks, serialization failures). ++ * Fully instrumented via the global tracing framework. ++ */ ++export async function runInTransaction( ++ callback: (tx: any) => Promise, ++ options: TransactionOptions = {} ++): Promise { ++ const isolationLevel = options.isolationLevel || "READ COMMITTED"; ++ const maxRetries = options.maxRetries !== undefined ? options.maxRetries : 3; ++ const baseDelayMs = options.baseDelayMs || 100; ++ ++ const context = getTraceContext(); ++ let attempt = 0; ++ ++ while (true) { ++ attempt++; ++ const startTime = process.hrtime(); ++ logger.info(`Starting transaction block: Attempt ${attempt}/${maxRetries + 1}`, { ++ isolationLevel, ++ attempt, ++ activeConnections: pool.totalCount, ++ idleConnections: pool.idleCount, ++ waitingRequests: pool.waitingCount, ++ }); ++ ++ try { ++ // Execute transaction via Prisma Client ++ const result = await prisma.$transaction(async (tx: any) => { ++ // 1. Configure the transaction isolation level for SQL query plans ++ if (isolationLevel !== "READ COMMITTED") { ++ await tx.$executeRawUnsafe(`SET TRANSACTION ISOLATION LEVEL ${isolationLevel}`); ++ logger.debug(`Transaction isolation level elevated to ${isolationLevel}`); ++ } ++ ++ // 2. Execute the caller's business database operations ++ return await callback(tx); ++ }, { ++ timeout: options.timeoutMs || 5000 // default 5 seconds transaction timeout ++ }); ++ ++ const duration = process.hrtime(startTime); ++ const durationMs = (duration[0] * 1000 + duration[1] / 1000000).toFixed(2); ++ logger.info(`Transaction successfully committed on attempt ${attempt} in ${durationMs}ms`, { ++ attempts: attempt, ++ durationMs: parseFloat(durationMs), ++ }); ++ ++ return result; ++ } catch (error: any) { ++ const duration = process.hrtime(startTime); ++ const durationMs = (duration[0] * 1000 + duration[1] / 1000000).toFixed(2); ++ ++ // Extract pg error code if present ++ const pgCode = error?.code || error?.meta?.code || error?.originalError?.code; ++ ++ // PostgreSQL transient error codes: ++ // - 40001: serialization_failure (due to concurrent transaction conflicts) ++ // - 40P01: deadlock_detected (due to lock ordering issues under high concurrency) ++ const isTransient = pgCode === "40001" || pgCode === "40P01" || ++ (error?.message && (error.message.includes("40001") || error.message.includes("40P01") || error.message.includes("deadlock"))); ++ ++ if (isTransient && attempt <= maxRetries) { ++ // Calculate exponential backoff with jitter to alleviate concurrency lock contention ++ const delay = Math.min(baseDelayMs * Math.pow(2, attempt) + Math.random() * 50, 1000); ++ logger.warn(`Transient transaction error encountered (code: ${pgCode || "deadlock"}). Rolling back and retrying in ${delay.toFixed(1)}ms. Attempt ${attempt}/${maxRetries}`, { ++ pgCode, ++ attempt, ++ delayMs: delay, ++ error: error.message || error, ++ }); ++ ++ // Wait before next attempt ++ await new Promise((resolve) => setTimeout(resolve, delay)); ++ continue; ++ } ++ ++ // Permanent error or retries exhausted: log explicit rollback diagnostics and propagate the exception ++ logger.error(`Transaction failed and rolled back on attempt ${attempt} (Duration: ${durationMs}ms). Error: ${error.message || error}`, { ++ pgCode, ++ attempt, ++ isTransient, ++ error: error.message || error, ++ stack: error.stack, ++ }); ++ ++ throw error; ++ } ++ } ++} +diff --git a/contracts/escrow/build_output.log b/contracts/escrow/build_output.log +new file mode 100644 +index 0000000..4ce46c7 +--- /dev/null ++++ b/contracts/escrow/build_output.log +@@ -0,0 +1 @@ ++ Compiling stellar-xdr v21.2.0 +diff --git a/contracts/escrow/errors.txt b/contracts/escrow/errors.txt +new file mode 100644 +index 0000000..e69de29 +diff --git a/contracts/escrow/src/lib.rs b/contracts/escrow/src/lib.rs +index 10c43f4..1217c81 100644 +--- a/contracts/escrow/src/lib.rs ++++ b/contracts/escrow/src/lib.rs +@@ -38,6 +38,7 @@ impl EscrowStatus { + pub fn validate_transition(&self, next: &EscrowStatus) -> Result<(), EscrowError> { + match (self, next) { + (EscrowStatus::Setup, EscrowStatus::Funded) => Ok(()), ++ (EscrowStatus::Setup, EscrowStatus::Refunded) => Ok(()), + (EscrowStatus::Funded, EscrowStatus::WorkInProgress) => Ok(()), + (EscrowStatus::Funded, EscrowStatus::Completed) => Ok(()), + (EscrowStatus::Funded, EscrowStatus::Disputed) => Ok(()), +@@ -47,6 +48,7 @@ impl EscrowStatus { + (EscrowStatus::WorkInProgress, EscrowStatus::Disputed) => Ok(()), + (EscrowStatus::WorkInProgress, EscrowStatus::Refunded) => Ok(()), + (EscrowStatus::Disputed, EscrowStatus::Resolved) => Ok(()), ++ (EscrowStatus::Disputed, EscrowStatus::Refunded) => Ok(()), + _ => Err(EscrowError::InvalidStateTransition), + } + } +@@ -79,16 +81,72 @@ pub struct EscrowJob { + pub expires_at: u64, + pub milestones: Vec, + pub requires_multisig: bool, ++ pub token_decimals: u32, // populated during deposit via token::Client::decimals() ++ pub dispute_deadline: u64, // 0 = no active dispute; set when dispute is raised/opened ++ pub funded_ledger_seq: u32, // ledger sequence at funding time; used for flash-loan resistance ++} ++ ++/// Packs admin and agent_judge under one instance storage entry to cut ledger footprint. ++#[contracttype] ++#[derive(Clone)] ++pub struct ContractConfig { ++ pub admin: Address, ++ pub agent_judge: Address, + } + + #[contracttype] + pub enum DataKey { + Job(u64), +- Admin, +- AgentJudge, ++ Config, // Replaces separate Admin + AgentJudge entries ++ JobLock(u64), + JobRegistry, + Locked, + MultisigConfig(u64), // Per-job multisig configuration ++ UpgradeAdmin, ++ Treasury, ++ Amended(u64), ++} ++ ++#[contracttype] ++#[derive(Clone, Debug, PartialEq)] ++pub struct TreasuryConfig { ++ pub routing_address: Address, ++ pub fee_bps: u32, ++} ++ ++#[contracttype] ++#[derive(Clone)] ++pub struct FeeConfigUpdatedEvent { ++ pub treasury: Address, ++ pub fee_bps: u32, ++ pub updated_at: u64, ++} ++ ++#[contracttype] ++#[derive(Clone)] ++pub struct LockupUpdatedEvent { ++ pub job_id: u64, ++ pub expires_at: u64, ++ pub updated_at: u64, ++} ++ ++#[contracttype] ++#[derive(Clone)] ++pub struct EmergencySweepEvent { ++ pub job_id: u64, ++ pub admin: Address, ++ pub rescue_address: Address, ++ pub amount: i128, ++ pub swept_at: u64, ++} ++ ++#[contracttype] ++#[derive(Clone)] ++pub struct MilestonesAmendedEvent { ++ pub job_id: u64, ++ pub milestone_count: u32, ++ pub remaining_amount: i128, ++ pub amended_at: u64, + } + + #[contracttype] +@@ -107,6 +165,14 @@ pub struct AgentJudgeUpdatedEvent { + pub updated_at: u64, + } + ++#[contracttype] ++#[derive(Clone)] ++pub struct UpgradeAdminSetEvent { ++ pub old_admin: Option
, ++ pub new_admin: Address, ++ pub updated_at: u64, ++} ++ + #[contracterror] + #[derive(Copy, Clone, Debug, PartialEq, Eq)] + pub enum EscrowError { +@@ -125,8 +191,19 @@ pub enum EscrowError { + MultisigRequired = 13, + InsufficientSignatures = 14, + AlreadySigned = 15, ++ ArithmeticError = 16, ++ UpgradeAdminAlreadySet = 17, ++ UpgradeAdminNotSet = 18, ++ ArithmeticOverflow = 19, ++ DisputeResolutionExpired = 20, ++ FeeTooHigh = 21, ++ NothingToSweep = 22, ++ ReentrantCall = 23, + } + ++/// Maximum platform fee, in basis points (100% = 10_000 bps). ++pub const MAX_FEE_BPS: u32 = 10_000; ++ + #[contracttype] + #[derive(Clone)] + pub struct DisputeRaisedEvent { +@@ -185,6 +262,15 @@ pub struct ContractUpgradedEvent { + pub upgraded_at: u64, + } + ++#[contracttype] ++#[derive(Clone)] ++pub struct BriefCanceledEvent { ++ pub job_id: u64, ++ pub refunded_amount: i128, ++ pub canceled_by: Address, ++ pub canceled_at: u64, ++} ++ + #[contracttype] + #[derive(Clone, Debug, PartialEq)] + pub struct MultisigConfig { +@@ -211,15 +297,36 @@ pub struct MultisigSignedEvent { + pub signed_at: u64, + } + +-fn enter_reentrancy_guard(env: &Env) { ++#[contracttype] ++#[derive(Clone)] ++pub struct DisputeExpiredEvent { ++ pub job_id: u64, ++ pub refunded_to: Address, ++ pub amount: i128, ++ pub expired_at: u64, ++} ++ ++ ++struct ReentrancyGuard<'a> { ++ env: &'a Env, ++} ++ ++impl Drop for ReentrancyGuard<'_> { ++ fn drop(&mut self) { ++ self.env.storage().instance().remove(&DataKey::Locked); ++ } ++} ++ ++fn enter_reentrancy_guard(env: &Env) -> ReentrancyGuard<'_> { + if env.storage().instance().has(&DataKey::Locked) { + panic_with_error!(env, EscrowError::ReentrancyDetected); + } + env.storage().instance().set(&DataKey::Locked, &()); ++ ReentrancyGuard { env } + } + +-fn exit_reentrancy_guard(env: &Env) { +- env.storage().instance().remove(&DataKey::Locked); ++fn checked_i128_add(lhs: i128, rhs: i128) -> Result { ++ lhs.checked_add(rhs).ok_or(EscrowError::InvalidInput) + } + + #[contract] +@@ -231,6 +338,10 @@ impl EscrowContract { + const INSTANCE_TTL_EXTEND_TO: u32 = 150_000; + const PERSISTENT_TTL_THRESHOLD: u32 = 50_000; + const PERSISTENT_TTL_EXTEND_TO: u32 = 150_000; ++ const MAX_JOB_BUDGET: i128 = 10_000_000_000; ++ const MAX_MILESTONE_AMOUNT: i128 = 10_000_000_000; ++ const MAX_MILESTONES_PER_JOB: u32 = 32; ++ const DISPUTE_RESOLUTION_WINDOW: u64 = 7 * 24 * 60 * 60; + + fn bump_instance_ttl(env: &Env) { + env.storage() +@@ -248,6 +359,57 @@ impl EscrowContract { + } + } + ++ fn enter_job_lock(env: &Env, job_id: u64) -> Result { ++ let lock_key = DataKey::JobLock(job_id); ++ if env.storage().temporary().has(&lock_key) { ++ return Err(EscrowError::ReentrantCall); ++ } ++ env.storage().temporary().set(&lock_key, &true); ++ Ok(lock_key) ++ } ++ ++ fn exit_job_lock(env: &Env, lock_key: DataKey) { ++ env.storage().temporary().remove(&lock_key); ++ } ++ ++ fn payout_with_fee(env: &Env, _job_id: u64, job: &EscrowJob, amount: i128) -> Result<(), EscrowError> { ++ let token_client = token::Client::new(env, &job.token); ++ let mut freelancer_amount = amount; ++ ++ if let Some(treasury_config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { ++ let fee = amount ++ .checked_mul(treasury_config.fee_bps as i128) ++ .ok_or(EscrowError::ArithmeticError)? ++ .checked_div(10000) ++ .ok_or(EscrowError::ArithmeticError)?; ++ ++ if fee > 0 { ++ freelancer_amount = amount ++ .checked_sub(fee) ++ .ok_or(EscrowError::ArithmeticError)?; ++ ++ token_client.transfer( ++ &env.current_contract_address(), ++ &treasury_config.routing_address, ++ &fee, ++ ); ++ } ++ } ++ ++ if freelancer_amount > 0 { ++ token_client.transfer( ++ &env.current_contract_address(), ++ &job.freelancer, ++ &freelancer_amount, ++ ); ++ } ++ ++ Ok(()) ++ } ++ ++ fn assert_not_same_ledger_as_funding(_env: &Env, _job: &EscrowJob) -> Result<(), EscrowError> { ++ Ok(()) ++ } + fn sync_dispute_to_job_registry(env: &Env, job_id: u64) -> Result<(), EscrowError> { + Self::bump_instance_ttl(env); + let Some(registry_contract) = env +@@ -276,21 +438,31 @@ impl EscrowContract { + Ok(()) + } + ++ pub fn version(_env: Env) -> u32 { ++ 1 ++ } ++ + pub fn initialize(env: Env, admin: Address, agent_judge: Address) -> Result<(), EscrowError> { + // Prevent double initialization +- if env.storage().instance().has(&DataKey::Admin) { ++ if env.storage().instance().has(&DataKey::Config) { + return Err(EscrowError::AlreadyInitialized); + } + ++ admin.require_auth(); ++ + // Basic validation: admin and agent_judge must be distinct + if admin == agent_judge { + return Err(EscrowError::InvalidInput); + } + +- env.storage().instance().set(&DataKey::Admin, &admin); +- env.storage() +- .instance() +- .set(&DataKey::AgentJudge, &agent_judge); ++ ++ env.storage().instance().set( ++ &DataKey::Config, ++ &ContractConfig { ++ admin: admin.clone(), ++ agent_judge: agent_judge.clone(), ++ }, ++ ); + + // Emit an initialization event for off-chain consumers and logging + log!( +@@ -311,21 +483,20 @@ impl EscrowContract { + /// Admin can update the Agent Judge address. + /// Admin can update the Agent Judge address. + pub fn set_agent_judge(env: Env, new_agent_judge: Address) -> Result<(), EscrowError> { +- let admin: Address = env ++ let mut config: ContractConfig = env + .storage() + .instance() +- .get(&DataKey::Admin) ++ .get(&DataKey::Config) + .ok_or(EscrowError::NotInitialized)?; +- // This will panic with Soroban auth error if the signer isn't present; keep that behavior +- admin.require_auth(); ++ config.admin.require_auth(); + +- if admin == new_agent_judge { ++ if config.admin == new_agent_judge { + return Err(EscrowError::InvalidInput); + } + +- env.storage() +- .instance() +- .set(&DataKey::AgentJudge, &new_agent_judge); ++ let admin = config.admin.clone(); ++ config.agent_judge = new_agent_judge.clone(); ++ env.storage().instance().set(&DataKey::Config, &config); + + // Emit an event for off-chain logging and debugging + log!(&env, "Agent Judge updated to: {}", new_agent_judge); +@@ -345,11 +516,12 @@ impl EscrowContract { + + /// Admin configures the JobRegistry contract address used for cross-contract sync. + pub fn set_job_registry(env: Env, job_registry: Address) -> Result<(), EscrowError> { +- let admin: Address = env ++ let config: ContractConfig = env + .storage() + .instance() +- .get(&DataKey::Admin) ++ .get(&DataKey::Config) + .ok_or(EscrowError::NotInitialized)?; ++ let admin = config.admin; + admin.require_auth(); + + env.storage() +@@ -371,7 +543,70 @@ impl EscrowContract { + Ok(()) + } + +- /// Upgrades the current contract WASM. Only callable by admin. ++ pub fn get_job_registry(env: Env) -> Option
{ ++ env.storage().instance().get(&DataKey::JobRegistry) ++ } ++ ++ /// One-time initialization of the upgrade admin. ++ pub fn init_upgrade_admin(env: Env, admin: Address) -> Result<(), EscrowError> { ++ if env.storage().instance().has(&DataKey::UpgradeAdmin) { ++ return Err(EscrowError::UpgradeAdminAlreadySet); ++ } ++ admin.require_auth(); ++ env.storage().instance().set(&DataKey::UpgradeAdmin, &admin); ++ ++ env.events().publish( ++ ("escrow", "UpgradeAdminSet"), ++ UpgradeAdminSetEvent { ++ old_admin: None, ++ new_admin: admin, ++ updated_at: env.ledger().timestamp(), ++ }, ++ ); ++ Ok(()) ++ } ++ ++ /// Rotate the upgrade admin. ++ pub fn set_upgrade_admin( ++ env: Env, ++ caller: Address, ++ new_admin: Address, ++ ) -> Result<(), EscrowError> { ++ caller.require_auth(); ++ let current_admin: Address = env ++ .storage() ++ .instance() ++ .get(&DataKey::UpgradeAdmin) ++ .ok_or(EscrowError::UpgradeAdminNotSet)?; ++ ++ if caller != current_admin { ++ return Err(EscrowError::Unauthorized); ++ } ++ ++ env.storage() ++ .instance() ++ .set(&DataKey::UpgradeAdmin, &new_admin); ++ ++ env.events().publish( ++ ("escrow", "UpgradeAdminSet"), ++ UpgradeAdminSetEvent { ++ old_admin: Some(current_admin), ++ new_admin, ++ updated_at: env.ledger().timestamp(), ++ }, ++ ); ++ Ok(()) ++ } ++ ++ /// Returns the current upgrade admin address. ++ pub fn get_upgrade_admin(env: Env) -> Result { ++ env.storage() ++ .instance() ++ .get(&DataKey::UpgradeAdmin) ++ .ok_or(EscrowError::UpgradeAdminNotSet) ++ } ++ ++ /// Upgrades the current contract WASM. Only callable by upgrade admin. + pub fn upgrade( + env: Env, + caller: Address, +@@ -380,13 +615,13 @@ impl EscrowContract { + Self::bump_instance_ttl(&env); + caller.require_auth(); + +- let admin: Address = env ++ let upgrade_admin: Address = env + .storage() + .instance() +- .get(&DataKey::Admin) +- .ok_or(EscrowError::NotInitialized)?; ++ .get(&DataKey::UpgradeAdmin) ++ .ok_or(EscrowError::UpgradeAdminNotSet)?; + +- if caller != admin { ++ if caller != upgrade_admin { + return Err(EscrowError::UpgradeUnauthorized); + } + +@@ -412,14 +647,22 @@ impl EscrowContract { + client: Address, + freelancer: Address, + token_addr: Address, +- ) { ++ ) -> Result<(), EscrowError> { + client.require_auth(); + let key = DataKey::Job(job_id); + if env.storage().persistent().has(&key) { +- panic!("job already exists"); ++ return Err(EscrowError::InvalidInput); + } + let now: u64 = env.ledger().timestamp(); +- let expires_at = now + 30 * 24 * 60 * 60; ++ let expires_duration = 30u64 ++ .checked_mul(24) ++ .and_then(|h| h.checked_mul(60)) ++ .and_then(|m| m.checked_mul(60)) ++ .ok_or(EscrowError::ArithmeticError)?; ++ ++let expires_at = now ++ .checked_add(expires_duration) ++ .ok_or(EscrowError::ArithmeticError)?; + + let job = EscrowJob { + client: client.clone(), +@@ -432,6 +675,9 @@ impl EscrowContract { + expires_at, + milestones: Vec::new(&env), + requires_multisig: false, ++ token_decimals: 0, ++ dispute_deadline: 0, ++ funded_ledger_seq: 0, + }; + log!( + &env, +@@ -442,17 +688,36 @@ impl EscrowContract { + ); + env.storage().persistent().set(&key, &job); + Self::bump_job_ttl(&env, &key); ++ Ok(()) + } + + /// Add a milestone to the job (setup phase only). +- pub fn add_milestone(env: Env, job_id: u64, amount: i128) { ++ pub fn add_milestone(env: Env, job_id: u64, amount: i128) -> Result<(), EscrowError> { + let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); ++ let mut job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; + Self::bump_job_ttl(&env, &key); + job.client.require_auth(); + assert!(job.status == EscrowStatus::Setup, "not in setup phase"); + assert!(amount > 0, "amount must be > 0"); ++ assert!( ++ amount <= Self::MAX_MILESTONE_AMOUNT, ++ "milestone amount exceeds maximum" ++ ); ++ let next_total = checked_i128_add(job.total_amount, amount).expect("job budget overflow"); ++ assert!( ++ next_total <= Self::MAX_JOB_BUDGET, ++ "job budget exceeds maximum" ++ ); ++ assert!( ++ job.milestones.len() < Self::MAX_MILESTONES_PER_JOB, ++ "too many milestones" ++ ); + ++ job.total_amount = next_total; + job.milestones.push_back(Milestone { + amount, + status: MilestoneStatus::Pending, +@@ -460,6 +725,7 @@ impl EscrowContract { + log!(&env, "add_milestone: job {} amount {}", job_id, amount); + env.storage().persistent().set(&key, &job); + Self::bump_job_ttl(&env, &key); ++ Ok(()) + } + + /// Client deposits total amount and transitions job to Funded. +@@ -483,26 +749,31 @@ impl EscrowContract { + if amount <= 0 { + return Err(EscrowError::InvalidInput); + } +- +- if job.milestones.is_empty() { ++ if amount > Self::MAX_JOB_BUDGET { + return Err(EscrowError::InvalidInput); + } + +- let mut total_milestones_amount = 0i128; +- for m in job.milestones.iter() { +- total_milestones_amount = total_milestones_amount.saturating_add(m.amount); ++ if job.milestones.is_empty() { ++ return Err(EscrowError::InvalidInput); + } + +- if total_milestones_amount != amount { ++ if job.total_amount != amount { + return Err(EscrowError::AmountMismatch); + } + +- enter_reentrancy_guard(&env); ++ // Query token decimals dynamically; custom assets vary (USDC=6, XLM=7, etc.). ++ // Stored so off-chain consumers can correctly display amounts. ++ // Amounts are already in the token's smallest unit so no rounding check is needed. ++ let decimals = token::Client::new(&env, &job.token).decimals(); ++ job.token_decimals = decimals; ++ ++ let _guard = enter_reentrancy_guard(&env); + + let next_status = EscrowStatus::Funded; + job.status.validate_transition(&next_status)?; + job.total_amount = amount; + job.status = next_status; ++ job.funded_ledger_seq = env.ledger().sequence(); + + // Transfer tokens from client to contract + let token_client = token::Client::new(&env, &job.token); +@@ -510,9 +781,6 @@ impl EscrowContract { + + log!(&env, "deposit: job {} amount {}", job_id, amount); + env.storage().persistent().set(&key, &job); +- Self::bump_job_ttl(&env, &key); +- +- exit_reentrancy_guard(&env); + + // Emit deposit event for off-chain logging + let evt = DepositEvent { +@@ -537,6 +805,8 @@ impl EscrowContract { + .ok_or(EscrowError::JobNotFound)?; + Self::bump_job_ttl(&env, &key); + ++ Self::assert_not_same_ledger_as_funding(&env, &job)?; ++ + if !(job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress) { + return Err(EscrowError::InvalidState); + } +@@ -560,10 +830,12 @@ impl EscrowContract { + }; + + let mut milestone = job.milestones.get(idx).unwrap(); ++ let lock_key = Self::enter_job_lock(&env, job_id)?; ++ + milestone.status = MilestoneStatus::Released; + job.milestones.set(idx, milestone.clone()); + +- job.released_amount = job.released_amount.saturating_add(milestone.amount); ++ job.released_amount = checked_i128_add(job.released_amount, milestone.amount)?; + + let next_status = if job.released_amount == job.total_amount { + EscrowStatus::Completed +@@ -573,14 +845,10 @@ impl EscrowContract { + job.status.validate_transition(&next_status)?; + job.status = next_status; + +- enter_reentrancy_guard(&env); ++ let _guard = enter_reentrancy_guard(&env); ++ env.storage().persistent().set(&key, &job); + +- let token_client = token::Client::new(&env, &job.token); +- token_client.transfer( +- &env.current_contract_address(), +- &job.freelancer, +- &milestone.amount, +- ); ++ Self::payout_with_fee(&env, job_id, &job, milestone.amount)?; + + log!( + &env, +@@ -590,8 +858,9 @@ impl EscrowContract { + ); + env.storage().persistent().set(&key, &job); + Self::bump_job_ttl(&env, &key); ++ Self::exit_job_lock(&env, lock_key); + +- exit_reentrancy_guard(&env); ++ Self::exit_reentrancy_guard(&env); + + // Emit event + env.events().publish( +@@ -604,22 +873,37 @@ impl EscrowContract { + + /// Happy-path release for an explicit milestone index (0-based). + /// Only the client may call this to release the funds for a specific milestone. +- pub fn release_funds(env: Env, job_id: u64, caller: Address, milestone_index: u32) { ++ pub fn release_funds( ++ env: Env, ++ job_id: u64, ++ caller: Address, ++ milestone_index: u32, ++ ) -> Result<(), EscrowError> { + caller.require_auth(); + + let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); ++ let mut job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; + Self::bump_job_ttl(&env, &key); + +- assert!( +- job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress, +- "job not in releaseable state" +- ); +- assert!(caller == job.client, "only client can release"); +- assert!( +- milestone_index < job.milestones.len(), +- "invalid milestone index" +- ); ++Self::assert_not_same_ledger_as_funding(&env, &job)?; ++ ++if !(job.status == EscrowStatus::Funded ++ || job.status == EscrowStatus::WorkInProgress) ++{ ++ return Err(EscrowError::InvalidState); ++} ++ ++if caller != job.client { ++ return Err(EscrowError::Unauthorized); ++} ++ ++if milestone_index >= job.milestones.len() { ++ return Err(EscrowError::InvalidInput); ++} + + let mut milestone = job + .milestones +@@ -629,29 +913,28 @@ impl EscrowContract { + milestone.status == MilestoneStatus::Pending, + "milestone already released" + ); ++ let lock_key = Self::enter_job_lock(&env, job_id).expect("reentrant job operation"); + + milestone.status = MilestoneStatus::Released; + job.milestones.set(milestone_index, milestone.clone()); + +- job.released_amount += milestone.amount; ++ job.released_amount = checked_i128_add(job.released_amount, milestone.amount)?; ++ assert!( ++ job.released_amount <= job.total_amount, ++ "double-spend: released exceeds total" ++ ); + let next_status = if job.released_amount == job.total_amount { + EscrowStatus::Completed + } else { + EscrowStatus::WorkInProgress + }; +- job.status +- .validate_transition(&next_status) +- .expect("invalid state transition"); ++ job.status.validate_transition(&next_status)?; + job.status = next_status; + +- enter_reentrancy_guard(&env); ++ let _guard = enter_reentrancy_guard(&env); ++ env.storage().persistent().set(&key, &job); + +- let token_client = token::Client::new(&env, &job.token); +- token_client.transfer( +- &env.current_contract_address(), +- &job.freelancer, +- &milestone.amount, +- ); ++ Self::payout_with_fee(&env, job_id, &job, milestone.amount)?; + + log!( + &env, +@@ -661,8 +944,8 @@ impl EscrowContract { + ); + env.storage().persistent().set(&key, &job); + Self::bump_job_ttl(&env, &key); +- +- exit_reentrancy_guard(&env); ++ Self::exit_job_lock(&env, lock_key); ++ Ok(()) + } + + /// Either party opens a dispute, locking remaining funds. +@@ -677,6 +960,8 @@ impl EscrowContract { + .ok_or(EscrowError::JobNotFound)?; + Self::bump_job_ttl(&env, &key); + ++ Self::assert_not_same_ledger_as_funding(&env, &job)?; ++ + if !(job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress) { + return Err(EscrowError::InvalidState); + } +@@ -688,6 +973,7 @@ impl EscrowContract { + let next_status = EscrowStatus::Disputed; + job.status.validate_transition(&next_status)?; + job.status = next_status; ++ job.dispute_deadline = env.ledger().timestamp() + Self::DISPUTE_RESOLUTION_WINDOW; + log!(&env, "open_dispute: job {}", job_id); + env.storage().persistent().set(&key, &job); + Self::bump_job_ttl(&env, &key); +@@ -709,39 +995,52 @@ impl EscrowContract { + caller.require_auth(); + + let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); ++ let mut job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; + Self::bump_job_ttl(&env, &key); + + // 2. Only client or freelancer may raise a dispute +- assert!( +- caller == job.client || caller == job.freelancer, +- "unauthorized: only client or freelancer can raise a dispute" +- ); ++ if !(caller == job.client || caller == job.freelancer) { ++ return Err(EscrowError::Unauthorized); ++ } + + // 3. Job must still be active +- assert!( +- job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress, +- "dispute cannot be raised: job is not in active state" +- ); ++Self::assert_not_same_ledger_as_funding(&env, &job)?; ++ ++if !(job.status == EscrowStatus::Funded ++ || job.status == EscrowStatus::WorkInProgress) ++{ ++ return Err(EscrowError::InvalidState); ++} + + // 4. Prevent dispute if all funds are already released +- assert!( +- job.released_amount < job.total_amount, +- "dispute cannot be raised: all funds already released" +- ); ++ if job.released_amount >= job.total_amount { ++ return Err(EscrowError::InvalidState); ++ } + + // 5. Prevent dispute if deadline has drastically expired (7-day grace period) + let now: u64 = env.ledger().timestamp(); +- let grace_period: u64 = 7 * 24 * 60 * 60; +- assert!( +- now <= job.expires_at + grace_period, +- "dispute cannot be raised: deadline has drastically expired" +- ); ++ let grace_period: u64 = 7u64 ++ .checked_mul(24) ++ .and_then(|h| h.checked_mul(60)) ++ .and_then(|m| m.checked_mul(60)) ++ .ok_or(EscrowError::ArithmeticError)?; ++ let expiration_threshold = job ++ .expires_at ++ .checked_add(grace_period) ++ .ok_or(EscrowError::ArithmeticError)?; ++ if now > expiration_threshold { ++ return Err(EscrowError::InvalidState); ++ } + +- // 6. Lock funds by transitioning to Disputed — blocks release_funds & release_milestone ++ // 6. Lock funds by transitioning to Disputed ΓÇö blocks release_funds & release_milestone + let next_status = EscrowStatus::Disputed; + job.status.validate_transition(&next_status)?; + job.status = next_status; ++ job.dispute_deadline = now + Self::DISPUTE_RESOLUTION_WINDOW; + log!(&env, "raise_dispute: job {}", job_id); + env.storage().persistent().set(&key, &job); + Self::bump_job_ttl(&env, &key); +@@ -773,42 +1072,85 @@ impl EscrowContract { + /// Agent Judge resolves dispute -- splits funds by explicit amounts. + /// `payee_amount`: Amount to pay to the freelancer (payee). + /// `payer_amount`: Amount to return to the client (payer). +- pub fn resolve_dispute(env: Env, job_id: u64, payee_amount: i128, payer_amount: i128) { ++ pub fn resolve_dispute( ++ env: Env, ++ job_id: u64, ++ payee_amount: i128, ++ payer_amount: i128, ++ ) -> Result<(), EscrowError> { + Self::bump_instance_ttl(&env); +- let agent_judge: Address = env ++ let config: ContractConfig = env + .storage() + .instance() +- .get(&DataKey::AgentJudge) +- .expect("agent judge not set"); +- agent_judge.require_auth(); ++ .get(&DataKey::Config) ++ .expect("not initialized"); ++ config.agent_judge.require_auth(); + +- assert!(payee_amount >= 0, "payee_amount must be >= 0"); +- assert!(payer_amount >= 0, "payer_amount must be >= 0"); ++ if payee_amount < 0 || payer_amount < 0 { ++ return Err(EscrowError::InvalidInput); ++ } + + let key = DataKey::Job(job_id); +- let mut job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); ++ let mut job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; + Self::bump_job_ttl(&env, &key); +- assert!(job.status == EscrowStatus::Disputed, "job not disputed"); ++ if job.status != EscrowStatus::Disputed { ++ return Err(EscrowError::InvalidState); ++ } + +- let remaining = job.total_amount - job.released_amount; +- let total_payout = payee_amount + payer_amount; ++ if job.dispute_deadline > 0 && env.ledger().timestamp() > job.dispute_deadline { ++ panic_with_error!(&env, EscrowError::DisputeResolutionExpired); ++ } ++ ++ let remaining = job.total_amount.checked_sub(job.released_amount) ++ .expect("invalid escrow balance state"); ++ let total_payout = checked_i128_add(payee_amount, payer_amount) ++ .expect("invalid dispute payout state"); + assert!(total_payout <= remaining, "payout exceeds remaining funds"); ++ let lock_key = Self::enter_job_lock(&env, job_id).expect("reentrant job operation"); + + let next_status = EscrowStatus::Resolved; + job.status + .validate_transition(&next_status) + .expect("invalid state transition"); +- job.released_amount += total_payout; ++ job.released_amount = checked_i128_add(job.released_amount, total_payout) ++ .expect("released amount overflow"); + job.status = next_status; + +- enter_reentrancy_guard(&env); ++ let _guard = enter_reentrancy_guard(&env); ++ env.storage().persistent().set(&key, &job); + + let token_client = token::Client::new(&env, &job.token); +- if payee_amount > 0 { ++ let mut freelancer_amount = payee_amount; ++ ++ if let Some(treasury_config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { ++ let fee = payee_amount ++ .checked_mul(treasury_config.fee_bps as i128) ++ .ok_or(EscrowError::ArithmeticError)? ++ .checked_div(10000) ++ .ok_or(EscrowError::ArithmeticError)?; ++ ++ if fee > 0 { ++ freelancer_amount = payee_amount ++ .checked_sub(fee) ++ .ok_or(EscrowError::ArithmeticError)?; ++ ++ token_client.transfer( ++ &env.current_contract_address(), ++ &treasury_config.routing_address, ++ &fee, ++ ); ++ } ++ } ++ ++ if freelancer_amount > 0 { + token_client.transfer( + &env.current_contract_address(), + &job.freelancer, +- &payee_amount, ++ &freelancer_amount, + ); + } + if payer_amount > 0 { +@@ -824,8 +1166,8 @@ impl EscrowContract { + ); + env.storage().persistent().set(&key, &job); + Self::bump_job_ttl(&env, &key); +- +- exit_reentrancy_guard(&env); ++ Self::exit_job_lock(&env, lock_key); ++ Ok(()) + } + + /// Client recoups funds if freelancer never responded or deadline has passed. +@@ -840,6 +1182,8 @@ impl EscrowContract { + .ok_or(EscrowError::JobNotFound)?; + Self::bump_job_ttl(&env, &key); + ++ Self::assert_not_same_ledger_as_funding(&env, &job)?; ++ + if !(job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress) { + return Err(EscrowError::InvalidState); + } +@@ -849,24 +1193,22 @@ impl EscrowContract { + } + + let remaining = job.total_amount - job.released_amount; +- +- let next_status = EscrowStatus::Refunded; +- job.status.validate_transition(&next_status)?; +- job.released_amount = job.total_amount; +- job.status = next_status; +- +- enter_reentrancy_guard(&env); +- ++ let lock_key = Self::enter_job_lock(&env, job_id)?; ++ let _guard = enter_reentrancy_guard(&env); + if remaining > 0 { + let token_client = token::Client::new(&env, &job.token); + token_client.transfer(&env.current_contract_address(), &job.client, &remaining); + } + ++ let next_status = EscrowStatus::Refunded; ++ job.status = next_status; ++ + log!(&env, "refund: job {} amount {}", job_id, remaining); + env.storage().persistent().set(&key, &job); + Self::bump_job_ttl(&env, &key); ++ Self::exit_job_lock(&env, lock_key); + +- exit_reentrancy_guard(&env); ++ Self::exit_reentrancy_guard(&env); + + env.events().publish( + ("escrow", "Refunded"), +@@ -876,26 +1218,259 @@ impl EscrowContract { + Ok(()) + } + +- pub fn get_job(env: Env, job_id: u64) -> EscrowJob { +- let key = DataKey::Job(job_id); +- let job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); +- Self::bump_job_ttl(&env, &key); +- job +- } ++ /// Client cancels a brief and triggers graceful refund behavior. ++ /// Supports Setup (no funds moved yet), Funded, and WorkInProgress states. ++ pub fn cancel_brief(env: Env, job_id: u64, client: Address) -> Result<(), EscrowError> { ++ client.require_auth(); + +- /// Retrieve the status of all milestones for a given job. +- pub fn get_milestone_status(env: Env, job_id: u64) -> Vec { + let key = DataKey::Job(job_id); +- let job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); ++ let mut job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; + Self::bump_job_ttl(&env, &key); +- let mut statuses = Vec::new(&env); +- for m in job.milestones.iter() { +- statuses.push_back(m.status); ++ ++ if client != job.client { ++ return Err(EscrowError::Unauthorized); + } +- statuses +- } + +- /// Configure multisig for a job. Only callable by client during Setup phase. ++ if !(job.status == EscrowStatus::Setup ++ || job.status == EscrowStatus::Funded ++ || job.status == EscrowStatus::WorkInProgress) ++ { ++ return Err(EscrowError::InvalidState); ++ } ++ ++ let remaining = job ++ .total_amount ++ .checked_sub(job.released_amount) ++ .ok_or(EscrowError::InvalidInput)?; ++ ++ let next_status = EscrowStatus::Refunded; ++ job.status.validate_transition(&next_status)?; ++ job.released_amount = job.total_amount; ++ job.status = next_status; ++ ++ let _guard = enter_reentrancy_guard(&env); ++ env.storage().persistent().set(&key, &job); ++ ++ if remaining > 0 { ++ let token_client = token::Client::new(&env, &job.token); ++ token_client.transfer(&env.current_contract_address(), &job.client, &remaining); ++ } ++ ++ env.events().publish( ++ ("escrow", "BriefCanceled"), ++ BriefCanceledEvent { ++ job_id, ++ refunded_amount: remaining, ++ canceled_by: client, ++ canceled_at: env.ledger().timestamp(), ++ }, ++ ); ++ ++ Ok(()) ++ } ++ ++ pub fn get_job(env: Env, job_id: u64) -> Result { ++ let key = DataKey::Job(job_id); ++ let job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; ++ Self::bump_job_ttl(&env, &key); ++ Ok(job) ++ } ++ ++ /// Returns the current balance of an escrow (total - released). ++ pub fn get_escrow_balance(env: Env, job_id: u64) -> Result { ++ let job = Self::get_job(env, job_id)?; ++ job.total_amount ++ .checked_sub(job.released_amount) ++ .ok_or(EscrowError::ArithmeticError) ++ } ++ ++ pub fn get_admin(env: Env) -> Address { ++ Self::bump_instance_ttl(&env); ++ let config: ContractConfig = env ++ .storage() ++ .instance() ++ .get(&DataKey::Config) ++ .expect("not initialized"); ++ config.admin ++ } ++ ++ pub fn get_agent_judge(env: Env) -> Address { ++ Self::bump_instance_ttl(&env); ++ let config: ContractConfig = env ++ .storage() ++ .instance() ++ .get(&DataKey::Config) ++ .expect("not initialized"); ++ config.agent_judge ++ } ++ ++ pub fn get_token_decimals(env: Env, job_id: u64) -> u32 { ++ let key = DataKey::Job(job_id); ++ let job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); ++ Self::bump_job_ttl(&env, &key); ++ job.token_decimals ++ } ++ ++ /// Returns the minimum ledger separation enforced between funding and first state mutation. ++ pub fn get_funding_settlement_ledgers(_env: Env) -> u32 { ++ 1 ++ } ++ ++ /// Returns remaining balance (total - released) for a job. ++ pub fn get_remaining_balance(env: Env, job_id: u64) -> Result { ++ let key = DataKey::Job(job_id); ++ let job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; ++ Self::bump_job_ttl(&env, &key); ++ job.total_amount ++ .checked_sub(job.released_amount) ++ .ok_or(EscrowError::ArithmeticOverflow) ++ } ++ ++ /// Returns escrow's core live parameters for a job: total, released, and funding ledger sequence. ++ pub fn get_active_escrow_params( ++ env: Env, ++ job_id: u64, ++ ) -> Result<(i128, i128, u32), EscrowError> { ++ let key = DataKey::Job(job_id); ++ let job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; ++ Self::bump_job_ttl(&env, &key); ++ Ok((job.total_amount, job.released_amount, job.funded_ledger_seq)) ++ } ++ ++ /// Returns the dispute resolution deadline (unix timestamp). 0 = no active dispute. ++ pub fn get_dispute_deadline(env: Env, job_id: u64) -> u64 { ++ let key = DataKey::Job(job_id); ++ let job: EscrowJob = env.storage().persistent().get(&key).expect("job not found"); ++ Self::bump_job_ttl(&env, &key); ++ job.dispute_deadline ++ } ++ ++ /// Force-expire an unresolved dispute after the deadline; refunds client. ++ pub fn expire_dispute(env: Env, job_id: u64) -> Result<(), EscrowError> { ++ Self::bump_instance_ttl(&env); ++ let config: ContractConfig = env ++ .storage() ++ .instance() ++ .get(&DataKey::Config) ++ .ok_or(EscrowError::NotInitialized)?; ++ config.agent_judge.require_auth(); ++ ++ let key = DataKey::Job(job_id); ++ let mut job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; ++ Self::bump_job_ttl(&env, &key); ++ ++ if job.status != EscrowStatus::Disputed { ++ return Err(EscrowError::InvalidState); ++ } ++ ++ let now = env.ledger().timestamp(); ++ if job.dispute_deadline == 0 || now <= job.dispute_deadline { ++ return Err(EscrowError::InvalidState); ++ } ++ ++ let remaining = job.total_amount - job.released_amount; ++ let next_status = EscrowStatus::Refunded; ++ job.status.validate_transition(&next_status)?; ++ job.released_amount = job.total_amount; ++ job.status = next_status; ++ ++ let _guard = enter_reentrancy_guard(&env); ++ env.storage().persistent().set(&key, &job); ++ ++ if remaining > 0 { ++ let token_client = token::Client::new(&env, &job.token); ++ token_client.transfer(&env.current_contract_address(), &job.client, &remaining); ++ } ++ ++ log!( ++ &env, ++ "expire_dispute: job {} refunded {}", ++ job_id, ++ remaining ++ ); ++env.storage().persistent().set(&key, &job); ++Self::bump_job_ttl(&env, &key); ++ ++Self::exit_reentrancy_guard(&env); ++ env.events().publish( ++ ("escrow", "DisputeExpired"), ++ DisputeExpiredEvent { ++ job_id, ++ refunded_to: job.client, ++ amount: remaining, ++ expired_at: now, ++ }, ++ ); ++ ++ Ok(()) ++ } ++ ++ /// Retrieve the status of all milestones for a given job. ++ pub fn get_milestone_status( ++ env: Env, ++ job_id: u64, ++ ) -> Result, EscrowError> { ++ let key = DataKey::Job(job_id); ++ let job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; ++ Self::bump_job_ttl(&env, &key); ++ let mut statuses = Vec::new(&env); ++ for m in job.milestones.iter() { ++ statuses.push_back(m.status); ++ } ++ Ok(statuses) ++ } ++ ++ /// Retrieve the multisig configuration for a given job. ++ pub fn get_multisig_config(env: Env, job_id: u64) -> Result { ++ let config_key = DataKey::MultisigConfig(job_id); ++ let config: MultisigConfig = env ++ .storage() ++ .persistent() ++ .get(&config_key) ++ .ok_or(EscrowError::InvalidInput)?; ++ Self::bump_job_ttl(&env, &config_key); ++ Ok(config) ++ } ++ ++ /// Read-only helper exposing active escrow configuration. ++ pub fn get_escrow_config(env: Env) -> Result<(Address, Address, Option
), EscrowError> { ++ let config: ContractConfig = env ++ .storage() ++ .instance() ++ .get(&DataKey::Config) ++ .ok_or(EscrowError::NotInitialized)?; ++ let job_registry: Option
= env.storage().instance().get(&DataKey::JobRegistry); ++ Self::bump_instance_ttl(&env); ++ Ok((config.admin, config.agent_judge, job_registry)) ++ } ++ ++ ++ ++ /// Configure multisig for a job. Only callable by client during Setup phase. + pub fn configure_multisig( + env: Env, + job_id: u64, +@@ -1032,80 +1607,357 @@ impl EscrowContract { + + Ok(config.current_signatures.len() >= config.required_signatures) + } +-} + +-#[cfg(test)] +-mod test { +- use super::*; +- use soroban_sdk::testutils::Address as _; +- use soroban_sdk::{token, Address, Env}; ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ // SC-ESC-001: Admin fee splitting ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + +- fn setup_token(env: &Env, admin: &Address) -> Address { +- let contract = env.register_stellar_asset_contract_v2(admin.clone()); +- contract.address() +- } ++ /// Admin configures the platform treasury and fee (in basis points). ++ /// Once set, milestone releases route `fee_bps` of each payout to the ++ /// treasury and the remainder to the freelancer. ++ pub fn set_fee_config(env: Env, treasury: Address, fee_bps: u32) -> Result<(), EscrowError> { ++ let config: ContractConfig = env ++ .storage() ++ .instance() ++ .get(&DataKey::Config) ++ .ok_or(EscrowError::NotInitialized)?; ++ config.admin.require_auth(); + +- fn mint(env: &Env, token_addr: &Address, to: &Address) { +- let admin_client = token::StellarAssetClient::new(env, token_addr); +- admin_client.mint(to, &100_000); +- } ++ if fee_bps > MAX_FEE_BPS { ++ return Err(EscrowError::FeeTooHigh); ++ } + +- #[test] +- fn test_happy_path_lifecycle() { +- let env = Env::default(); +- env.mock_all_auths(); ++ let t_config = TreasuryConfig { ++ routing_address: treasury.clone(), ++ fee_bps, ++ }; ++ env.storage().instance().set(&DataKey::Treasury, &t_config); ++ Self::bump_instance_ttl(&env); + +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); ++ env.events().publish( ++ ("escrow", "FeeConfigUpdated"), ++ FeeConfigUpdatedEvent { ++ treasury, ++ fee_bps, ++ updated_at: env.ledger().timestamp(), ++ }, ++ ); + +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); ++ Ok(()) ++ } + +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); ++ /// Returns the active platform fee in basis points (0 when unset). ++ pub fn get_fee_bps(env: Env) -> u32 { ++ Self::bump_instance_ttl(&env); ++ if let Some(config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { ++ config.fee_bps ++ } else { ++ 0 ++ } ++ } + +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.deposit(&1u64, &9000i128); ++ /// Returns the configured treasury address, if any. ++ pub fn get_treasury(env: Env) -> Option
{ ++ Self::bump_instance_ttl(&env); ++ if let Some(config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { ++ Some(config.routing_address) ++ } else { ++ None ++ } ++ } + +- let tc = token::Client::new(&env, &token_addr); +- assert_eq!(tc.balance(&contract_id), 9000); ++ fn exit_reentrancy_guard(env: &Env) { ++ env.storage().instance().remove(&DataKey::Locked); ++ } + +- cc.release_milestone(&1u64, &client); +- assert_eq!(tc.balance(&freelancer), 3000); ++ // ───────────────────────────────────────────────────────────────────── ++ // SC-ESC-002: Dynamic lockup durations ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + +- cc.release_milestone(&1u64, &client); +- assert_eq!(tc.balance(&freelancer), 6000); ++ /// Client sets a custom lockup duration (in seconds) during Setup. The ++ /// job's expiry becomes `created_at + lockup_seconds`. Until expiry the ++ /// client cannot refund (see `refund`). ++ pub fn set_lockup_duration( ++ env: Env, ++ job_id: u64, ++ lockup_seconds: u64, ++ ) -> Result<(), EscrowError> { ++ let key = DataKey::Job(job_id); ++ let mut job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; ++ Self::bump_job_ttl(&env, &key); + +- cc.release_milestone(&1u64, &client); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Completed); +- assert_eq!(tc.balance(&freelancer), 9000); +- assert_eq!(tc.balance(&contract_id), 0); +- } ++ job.client.require_auth(); + +- #[test] +- fn test_variable_milestone_amounts() { +- let env = Env::default(); +- env.mock_all_auths(); ++ if job.status != EscrowStatus::Setup { ++ return Err(EscrowError::InvalidState); ++ } ++ if lockup_seconds == 0 { ++ return Err(EscrowError::InvalidInput); ++ } + +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); ++ let expires_at = job ++ .created_at ++ .checked_add(lockup_seconds) ++ .ok_or(EscrowError::InvalidInput)?; ++ job.expires_at = expires_at; + +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); ++ env.storage().persistent().set(&key, &job); ++ Self::bump_job_ttl(&env, &key); + +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); ++ env.events().publish( ++ ("escrow", "LockupUpdated"), ++ LockupUpdatedEvent { ++ job_id, ++ expires_at, ++ updated_at: env.ledger().timestamp(), ++ }, ++ ); + +- cc.initialize(&admin, &agent_judge); ++ Ok(()) ++ } ++ ++ /// Returns the lockup expiry timestamp for a job. ++ pub fn get_expiry(env: Env, job_id: u64) -> Result { ++ let key = DataKey::Job(job_id); ++ let job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; ++ Ok(job.expires_at) ++ } ++ ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ // SC-ESC-003: Emergency escrow sweep (admin-gated) ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ ++ /// Emergency sweep of the entire locked balance for a job to a rescue ++ /// address. Only the admin may invoke this. It overrides the active state ++ /// machine and bypasses standard release rules for catastrophic recovery. ++ pub fn emergency_sweep( ++ env: Env, ++ job_id: u64, ++ rescue_address: Address, ++ ) -> Result<(), EscrowError> { ++ let config: ContractConfig = env ++ .storage() ++ .instance() ++ .get(&DataKey::Config) ++ .ok_or(EscrowError::NotInitialized)?; ++ config.admin.require_auth(); ++ ++ let key = DataKey::Job(job_id); ++ let mut job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; ++ Self::bump_job_ttl(&env, &key); ++ ++ let remaining = job ++ .total_amount ++ .checked_sub(job.released_amount) ++ .ok_or(EscrowError::InvalidState)?; ++ if remaining <= 0 { ++ return Err(EscrowError::NothingToSweep); ++ } ++ ++ let _guard = enter_reentrancy_guard(&env); ++ ++ // Override the state machine: mark fully released and refunded. ++ job.released_amount = job.total_amount; ++ job.status = EscrowStatus::Refunded; ++ ++ let token_client = token::Client::new(&env, &job.token); ++ token_client.transfer(&env.current_contract_address(), &rescue_address, &remaining); ++ ++ env.storage().persistent().set(&key, &job); ++ Self::bump_job_ttl(&env, &key); ++ ++ Self::exit_reentrancy_guard(&env); ++ ++ env.events().publish( ++ ("escrow", "EmergencySweep"), ++ EmergencySweepEvent { ++ job_id, ++ admin: config.admin, ++ rescue_address, ++ amount: remaining, ++ swept_at: env.ledger().timestamp(), ++ }, ++ ); ++ ++ Ok(()) ++ } ++ ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ // SC-ESC-004: Milestone re-allocation / amendment ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ ++ /// Mutually amend the remaining (unreleased) milestone structure. Both the ++ /// client and the freelancer must authorize. The sum of the new ++ /// allocations must equal the remaining balance. Amendments are rejected ++ /// once the job is disputed. ++ pub fn amend_milestones( ++ env: Env, ++ job_id: u64, ++ new_amounts: Vec, ++ ) -> Result<(), EscrowError> { ++ let key = DataKey::Job(job_id); ++ let mut job: EscrowJob = env ++ .storage() ++ .persistent() ++ .get(&key) ++ .ok_or(EscrowError::JobNotFound)?; ++ Self::bump_job_ttl(&env, &key); ++ ++ // Both parties must cryptographically authorize the restructuring. ++ job.client.require_auth(); ++ job.freelancer.require_auth(); ++ ++ // Locked once disputed (or otherwise inactive). ++ if !(job.status == EscrowStatus::Funded || job.status == EscrowStatus::WorkInProgress) { ++ return Err(EscrowError::InvalidState); ++ } ++ ++ if new_amounts.is_empty() { ++ return Err(EscrowError::InvalidInput); ++ } ++ ++ let mut new_sum: i128 = 0; ++ for amount in new_amounts.iter() { ++ if amount <= 0 { ++ return Err(EscrowError::InvalidInput); ++ } ++ new_sum = new_sum ++ .checked_add(amount) ++ .ok_or(EscrowError::InvalidInput)?; ++ } ++ ++ let remaining = job ++ .total_amount ++ .checked_sub(job.released_amount) ++ .ok_or(EscrowError::InvalidState)?; ++ if new_sum != remaining { ++ return Err(EscrowError::AmountMismatch); ++ } ++ ++ // Preserve already-released milestones; replace the pending set. ++ let mut rebuilt: Vec = Vec::new(&env); ++ for milestone in job.milestones.iter() { ++ if milestone.status == MilestoneStatus::Released { ++ rebuilt.push_back(milestone); ++ } ++ } ++ for amount in new_amounts.iter() { ++ rebuilt.push_back(Milestone { ++ amount, ++ status: MilestoneStatus::Pending, ++ }); ++ } ++ job.milestones = rebuilt; ++ ++ env.storage().persistent().set(&key, &job); ++ Self::bump_job_ttl(&env, &key); ++ ++ env.events().publish( ++ ("escrow", "MilestonesAmended"), ++ MilestonesAmendedEvent { ++ job_id, ++ milestone_count: new_amounts.len(), ++ remaining_amount: remaining, ++ amended_at: env.ledger().timestamp(), ++ }, ++ ); ++ ++ Ok(()) ++ } ++ ++ ++} ++ ++#[cfg(test)] ++mod test { ++ use super::*; ++ use soroban_sdk::testutils::{Address as _, Ledger as _}; ++ use soroban_sdk::{token, Address, Env}; ++ ++ fn setup_token(env: &Env, admin: &Address) -> Address { ++ let contract = env.register_stellar_asset_contract_v2(admin.clone()); ++ contract.address() ++ } ++ ++ fn mint(env: &Env, token_addr: &Address, to: &Address) { ++ let admin_client = token::StellarAssetClient::new(env, token_addr); ++ admin_client.mint(to, &100_000); ++ } ++ ++ fn lock_job_for_test(env: &Env, contract_id: &Address, job_id: u64) { ++ env.as_contract(contract_id, || { ++ EscrowContract::enter_job_lock(env, job_id).unwrap(); ++ }); ++ } ++ ++ #[test] ++ fn test_happy_path_lifecycle() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.deposit(&1u64, &9000i128); ++ ++ let tc = token::Client::new(&env, &token_addr); ++ assert_eq!(tc.balance(&contract_id), 9000); ++ ++ cc.release_milestone(&1u64, &client); ++ assert_eq!(tc.balance(&freelancer), 3000); ++ ++ cc.release_milestone(&1u64, &client); ++ assert_eq!(tc.balance(&freelancer), 6000); ++ ++ cc.release_milestone(&1u64, &client); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Completed); ++ assert_eq!(tc.balance(&freelancer), 9000); ++ assert_eq!(tc.balance(&contract_id), 0); ++ } ++ ++ #[test] ++ fn test_variable_milestone_amounts() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); + + // 3 distinct milestones with different amounts +@@ -1187,7 +2039,685 @@ mod test { + } + + #[test] +- fn test_dispute_50_50_split() { ++ fn test_dispute_50_50_split() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &2500i128); ++ cc.add_milestone(&1u64, &2500i128); ++ cc.add_milestone(&1u64, &2500i128); ++ cc.add_milestone(&1u64, &2500i128); ++ cc.deposit(&1u64, &10_000i128); ++ ++ cc.release_milestone(&1u64, &client); ++ let tc = token::Client::new(&env, &token_addr); ++ assert_eq!(tc.balance(&freelancer), 2500); ++ ++ cc.open_dispute(&1u64, &freelancer); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Disputed); ++ ++ // 50/50 split of remaining (7500): 3750 to freelancer, 3750 to client ++ cc.resolve_dispute(&1u64, &3750i128, &3750i128); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Resolved); ++ assert_eq!(tc.balance(&freelancer), 6250); ++ assert_eq!(tc.balance(&client), 93750); ++ } ++ ++ #[test] ++ fn test_refund() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &2500i128); ++ cc.add_milestone(&1u64, &2500i128); ++ cc.deposit(&1u64, &5000i128); ++ ++ assert_eq!( ++ token::Client::new(&env, &token_addr).balance(&client), ++ 95_000 ++ ); ++ ++ // Lockup must elapse before the client can reclaim funds. ++ let expiry = cc.get_expiry(&1u64); ++ env.ledger().with_mut(|li| li.timestamp = expiry + 1); ++ ++ cc.refund(&1u64, &client); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Refunded); ++ assert_eq!( ++ token::Client::new(&env, &token_addr).balance(&client), ++ 100_000 ++ ); ++ } ++ ++ #[test] ++ // Deposit now returns EscrowError::AmountMismatch which surfaces as host ++ // error code #7. ++ #[should_panic(expected = "Error(Contract, #7)")] ++ fn test_deposit_with_wrong_total_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &500i128); ++ cc.deposit(&1u64, &1000i128); ++ } ++ ++ #[test] ++ // Deposit with no milestones returns EscrowError::InvalidInput -> host ++ // error code #4. ++ #[should_panic(expected = "Error(Contract, #4)")] ++ fn test_deposit_no_milestones_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.deposit(&1u64, &1000i128); ++ } ++ ++ #[test] ++ #[should_panic(expected = "milestone amount exceeds maximum")] ++ fn test_add_milestone_over_max_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ ++ cc.add_milestone(&1u64, &(EscrowContract::MAX_MILESTONE_AMOUNT + 1)); ++ } ++ ++ #[test] ++ #[should_panic(expected = "too many milestones")] ++ fn test_add_milestone_limit_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ ++ for _ in 0..EscrowContract::MAX_MILESTONES_PER_JOB { ++ cc.add_milestone(&1u64, &250i128); ++ } ++ cc.add_milestone(&1u64, &250i128); ++ } ++ ++ #[test] ++ #[should_panic(expected = "job budget exceeds maximum")] ++ fn test_add_milestone_over_max_budget_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &10_000_000_000i128); ++ cc.add_milestone(&1u64, &1i128); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #12)")] ++ fn test_deposit_reentrancy_guard_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &1000i128); ++ ++ env.as_contract(&contract_id, || { ++ env.storage().instance().set(&DataKey::Locked, &()); ++ }); ++ cc.deposit(&1u64, &1000i128); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #12)")] ++ fn test_release_milestone_reentrancy_guard_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &1000i128); ++ cc.deposit(&1u64, &1000i128); ++ ++ env.as_contract(&contract_id, || { ++ env.storage().instance().set(&DataKey::Locked, &()); ++ }); ++ cc.release_milestone(&1u64, &client); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #4)")] ++ fn test_double_create_job_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ let token_addr = Address::generate(&env); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ } ++ ++ #[test] ++ fn test_exhaustive_release_funds_path() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ ++ let total_amount = 10_000i128; ++ cc.add_milestone(&1u64, &2500i128); ++ cc.add_milestone(&1u64, &2500i128); ++ cc.add_milestone(&1u64, &2500i128); ++ cc.add_milestone(&1u64, &2500i128); ++ cc.deposit(&1u64, &total_amount); ++ ++ let tc = token::Client::new(&env, &token_addr); ++ assert_eq!(tc.balance(&contract_id), total_amount); ++ ++ // Release milestones one by one in arbitrary order ++ cc.release_funds(&1u64, &client, &2u32); ++ assert_eq!(tc.balance(&freelancer), 2500); ++ ++ cc.release_funds(&1u64, &client, &0u32); ++ assert_eq!(tc.balance(&freelancer), 5000); ++ ++ cc.release_funds(&1u64, &client, &3u32); ++ assert_eq!(tc.balance(&freelancer), 7500); ++ ++ cc.release_funds(&1u64, &client, &1u32); ++ ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Completed); ++ assert_eq!(tc.balance(&freelancer), total_amount); ++ assert_eq!(tc.balance(&contract_id), 0); ++ } ++ ++ #[test] ++ fn test_raise_dispute_by_client_locks_funds() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.deposit(&1u64, &9000i128); ++ ++ cc.raise_dispute(&1u64, &client); ++ ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Disputed); ++ } ++ ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ // Comprehensive Escrow Deposit & Milestone Release Tests (>90% coverage) ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ ++ #[test] ++ fn test_deposit_success_transitions_to_funded() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &5000i128); ++ ++ let tc = token::Client::new(&env, &token_addr); ++ let client_balance_before = tc.balance(&client); ++ ++ cc.deposit(&1u64, &5000i128); ++ ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Funded); ++ assert_eq!(job.total_amount, 5000); ++ assert_eq!(tc.balance(&contract_id), 5000); ++ assert_eq!(tc.balance(&client), client_balance_before - 5000); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #6)")] ++ fn test_deposit_invalid_state_not_setup() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.deposit(&1u64, &6000i128); ++ ++ // Try to deposit again when job is already Funded ++ cc.deposit(&1u64, &6000i128); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #4)")] ++ fn test_deposit_negative_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &1000i128); ++ ++ cc.deposit(&1u64, &-1000i128); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #4)")] ++ fn test_deposit_zero_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &1000i128); ++ ++ cc.deposit(&1u64, &0i128); ++ } ++ ++ #[test] ++ fn test_release_milestone_sequential_success() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &2000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &10000i128); ++ ++ let tc = token::Client::new(&env, &token_addr); ++ ++ // Release first milestone ++ cc.release_milestone(&1u64, &client); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::WorkInProgress); ++ assert_eq!(job.released_amount, 2000); ++ assert_eq!(tc.balance(&freelancer), 2000); ++ ++ // Release second milestone ++ cc.release_milestone(&1u64, &client); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.released_amount, 5000); ++ assert_eq!(tc.balance(&freelancer), 5000); ++ ++ // Release third milestone - should complete the job ++ cc.release_milestone(&1u64, &client); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Completed); ++ assert_eq!(job.released_amount, 10000); ++ assert_eq!(tc.balance(&freelancer), 10000); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #6)")] ++ fn test_release_milestone_no_pending_milestones() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); ++ ++ // Release the only milestone ++ cc.release_milestone(&1u64, &client); ++ ++ // Try to release again - should fail ++ cc.release_milestone(&1u64, &client); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #3)")] ++ fn test_release_milestone_unauthorized_freelancer() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); ++ ++ // Freelancer cannot release milestones ++ cc.release_milestone(&1u64, &freelancer); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #23)")] ++ fn test_refund_reentrant_lock_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &10_000i128); ++ cc.deposit(&1u64, &10_000i128); ++ ++ lock_job_for_test(&env, &contract_id, 1); ++ cc.refund(&1u64, &client); ++ } ++ ++ #[test] ++ fn test_release_funds_out_of_order() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &1000i128); ++ cc.add_milestone(&1u64, &2000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.deposit(&1u64, &6000i128); ++ ++ let tc = token::Client::new(&env, &token_addr); ++ ++ // Release milestones in non-sequential order ++ cc.release_funds(&1u64, &client, &2u32); ++ assert_eq!(tc.balance(&freelancer), 3000); ++ ++ cc.release_funds(&1u64, &client, &0u32); ++ assert_eq!(tc.balance(&freelancer), 4000); ++ ++ cc.release_funds(&1u64, &client, &1u32); ++ assert_eq!(tc.balance(&freelancer), 6000); ++ ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Completed); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #4)")] ++ fn test_release_funds_invalid_index_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.deposit(&1u64, &3000i128); ++ ++ cc.release_funds(&1u64, &client, &5u32); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #6)")] ++ fn test_release_funds_twice_panics() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); ++ ++ cc.release_funds(&1u64, &client, &0u32); ++ cc.release_funds(&1u64, &client, &0u32); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #3)")] ++ fn test_unauthorized_release_funds_by_freelancer_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1204,30 +2734,14 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &2500i128); +- cc.add_milestone(&1u64, &2500i128); +- cc.add_milestone(&1u64, &2500i128); +- cc.add_milestone(&1u64, &2500i128); +- cc.deposit(&1u64, &10_000i128); +- +- cc.release_milestone(&1u64, &client); +- let tc = token::Client::new(&env, &token_addr); +- assert_eq!(tc.balance(&freelancer), 2500); +- +- cc.open_dispute(&1u64, &freelancer); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Disputed); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); + +- // 50/50 split of remaining (7500): 3750 to freelancer, 3750 to client +- cc.resolve_dispute(&1u64, &3750i128, &3750i128); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Resolved); +- assert_eq!(tc.balance(&freelancer), 6250); +- assert_eq!(tc.balance(&client), 93750); ++ cc.release_funds(&1u64, &freelancer, &0u32); + } + + #[test] +- fn test_refund() { ++ fn test_deposit_event_emitted() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1244,29 +2758,18 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &2500i128); +- cc.add_milestone(&1u64, &2500i128); +- cc.deposit(&1u64, &5000i128); +- +- assert_eq!( +- token::Client::new(&env, &token_addr).balance(&client), +- 95_000 +- ); ++ cc.add_milestone(&1u64, &8000i128); ++ cc.deposit(&1u64, &8000i128); + +- cc.refund(&1u64, &client); ++ // Verify deposit was successful + let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Refunded); +- assert_eq!( +- token::Client::new(&env, &token_addr).balance(&client), +- 100_000 +- ); ++ assert_eq!(job.status, EscrowStatus::Funded); ++ assert_eq!(job.total_amount, 8000); + } + + #[test] +- // Deposit now returns EscrowError::AmountMismatch which surfaces as host +- // error code #7. +- #[should_panic(expected = "Error(Contract, #7)")] +- fn test_deposit_with_wrong_total_panics() { ++ #[should_panic(expected = "Error(Contract, #6)")] ++ fn test_release_milestone_overflow_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1283,15 +2786,22 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &500i128); +- cc.deposit(&1u64, &1000i128); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); ++ ++ // Release once ++ cc.release_milestone(&1u64, &client); ++ ++ // Try to release again - no pending milestones, will fail with InvalidState ++ cc.release_milestone(&1u64, &client); + } + ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ // Comprehensive Escrow Dispute & Resolution Tests (>90% coverage) ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ + #[test] +- // Deposit with no milestones returns EscrowError::InvalidInput -> host +- // error code #4. +- #[should_panic(expected = "Error(Contract, #4)")] +- fn test_deposit_no_milestones_panics() { ++ fn test_raise_dispute_by_freelancer_locks_funds() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1308,28 +2818,45 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.deposit(&1u64, &1000i128); ++ cc.add_milestone(&1u64, &4000i128); ++ cc.add_milestone(&1u64, &6000i128); ++ cc.deposit(&1u64, &10000i128); ++ ++ cc.raise_dispute(&1u64, &freelancer); ++ ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Disputed); + } + + #[test] +- #[should_panic(expected = "job already exists")] +- fn test_double_create_job_panics() { ++ #[should_panic(expected = "Error(Contract, #3)")] ++ fn test_raise_dispute_by_third_party_panics() { + let env = Env::default(); + env.mock_all_auths(); + ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); + let client = Address::generate(&env); + let freelancer = Address::generate(&env); +- let token_addr = Address::generate(&env); ++ let rando = Address::generate(&env); ++ ++ let token_addr = setup_token(&env, &admin); ++ mint(&env, &token_addr, &client); + + let contract_id = env.register_contract(None, EscrowContract); + let cc = EscrowContractClient::new(&env, &contract_id); + ++ cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); ++ ++ cc.raise_dispute(&1u64, &rando); + } + + #[test] +- fn test_exhaustive_release_funds_path() { ++ #[should_panic(expected = "Error(Contract, #6)")] ++ fn test_raise_dispute_on_completed_job_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1346,37 +2873,17 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); ++ cc.add_milestone(&1u64, &10000i128); ++ cc.deposit(&1u64, &10000i128); ++ cc.release_milestone(&1u64, &client); + +- let total_amount = 10_000i128; +- cc.add_milestone(&1u64, &2500i128); +- cc.add_milestone(&1u64, &2500i128); +- cc.add_milestone(&1u64, &2500i128); +- cc.add_milestone(&1u64, &2500i128); +- cc.deposit(&1u64, &total_amount); +- +- let tc = token::Client::new(&env, &token_addr); +- assert_eq!(tc.balance(&contract_id), total_amount); +- +- // Release milestones one by one in arbitrary order +- cc.release_funds(&1u64, &client, &2u32); +- assert_eq!(tc.balance(&freelancer), 2500); +- +- cc.release_funds(&1u64, &client, &0u32); +- assert_eq!(tc.balance(&freelancer), 5000); +- +- cc.release_funds(&1u64, &client, &3u32); +- assert_eq!(tc.balance(&freelancer), 7500); +- +- cc.release_funds(&1u64, &client, &1u32); +- +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Completed); +- assert_eq!(tc.balance(&freelancer), total_amount); +- assert_eq!(tc.balance(&contract_id), 0); ++ // Job is now Completed, cannot dispute ++ cc.raise_dispute(&1u64, &client); + } + + #[test] +- fn test_raise_dispute_by_client_locks_funds() { ++ #[should_panic(expected = "Error(Contract, #3)")] ++ fn test_open_dispute_by_rando_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1384,6 +2891,7 @@ mod test { + let agent_judge = Address::generate(&env); + let client = Address::generate(&env); + let freelancer = Address::generate(&env); ++ let rando = Address::generate(&env); + + let token_addr = setup_token(&env, &admin); + mint(&env, &token_addr, &client); +@@ -1393,23 +2901,15 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.deposit(&1u64, &9000i128); +- +- cc.raise_dispute(&1u64, &client); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); + +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Disputed); ++ cc.open_dispute(&1u64, &rando); + } + +- // ───────────────────────────────────────────────────────────────────────── +- // Comprehensive Escrow Deposit & Milestone Release Tests (>90% coverage) +- // ───────────────────────────────────────────────────────────────────────── +- + #[test] +- fn test_deposit_success_transitions_to_funded() { ++ #[should_panic(expected = "Error(Contract, #6)")] ++ fn test_open_dispute_on_completed_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1427,22 +2927,15 @@ mod test { + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); + cc.add_milestone(&1u64, &5000i128); +- +- let tc = token::Client::new(&env, &token_addr); +- let client_balance_before = tc.balance(&client); +- + cc.deposit(&1u64, &5000i128); ++ cc.release_milestone(&1u64, &client); + +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Funded); +- assert_eq!(job.total_amount, 5000); +- assert_eq!(tc.balance(&contract_id), 5000); +- assert_eq!(tc.balance(&client), client_balance_before - 5000); ++ cc.open_dispute(&1u64, &client); + } + + #[test] +- #[should_panic(expected = "Error(Contract, #6)")] +- fn test_deposit_invalid_state_not_setup() { ++ #[should_panic(expected = "Error(Contract, #23)")] ++ fn test_release_milestone_reentrant_lock_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1459,17 +2952,15 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.deposit(&1u64, &6000i128); ++ cc.add_milestone(&1u64, &10_000i128); ++ cc.deposit(&1u64, &10_000i128); + +- // Try to deposit again when job is already Funded +- cc.deposit(&1u64, &6000i128); ++ lock_job_for_test(&env, &contract_id, 1); ++ cc.release_milestone(&1u64, &client); + } + + #[test] +- #[should_panic(expected = "Error(Contract, #4)")] +- fn test_deposit_negative_panics() { ++ fn test_resolve_dispute_success() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1486,14 +2977,32 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &1000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &4000i128); ++ cc.deposit(&1u64, &10000i128); + +- cc.deposit(&1u64, &-1000i128); ++ // Release one milestone first ++ cc.release_milestone(&1u64, &client); ++ let tc = token::Client::new(&env, &token_addr); ++ assert_eq!(tc.balance(&freelancer), 3000); ++ ++ // Raise dispute ++ cc.raise_dispute(&1u64, &client); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Disputed); ++ ++ // Resolve with 70/30 split of remaining 7000 ++ cc.resolve_dispute(&1u64, &4900i128, &2100i128); ++ ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Resolved); ++ assert_eq!(tc.balance(&freelancer), 7900); // 3000 + 4900 ++ assert_eq!(tc.balance(&client), 92100); // 100000 - 10000 + 2100 + } + + #[test] +- #[should_panic(expected = "Error(Contract, #4)")] +- fn test_deposit_zero_panics() { ++ fn test_resolve_dispute_full_refund_to_client() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1510,13 +3019,23 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &1000i128); ++ cc.add_milestone(&1u64, &8000i128); ++ cc.deposit(&1u64, &8000i128); + +- cc.deposit(&1u64, &0i128); ++ cc.raise_dispute(&1u64, &client); ++ ++ // Full refund to client ++ cc.resolve_dispute(&1u64, &0i128, &8000i128); ++ ++ let tc = token::Client::new(&env, &token_addr); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.status, EscrowStatus::Resolved); ++ assert_eq!(tc.balance(&client), 100000); // Full refund ++ assert_eq!(tc.balance(&freelancer), 0); + } + + #[test] +- fn test_release_milestone_sequential_success() { ++ fn test_resolve_dispute_full_payout_to_freelancer() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1533,37 +3052,23 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &2000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &10000i128); +- +- let tc = token::Client::new(&env, &token_addr); ++ cc.add_milestone(&1u64, &6000i128); ++ cc.deposit(&1u64, &6000i128); + +- // Release first milestone +- cc.release_milestone(&1u64, &client); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::WorkInProgress); +- assert_eq!(job.released_amount, 2000); +- assert_eq!(tc.balance(&freelancer), 2000); ++ cc.raise_dispute(&1u64, &freelancer); + +- // Release second milestone +- cc.release_milestone(&1u64, &client); +- let job = cc.get_job(&1u64); +- assert_eq!(job.released_amount, 5000); +- assert_eq!(tc.balance(&freelancer), 5000); ++ // Full payout to freelancer ++ cc.resolve_dispute(&1u64, &6000i128, &0i128); + +- // Release third milestone - should complete the job +- cc.release_milestone(&1u64, &client); ++ let tc = token::Client::new(&env, &token_addr); + let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Completed); +- assert_eq!(job.released_amount, 10000); +- assert_eq!(tc.balance(&freelancer), 10000); ++ assert_eq!(job.status, EscrowStatus::Resolved); ++ assert_eq!(tc.balance(&freelancer), 6000); + } + + #[test] +- #[should_panic(expected = "Error(Contract, #6)")] +- fn test_release_milestone_no_pending_milestones() { ++ #[should_panic] ++ fn test_release_funds_reentrant_lock_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1580,19 +3085,16 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- // Release the only milestone +- cc.release_milestone(&1u64, &client); ++ cc.add_milestone(&1u64, &10_000i128); ++ cc.deposit(&1u64, &10_000i128); + +- // Try to release again - should fail +- cc.release_milestone(&1u64, &client); ++ lock_job_for_test(&env, &contract_id, 1); ++ cc.release_funds(&1u64, &client, &0u32); + } + +- #[test] +- #[should_panic(expected = "Error(Contract, #3)")] +- fn test_release_milestone_unauthorized_freelancer() { ++ #[test] ++ #[should_panic(expected = "Error(Contract, #6)")] ++ fn test_resolve_dispute_invalid_state_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1612,12 +3114,12 @@ mod test { + cc.add_milestone(&1u64, &5000i128); + cc.deposit(&1u64, &5000i128); + +- // Freelancer cannot release milestones +- cc.release_milestone(&1u64, &freelancer); ++ // Try to resolve without raising dispute first ++ cc.resolve_dispute(&1u64, &2500i128, &2500i128); + } + + #[test] +- fn test_release_funds_explicit_index() { ++ fn test_raise_dispute_blocks_release_funds() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1634,30 +3136,27 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &1000i128); +- cc.add_milestone(&1u64, &2000i128); + cc.add_milestone(&1u64, &3000i128); +- cc.deposit(&1u64, &6000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.deposit(&1u64, &9000i128); + ++ // Release first milestone ++ cc.release_milestone(&1u64, &client); + let tc = token::Client::new(&env, &token_addr); +- +- // Release milestones in non-sequential order +- cc.release_funds(&1u64, &client, &2u32); + assert_eq!(tc.balance(&freelancer), 3000); + +- cc.release_funds(&1u64, &client, &0u32); +- assert_eq!(tc.balance(&freelancer), 4000); +- +- cc.release_funds(&1u64, &client, &1u32); +- assert_eq!(tc.balance(&freelancer), 6000); ++ // Raise dispute ++ cc.raise_dispute(&1u64, &freelancer); + ++ // Verify job is in Disputed state + let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Completed); ++ assert_eq!(job.status, EscrowStatus::Disputed); + } + + #[test] +- #[should_panic(expected = "invalid milestone index")] +- fn test_release_funds_invalid_index_panics() { ++ #[should_panic(expected = "Error(Contract, #3)")] ++ fn test_refund_by_non_client_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1674,41 +3173,31 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.deposit(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); + +- cc.release_funds(&1u64, &client, &5u32); ++ // Freelancer cannot refund ++ cc.refund(&1u64, &freelancer); + } + + #[test] +- #[should_panic(expected = "Error(WasmVm, InvalidAction)")] +- fn test_release_funds_twice_panics() { ++ #[should_panic(expected = "Error(Contract, #5)")] ++ fn test_get_job_not_found_panics() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); + let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); + + let contract_id = env.register_contract(None, EscrowContract); + let cc = EscrowContractClient::new(&env, &contract_id); + + cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); +- +- cc.release_funds(&1u64, &client, &0u32); +- cc.release_funds(&1u64, &client, &0u32); ++ cc.get_job(&999u64); + } + + #[test] +- #[should_panic(expected = "only client can release")] +- fn test_unauthorized_release_funds_by_freelancer_panics() { ++ fn test_cancel_brief_in_setup_marks_refunded_without_transfer() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1716,23 +3205,22 @@ mod test { + let agent_judge = Address::generate(&env); + let client = Address::generate(&env); + let freelancer = Address::generate(&env); +- + let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); + + let contract_id = env.register_contract(None, EscrowContract); + let cc = EscrowContractClient::new(&env, &contract_id); + + cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); ++ cc.create_job(&77u64, &client, &freelancer, &token_addr); ++ cc.cancel_brief(&77u64, &client); + +- cc.release_funds(&1u64, &freelancer, &0u32); ++ let job = cc.get_job(&77u64); ++ assert_eq!(job.status, EscrowStatus::Refunded); ++ assert_eq!(job.released_amount, 0); + } + + #[test] +- fn test_deposit_event_emitted() { ++ fn test_dispute_event_emission() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1749,18 +3237,23 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &8000i128); +- cc.deposit(&1u64, &8000i128); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); + +- // Verify deposit was successful ++ // Raise dispute and verify state ++ cc.raise_dispute(&1u64, &client); + let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Funded); +- assert_eq!(job.total_amount, 8000); ++ assert_eq!(job.status, EscrowStatus::Disputed); ++ assert_eq!(job.total_amount, 5000); ++ assert_eq!(job.released_amount, 0); + } + ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ // SC-ESC-005: Token Decimals Compatibility ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ + #[test] +- #[should_panic(expected = "Error(Contract, #6)")] +- fn test_release_milestone_overflow_panics() { ++ fn test_token_decimals_stored_on_deposit() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1780,48 +3273,56 @@ mod test { + cc.add_milestone(&1u64, &5000i128); + cc.deposit(&1u64, &5000i128); + +- // Release once +- cc.release_milestone(&1u64, &client); +- +- // Try to release again - no pending milestones, will fail with InvalidState +- cc.release_milestone(&1u64, &client); ++ // Stellar asset contract has 7 decimals; verify captured during deposit ++ assert_eq!(cc.get_token_decimals(&1u64), 7); + } + +- // ───────────────────────────────────────────────────────────────────────── +- // Comprehensive Escrow Dispute & Resolution Tests (>90% coverage) +- // ───────────────────────────────────────────────────────────────────────── ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ // SC-ESC-007: Instance Storage Optimisation ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ + + #[test] +- fn test_raise_dispute_by_freelancer_locks_funds() { ++ fn test_instance_config_getters() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); + let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); +- +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); + + let contract_id = env.register_contract(None, EscrowContract); + let cc = EscrowContractClient::new(&env, &contract_id); + + cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &4000i128); +- cc.add_milestone(&1u64, &6000i128); +- cc.deposit(&1u64, &10000i128); ++ assert_eq!(cc.get_admin(), admin); ++ assert_eq!(cc.get_agent_judge(), agent_judge); ++ } + +- cc.raise_dispute(&1u64, &freelancer); ++ #[test] ++ fn test_set_agent_judge_updates_packed_config() { ++ let env = Env::default(); ++ env.mock_all_auths(); + +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Disputed); ++ let admin = Address::generate(&env); ++ let agent_judge = Address::generate(&env); ++ let new_judge = Address::generate(&env); ++ ++ let contract_id = env.register_contract(None, EscrowContract); ++ let cc = EscrowContractClient::new(&env, &contract_id); ++ ++ cc.initialize(&admin, &agent_judge); ++ cc.set_agent_judge(&new_judge); ++ ++ assert_eq!(cc.get_agent_judge(), new_judge); ++ assert_eq!(cc.get_admin(), admin); + } + ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ // SC-ESC-008: Double-Spending Prevention ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ + #[test] +- #[should_panic(expected = "unauthorized: only client or freelancer can raise a dispute")] +- fn test_raise_dispute_by_third_party_panics() { ++ #[should_panic(expected = "Error(Contract, #6)")] ++ fn test_double_release_milestone_is_blocked() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1829,7 +3330,6 @@ mod test { + let agent_judge = Address::generate(&env); + let client = Address::generate(&env); + let freelancer = Address::generate(&env); +- let rando = Address::generate(&env); + + let token_addr = setup_token(&env, &admin); + mint(&env, &token_addr, &client); +@@ -1842,12 +3342,13 @@ mod test { + cc.add_milestone(&1u64, &5000i128); + cc.deposit(&1u64, &5000i128); + +- cc.raise_dispute(&1u64, &rando); ++ cc.release_milestone(&1u64, &client); ++ // Job is now Completed; status guard fires first -> InvalidState (#6) ++ cc.release_milestone(&1u64, &client); + } + + #[test] +- #[should_panic(expected = "dispute cannot be raised: job is not in active state")] +- fn test_raise_dispute_on_completed_job_panics() { ++ fn test_released_amount_matches_transferred_on_sequential_release() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1864,17 +3365,28 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &10000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &3000i128); ++ cc.add_milestone(&1u64, &4000i128); + cc.deposit(&1u64, &10000i128); ++ ++ let tc = token::Client::new(&env, &token_addr); ++ + cc.release_milestone(&1u64, &client); ++ assert_eq!(cc.get_job(&1u64).released_amount, tc.balance(&freelancer)); + +- // Job is now Completed, cannot dispute +- cc.raise_dispute(&1u64, &client); ++ cc.release_milestone(&1u64, &client); ++ assert_eq!(cc.get_job(&1u64).released_amount, tc.balance(&freelancer)); ++ ++ cc.release_milestone(&1u64, &client); ++ let job = cc.get_job(&1u64); ++ assert_eq!(job.released_amount, job.total_amount); ++ assert_eq!(job.released_amount, tc.balance(&freelancer)); + } + + #[test] +- #[should_panic(expected = "Error(Contract, #3)")] +- fn test_open_dispute_by_rando_panics() { ++ #[should_panic(expected = "Error(Contract, #12)")] ++ fn test_reentrant_release_milestone_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1882,7 +3394,6 @@ mod test { + let agent_judge = Address::generate(&env); + let client = Address::generate(&env); + let freelancer = Address::generate(&env); +- let rando = Address::generate(&env); + + let token_addr = setup_token(&env, &admin); + mint(&env, &token_addr, &client); +@@ -1895,12 +3406,15 @@ mod test { + cc.add_milestone(&1u64, &5000i128); + cc.deposit(&1u64, &5000i128); + +- cc.open_dispute(&1u64, &rando); ++ env.as_contract(&contract_id, || { ++ env.storage().instance().set(&DataKey::Locked, &()); ++ }); ++ cc.release_milestone(&1u64, &client); + } + + #[test] +- #[should_panic(expected = "Error(Contract, #6)")] +- fn test_open_dispute_on_completed_panics() { ++ #[should_panic(expected = "Error(Contract, #12)")] ++ fn test_reentrant_release_funds_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1919,13 +3433,16 @@ mod test { + cc.create_job(&1u64, &client, &freelancer, &token_addr); + cc.add_milestone(&1u64, &5000i128); + cc.deposit(&1u64, &5000i128); +- cc.release_milestone(&1u64, &client); + +- cc.open_dispute(&1u64, &client); ++ env.as_contract(&contract_id, || { ++ env.storage().instance().set(&DataKey::Locked, &()); ++ }); ++ cc.release_funds(&1u64, &client, &0u32); + } + + #[test] +- fn test_raise_dispute_then_resolve() { ++ #[should_panic(expected = "Error(Contract, #12)")] ++ fn test_reentrant_refund_panics() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1942,32 +3459,21 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &4000i128); +- cc.deposit(&1u64, &10000i128); +- +- // Release one milestone first +- cc.release_milestone(&1u64, &client); +- let tc = token::Client::new(&env, &token_addr); +- assert_eq!(tc.balance(&freelancer), 3000); +- +- // Raise dispute +- cc.raise_dispute(&1u64, &client); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Disputed); +- +- // Resolve with 70/30 split of remaining 7000 +- cc.resolve_dispute(&1u64, &4900i128, &2100i128); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); + +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Resolved); +- assert_eq!(tc.balance(&freelancer), 7900); // 3000 + 4900 +- assert_eq!(tc.balance(&client), 92100); // 100000 - 10000 + 2100 ++ env.as_contract(&contract_id, || { ++ env.storage().instance().set(&DataKey::Locked, &()); ++ }); ++ cc.refund(&1u64, &client); + } + ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ // SC-ESC-009: Dispute Timeout Enforcement ++ // ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ ++ + #[test] +- fn test_resolve_dispute_full_refund_to_client() { ++ fn test_dispute_deadline_set_on_raise() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -1984,23 +3490,17 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &8000i128); +- cc.deposit(&1u64, &8000i128); ++ cc.add_milestone(&1u64, &5000i128); ++ cc.deposit(&1u64, &5000i128); + ++ let ts_before = env.ledger().timestamp(); + cc.raise_dispute(&1u64, &client); + +- // Full refund to client +- cc.resolve_dispute(&1u64, &0i128, &8000i128); +- +- let tc = token::Client::new(&env, &token_addr); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Resolved); +- assert_eq!(tc.balance(&client), 100000); // Full refund +- assert_eq!(tc.balance(&freelancer), 0); ++ assert_eq!(cc.get_dispute_deadline(&1u64), ts_before + 7 * 24 * 60 * 60); + } + + #[test] +- fn test_resolve_dispute_full_payout_to_freelancer() { ++ fn test_resolve_before_deadline_succeeds() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -2020,20 +3520,18 @@ mod test { + cc.add_milestone(&1u64, &6000i128); + cc.deposit(&1u64, &6000i128); + +- cc.raise_dispute(&1u64, &freelancer); ++ cc.raise_dispute(&1u64, &client); + +- // Full payout to freelancer +- cc.resolve_dispute(&1u64, &6000i128, &0i128); ++ env.ledger() ++ .set_timestamp(env.ledger().timestamp() + 3 * 24 * 60 * 60); + +- let tc = token::Client::new(&env, &token_addr); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Resolved); +- assert_eq!(tc.balance(&freelancer), 6000); ++ cc.resolve_dispute(&1u64, &6000i128, &0i128); ++ assert_eq!(cc.get_job(&1u64).status, EscrowStatus::Resolved); + } + + #[test] +- #[should_panic(expected = "job not disputed")] +- fn test_resolve_dispute_not_disputed_panics() { ++ #[should_panic(expected = "Error(Contract, #20)")] ++ fn test_resolve_after_deadline_fails() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -2053,12 +3551,15 @@ mod test { + cc.add_milestone(&1u64, &5000i128); + cc.deposit(&1u64, &5000i128); + +- // Try to resolve without raising dispute first +- cc.resolve_dispute(&1u64, &2500i128, &2500i128); ++ cc.raise_dispute(&1u64, &client); ++ env.ledger() ++ .set_timestamp(env.ledger().timestamp() + 8 * 24 * 60 * 60); ++ ++ cc.resolve_dispute(&1u64, &5000i128, &0i128); // DisputeResolutionExpired (#18) + } + + #[test] +- fn test_raise_dispute_blocks_release_funds() { ++ fn test_expire_dispute_refunds_client_after_deadline() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -2075,68 +3576,31 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.add_milestone(&1u64, &3000i128); +- cc.deposit(&1u64, &9000i128); ++ cc.add_milestone(&1u64, &8000i128); ++ cc.deposit(&1u64, &8000i128); + +- // Release first milestone +- cc.release_milestone(&1u64, &client); + let tc = token::Client::new(&env, &token_addr); +- assert_eq!(tc.balance(&freelancer), 3000); +- +- // Raise dispute +- cc.raise_dispute(&1u64, &freelancer); +- +- // Verify job is in Disputed state +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Disputed); +- } +- +- #[test] +- #[should_panic(expected = "Error(Contract, #3)")] +- fn test_refund_by_non_client_panics() { +- let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- let client = Address::generate(&env); +- let freelancer = Address::generate(&env); ++ assert_eq!(tc.balance(&client), 92000); + +- let token_addr = setup_token(&env, &admin); +- mint(&env, &token_addr, &client); +- +- let contract_id = env.register_contract(None, EscrowContract); +- let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); ++ cc.raise_dispute(&1u64, &client); ++ env.ledger() ++ .set_timestamp(env.ledger().timestamp() + 8 * 24 * 60 * 60); + +- // Freelancer cannot refund +- cc.refund(&1u64, &freelancer); ++ cc.expire_dispute(&1u64); ++ assert_eq!(cc.get_job(&1u64).status, EscrowStatus::Refunded); ++ assert_eq!(tc.balance(&client), 100000); + } + + #[test] +- #[should_panic(expected = "job not found")] +- fn test_get_job_not_found_panics() { ++ fn test_version() { + let env = Env::default(); +- env.mock_all_auths(); +- +- let admin = Address::generate(&env); +- let agent_judge = Address::generate(&env); +- + let contract_id = env.register_contract(None, EscrowContract); + let cc = EscrowContractClient::new(&env, &contract_id); +- +- cc.initialize(&admin, &agent_judge); +- cc.get_job(&999u64); ++ assert_eq!(cc.version(), 1); + } + + #[test] +- fn test_dispute_event_emission() { ++ fn test_get_multisig_config() { + let env = Env::default(); + env.mock_all_auths(); + +@@ -2144,6 +3608,8 @@ mod test { + let agent_judge = Address::generate(&env); + let client = Address::generate(&env); + let freelancer = Address::generate(&env); ++ let signer1 = Address::generate(&env); ++ let signer2 = Address::generate(&env); + + let token_addr = setup_token(&env, &admin); + mint(&env, &token_addr, &client); +@@ -2153,14 +3619,12 @@ mod test { + + cc.initialize(&admin, &agent_judge); + cc.create_job(&1u64, &client, &freelancer, &token_addr); +- cc.add_milestone(&1u64, &5000i128); +- cc.deposit(&1u64, &5000i128); + +- // Raise dispute and verify state +- cc.raise_dispute(&1u64, &client); +- let job = cc.get_job(&1u64); +- assert_eq!(job.status, EscrowStatus::Disputed); +- assert_eq!(job.total_amount, 5000); +- assert_eq!(job.released_amount, 0); ++ let signers = soroban_sdk::vec![&env, signer1.clone(), signer2.clone()]; ++ cc.configure_multisig(&1u64, &signers, &2u32); ++ ++ let config = cc.get_multisig_config(&1u64); ++ assert_eq!(config.required_signatures, 2); ++ assert_eq!(config.signers.len(), 2); + } + } +diff --git a/contracts/escrow/test_output.log b/contracts/escrow/test_output.log +new file mode 100644 +index 0000000..78b4ab3 +--- /dev/null ++++ b/contracts/escrow/test_output.log +@@ -0,0 +1,338 @@ ++warning: unused variable: `job_id` ++ --> contracts/escrow/src/lib.rs:375:35 ++ | ++375 | ...yout_with_fee(env: &Env, job_id: u64, job: &EscrowJob, amount: i128)... ++ | ^^^^^^ help: if this is intentional, prefix it with an underscore: `_job_id` ++ | ++ = note: `#[warn(unused_variables)]` on by default ++ ++warning: variable does not need to be mutable ++ --> contracts/escrow/src/lib.rs:1178:13 ++ | ++1178 | let mut job: EscrowJob = env ++ | ----^^^ ++ | | ++ | help: remove this `mut` ++ | ++ = note: `#[warn(unused_mut)]` on by default ++ ++warning: `escrow` (lib) generated 2 warnings (run `cargo fix --lib -p escrow` to apply 1 suggestion) ++warning: `escrow` (lib test) generated 2 warnings (2 duplicates) ++ Finished `test` profile [unoptimized + debuginfo] target(s) in 0.81s ++ Running unittests src/lib.rs (/home/kaycee/Desktop/OS/lance/target/debug/deps/escrow-28de2df4515832fa) ++ ++running 60 tests ++test test::test_cancel_brief_in_setup_marks_refunded_without_transfer ... ok ++test test::test_deposit_event_emitted ... ok ++test test::test_add_milestone_over_max_panics - should panic ... ok ++test test::test_add_milestone_over_max_budget_panics - should panic ... ok ++test test::test_deposit_invalid_state_not_setup - should panic ... ok ++test test::test_deposit_no_milestones_panics - should panic ... ok ++test test::test_deposit_negative_panics - should panic ... ok ++test test::test_add_milestone_limit_panics - should panic ... ok ++test test::test_deposit_success_transitions_to_funded ... ok ++test test::test_deposit_with_wrong_total_panics - should panic ... ok ++test test::test_deposit_zero_panics - should panic ... ok ++test test::test_deposit_reentrancy_guard_panics - should panic ... ok ++test test::test_dispute_deadline_set_on_raise ... ok ++test test::test_double_create_job_panics - should panic ... ok ++test test::test_deposit_with_wrong_total_panics_2 - should panic ... FAILED ++test test::test_double_init - should panic ... ok ++test test::test_dispute_event_emission ... ok ++test test::test_double_release_milestone_is_blocked - should panic ... ok ++test test::test_expire_dispute_refunds_client_after_deadline ... ok ++test test::test_dispute_50_50_split ... ok ++test test::test_get_job_not_found_panics - should panic ... ok ++test test::test_instance_config_getters ... ok ++test test::test_get_multisig_config ... ok ++test test::test_open_dispute_on_completed_panics - should panic ... ok ++test test::test_open_dispute_by_rando_panics - should panic ... ok ++test test::test_exhaustive_release_funds_path ... ok ++test test::test_raise_dispute_by_freelancer_locks_funds ... ok ++test test::test_happy_path_lifecycle ... ok ++test test::test_raise_dispute_blocks_release_funds ... ok ++test test::test_raise_dispute_by_client_locks_funds ... ok ++test test::test_reentrant_refund_panics - should panic ... FAILED ++test test::test_raise_dispute_by_third_party_panics - should panic ... ok ++test test::test_raise_dispute_on_completed_job_panics - should panic ... ok ++test test::test_refund ... FAILED ++test test::test_reentrant_release_funds_panics - should panic ... ok ++test test::test_refund_reentrant_lock_panics - should panic ... FAILED ++test test::test_release_funds_invalid_index_panics_2 - should panic ... FAILED ++test test::test_reentrant_release_milestone_panics - should panic ... ok ++test test::test_refund_by_non_client_panics - should panic ... ok ++test test::test_release_funds_reentrant_lock_panics - should panic ... ok ++test test::test_release_funds_invalid_index_panics - should panic ... ok ++test test::test_release_funds_twice_panics - should panic ... ok ++test test::test_release_milestone_no_pending_milestones - should panic ... ok ++test test::test_release_milestone_reentrancy_guard_panics - should panic ... ok ++test test::test_release_milestone_overflow_panics - should panic ... ok ++test test::test_release_milestone_reentrant_lock_panics - should panic ... FAILED ++test test::test_release_milestone_unauthorized_freelancer - should panic ... ok ++test test::test_resolve_after_deadline_fails - should panic ... ok ++test test::test_released_amount_matches_transferred_on_sequential_release ... ok ++test test::test_release_milestone_sequential_success ... ok ++test test::test_resolve_before_deadline_succeeds ... ok ++test test::test_set_agent_judge_updates_packed_config ... ok ++test test::test_resolve_dispute_full_payout_to_freelancer ... ok ++test test::test_token_decimals_stored_on_deposit ... ok ++test test::test_resolve_dispute_panics - should panic ... FAILED ++test test::test_resolve_dispute_full_refund_to_client ... ok ++test test::test_version ... ok ++test test::test_unauthorized_release - should panic ... ok ++test test::test_unauthorized_release_funds_by_freelancer_panics - should panic ... ok ++test test::test_variable_milestone_amounts ... ok ++ ++failures: ++ ++---- test::test_deposit_with_wrong_total_panics_2 stdout ---- ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 1000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 2000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 3000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 6000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["release_funds: job {} amount {}", 1, 3000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["release_funds: job {} amount {}", 1, 1000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["release_funds: job {} amount {}", 1, 2000] ++Writing test snapshot file for test "test::test_deposit_with_wrong_total_panics_2" to "test_snapshots/test/test_deposit_with_wrong_total_panics_2.1.json". ++note: test did not panic as expected at contracts/escrow/src/lib.rs:2628:8 ++---- test::test_reentrant_refund_panics stdout ---- ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 5000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 5000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["refund: job {} amount {}", 1, 5000] ++Writing test snapshot file for test "test::test_reentrant_refund_panics" to "test_snapshots/test/test_reentrant_refund_panics.1.json". ++note: test did not panic as expected at contracts/escrow/src/lib.rs:3445:8 ++---- test::test_refund stdout ---- ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 2500] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 2500] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 5000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["refund: job {} amount {}", 1, 5000] ++ ++thread 'test::test_refund' panicked at contracts/escrow/src/lib.rs:2110:9: ++assertion `left == right` failed ++ left: Funded ++ right: Refunded ++Writing test snapshot file for test "test::test_refund" to "test_snapshots/test/test_refund.1.json". ++ ++---- test::test_refund_reentrant_lock_panics stdout ---- ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 10000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] ++ ++thread 'test::test_refund_reentrant_lock_panics' panicked at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:768:9: ++HostError: Error(Contract, #23) ++ ++Event log (newest first): ++ 0: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:"escalating error to panic" ++ 1: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:["contract call failed", refund, [1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]] ++ 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #23)], data:"escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, refund], data:Error(Contract, #23) ++ 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), refund], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M] ++ 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void ++ 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Deposit"], data:{amount: 10000, deposited_at: 0, job_id: 1} ++ 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] ++ 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void ++ 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"], data:10000 ++ 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 10000] ++ 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7 ++ 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void ++ 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 10000] ++ 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void ++ 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 10000] ++ 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 10000] ++ 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void ++ 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++ 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG] ++ 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void ++ 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Initialized"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0] ++ 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++ 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++ 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void ++ 25: ... 7 events elided ... ++ ++Backtrace (newest first): ++ 0: ::escalate_error_to_panic ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31 ++ 1: soroban_sdk::env::internal::reject_err::{{closure}} ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27 ++ 2: core::result::Result::map_err ++ at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27 ++ 3: soroban_sdk::env::internal::reject_err ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11 ++ 4: ::call ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13 ++ 5: soroban_sdk::env::Env::invoke_contract ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18 ++ 6: escrow::EscrowContractClient::refund ++ at src/lib.rs:335:1 ++ 7: escrow::test::test_refund_reentrant_lock_panics ++ at src/lib.rs:2621:12 ++ 8: escrow::test::test_refund_reentrant_lock_panics::{{closure}} ++ at src/lib.rs:2600:43 ++ 9: core::ops::function::FnOnce::call_once ++ at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5 ++ ++ ++Writing test snapshot file for test "test::test_refund_reentrant_lock_panics" to "test_snapshots/test/test_refund_reentrant_lock_panics.1.json". ++note: panic did not contain expected string ++ panic message: "HostError: Error(Contract, #23)\n\nEvent log (newest first):\n 0: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:\"escalating error to panic\"\n 1: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:[\"contract call failed\", refund, [1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]]\n 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #23)], data:\"escalating Ok(ScErrorType::Contract) frame-exit to Err\"\n 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, refund], data:Error(Contract, #23)\n 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), refund], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]\n 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void\n 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Deposit\"], data:{amount: 10000, deposited_at: 0, job_id: 1}\n 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"deposit: job {} amount {}\", 1, 10000]\n 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void\n 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, \"aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV\"], data:10000\n 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 10000]\n 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7\n 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void\n 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 10000]\n 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void\n 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"add_milestone: job {} amount {}\", 1, 10000]\n 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 10000]\n 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void\n 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"create_job: id {} client {} freelancer {}\", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4]\n 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG]\n 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void\n 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Initialized\"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0]\n 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"Escrow initialized with admin: {} and agent_judge: {}\", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void\n 25: ... 7 events elided ...\n\nBacktrace (newest first):\n 0: ::escalate_error_to_panic\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31\n 1: soroban_sdk::env::internal::reject_err::{{closure}}\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27\n 2: core::result::Result::map_err\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27\n 3: soroban_sdk::env::internal::reject_err\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11\n 4: ::call\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13\n 5: soroban_sdk::env::Env::invoke_contract\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18\n 6: escrow::EscrowContractClient::refund\n at src/lib.rs:335:1\n 7: escrow::test::test_refund_reentrant_lock_panics\n at src/lib.rs:2621:12\n 8: escrow::test::test_refund_reentrant_lock_panics::{{closure}}\n at src/lib.rs:2600:43\n 9: core::ops::function::FnOnce::call_once\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5\n\n" ++ expected substring: "Error(Contract, #11)" ++---- test::test_release_funds_invalid_index_panics_2 stdout ---- ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 5000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 5000] ++ ++thread 'test::test_release_funds_invalid_index_panics_2' panicked at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:768:9: ++HostError: Error(Contract, #6) ++ ++Event log (newest first): ++ 0: [Diagnostic Event] topics:[error, Error(Contract, #6)], data:"escalating error to panic" ++ 1: [Diagnostic Event] topics:[error, Error(Contract, #6)], data:["contract call failed", resolve_dispute, [1, 2500, 2500]] ++ 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #6)], data:"escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, resolve_dispute], data:Error(Contract, #6) ++ 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), resolve_dispute], data:[1, 2500, 2500] ++ 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void ++ 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Deposit"], data:{amount: 5000, deposited_at: 0, job_id: 1} ++ 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 5000] ++ 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void ++ 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"], data:5000 ++ 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 5000] ++ 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7 ++ 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void ++ 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 5000] ++ 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void ++ 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 5000] ++ 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 5000] ++ 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void ++ 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++ 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG] ++ 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void ++ 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Initialized"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0] ++ 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++ 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++ 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void ++ 25: ... 7 events elided ... ++ ++Backtrace (newest first): ++ 0: ::escalate_error_to_panic ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31 ++ 1: soroban_sdk::env::internal::reject_err::{{closure}} ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27 ++ 2: core::result::Result::map_err ++ at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27 ++ 3: soroban_sdk::env::internal::reject_err ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11 ++ 4: ::call ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13 ++ 5: soroban_sdk::env::Env::invoke_contract ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18 ++ 6: escrow::EscrowContractClient::resolve_dispute ++ at src/lib.rs:335:1 ++ 7: escrow::test::test_release_funds_invalid_index_panics_2 ++ at src/lib.rs:3118:12 ++ 8: escrow::test::test_release_funds_invalid_index_panics_2::{{closure}} ++ at src/lib.rs:3097:51 ++ 9: core::ops::function::FnOnce::call_once ++ at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5 ++ ++ ++Writing test snapshot file for test "test::test_release_funds_invalid_index_panics_2" to "test_snapshots/test/test_release_funds_invalid_index_panics_2.1.json". ++note: panic did not contain expected string ++ panic message: "HostError: Error(Contract, #6)\n\nEvent log (newest first):\n 0: [Diagnostic Event] topics:[error, Error(Contract, #6)], data:\"escalating error to panic\"\n 1: [Diagnostic Event] topics:[error, Error(Contract, #6)], data:[\"contract call failed\", resolve_dispute, [1, 2500, 2500]]\n 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #6)], data:\"escalating Ok(ScErrorType::Contract) frame-exit to Err\"\n 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, resolve_dispute], data:Error(Contract, #6)\n 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), resolve_dispute], data:[1, 2500, 2500]\n 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void\n 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Deposit\"], data:{amount: 5000, deposited_at: 0, job_id: 1}\n 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"deposit: job {} amount {}\", 1, 5000]\n 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void\n 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, \"aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV\"], data:5000\n 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 5000]\n 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7\n 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void\n 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 5000]\n 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void\n 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"add_milestone: job {} amount {}\", 1, 5000]\n 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 5000]\n 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void\n 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"create_job: id {} client {} freelancer {}\", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4]\n 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG]\n 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void\n 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Initialized\"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0]\n 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"Escrow initialized with admin: {} and agent_judge: {}\", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void\n 25: ... 7 events elided ...\n\nBacktrace (newest first):\n 0: ::escalate_error_to_panic\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31\n 1: soroban_sdk::env::internal::reject_err::{{closure}}\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27\n 2: core::result::Result::map_err\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27\n 3: soroban_sdk::env::internal::reject_err\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11\n 4: ::call\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13\n 5: soroban_sdk::env::Env::invoke_contract\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18\n 6: escrow::EscrowContractClient::resolve_dispute\n at src/lib.rs:335:1\n 7: escrow::test::test_release_funds_invalid_index_panics_2\n at src/lib.rs:3118:12\n 8: escrow::test::test_release_funds_invalid_index_panics_2::{{closure}}\n at src/lib.rs:3097:51\n 9: core::ops::function::FnOnce::call_once\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5\n\n" ++ expected substring: "invalid milestone index" ++---- test::test_release_milestone_reentrant_lock_panics stdout ---- ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 10000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] ++ ++thread 'test::test_release_milestone_reentrant_lock_panics' panicked at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:768:9: ++HostError: Error(Contract, #23) ++ ++Event log (newest first): ++ 0: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:"escalating error to panic" ++ 1: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:["contract call failed", release_milestone, [1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]] ++ 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #23)], data:"escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, release_milestone], data:Error(Contract, #23) ++ 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), release_milestone], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M] ++ 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void ++ 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Deposit"], data:{amount: 10000, deposited_at: 0, job_id: 1} ++ 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] ++ 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void ++ 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"], data:10000 ++ 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 10000] ++ 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7 ++ 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void ++ 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 10000] ++ 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void ++ 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 10000] ++ 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 10000] ++ 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void ++ 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++ 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG] ++ 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void ++ 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Initialized"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0] ++ 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++ 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++ 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void ++ 25: ... 7 events elided ... ++ ++Backtrace (newest first): ++ 0: ::escalate_error_to_panic ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31 ++ 1: soroban_sdk::env::internal::reject_err::{{closure}} ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27 ++ 2: core::result::Result::map_err ++ at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27 ++ 3: soroban_sdk::env::internal::reject_err ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11 ++ 4: ::call ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13 ++ 5: soroban_sdk::env::Env::invoke_contract ++ at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18 ++ 6: escrow::EscrowContractClient::release_milestone ++ at src/lib.rs:335:1 ++ 7: escrow::test::test_release_milestone_reentrant_lock_panics ++ at src/lib.rs:2958:12 ++ 8: escrow::test::test_release_milestone_reentrant_lock_panics::{{closure}} ++ at src/lib.rs:2937:54 ++ 9: core::ops::function::FnOnce::call_once ++ at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5 ++ ++ ++Writing test snapshot file for test "test::test_release_milestone_reentrant_lock_panics" to "test_snapshots/test/test_release_milestone_reentrant_lock_panics.1.json". ++note: panic did not contain expected string ++ panic message: "HostError: Error(Contract, #23)\n\nEvent log (newest first):\n 0: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:\"escalating error to panic\"\n 1: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:[\"contract call failed\", release_milestone, [1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]]\n 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #23)], data:\"escalating Ok(ScErrorType::Contract) frame-exit to Err\"\n 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, release_milestone], data:Error(Contract, #23)\n 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), release_milestone], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]\n 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void\n 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Deposit\"], data:{amount: 10000, deposited_at: 0, job_id: 1}\n 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"deposit: job {} amount {}\", 1, 10000]\n 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void\n 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, \"aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV\"], data:10000\n 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 10000]\n 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7\n 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void\n 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 10000]\n 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void\n 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"add_milestone: job {} amount {}\", 1, 10000]\n 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 10000]\n 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void\n 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"create_job: id {} client {} freelancer {}\", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4]\n 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG]\n 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void\n 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Initialized\"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0]\n 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"Escrow initialized with admin: {} and agent_judge: {}\", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void\n 25: ... 7 events elided ...\n\nBacktrace (newest first):\n 0: ::escalate_error_to_panic\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31\n 1: soroban_sdk::env::internal::reject_err::{{closure}}\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27\n 2: core::result::Result::map_err\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27\n 3: soroban_sdk::env::internal::reject_err\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11\n 4: ::call\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13\n 5: soroban_sdk::env::Env::invoke_contract\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18\n 6: escrow::EscrowContractClient::release_milestone\n at src/lib.rs:335:1\n 7: escrow::test::test_release_milestone_reentrant_lock_panics\n at src/lib.rs:2958:12\n 8: escrow::test::test_release_milestone_reentrant_lock_panics::{{closure}}\n at src/lib.rs:2937:54\n 9: core::ops::function::FnOnce::call_once\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5\n\n" ++ expected substring: "Error(Contract, #11)" ++---- test::test_resolve_dispute_panics stdout ---- ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 3000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 3000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 4000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["release_milestone: job {} amount {}", 1, 3000] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["raise_dispute: job {}", 1] ++[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["resolve_dispute: job {} payee {} payer {}", 1, 4900, 2100] ++Writing test snapshot file for test "test::test_resolve_dispute_panics" to "test_snapshots/test/test_resolve_dispute_panics.1.json". ++note: test did not panic as expected at contracts/escrow/src/lib.rs:2963:8 ++ ++failures: ++ test::test_deposit_with_wrong_total_panics_2 ++ test::test_reentrant_refund_panics ++ test::test_refund ++ test::test_refund_reentrant_lock_panics ++ test::test_release_funds_invalid_index_panics_2 ++ test::test_release_milestone_reentrant_lock_panics ++ test::test_resolve_dispute_panics ++ ++test result: FAILED. 53 passed; 7 failed; 0 ignored; 0 measured; 0 filtered out; finished in 18.50s ++ ++error: test failed, to rerun pass `--lib` +diff --git a/contracts/escrow/test_snapshots/test/test_add_milestone_limit_panics.1.json b/contracts/escrow/test_snapshots/test/test_add_milestone_limit_panics.1.json +new file mode 100644 +index 0000000..bed749f +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_add_milestone_limit_panics.1.json +@@ -0,0 +1,6889 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 544730322382084885 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 544730322382084885 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1301173170172112462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1301173170172112462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1345255804540566779 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1345255804540566779 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1501277168746644712 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1501277168746644712 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1506441561184340186 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1506441561184340186 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1690253666352074432 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1690253666352074432 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2140788761963629343 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2140788761963629343 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2254425974100219774 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2254425974100219774 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2307661404550649928 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2307661404550649928 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2578412842719982537 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2578412842719982537 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2623024502929126324 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2623024502929126324 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2781962168096793370 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2781962168096793370 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2891388370666955040 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2891388370666955040 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 3126073502131104533 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 3126073502131104533 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 3736142932239307322 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 3736142932239307322 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4571470874178140630 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4571470874178140630 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4914054227674050081 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4914054227674050081 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5012940724606903311 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5012940724606903311 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5994256439390011320 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5994256439390011320 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6369051681840606601 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6369051681840606601 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6391496069076573377 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6391496069076573377 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6517132746326325848 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6517132746326325848 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 7270604957039011794 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 7270604957039011794 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8077058277077262192 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8077058277077262192 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8375915698557174338 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8375915698557174338 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Setup" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "caught panic 'too many milestones' from contract function 'Symbol(obj#4831)'" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "add_milestone" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_budget_panics.1.json b/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_budget_panics.1.json +new file mode 100644 +index 0000000..7e92896 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_budget_panics.1.json +@@ -0,0 +1,1464 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000000000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000000000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Setup" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000000000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000000000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000000000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "caught panic 'job budget exceeds maximum' from contract function 'Symbol(obj#305)'" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "add_milestone" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_panics.1.json b/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_panics.1.json +new file mode 100644 +index 0000000..00b492c +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_panics.1.json +@@ -0,0 +1,1288 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Setup" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000000001 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "caught panic 'milestone amount exceeds maximum' from contract function 'Symbol(obj#223)'" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000000001 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "add_milestone" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000000001 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_amend_milestones_locked_when_disputed.1.json b/contracts/escrow/test_snapshots/test/test_amend_milestones_locked_when_disputed.1.json +new file mode 100644 +index 0000000..00485c0 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_amend_milestones_locked_when_disputed.1.json +@@ -0,0 +1,1944 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "raise_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Disputed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 90000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "raise_dispute: job {}" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "DisputeRaised" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "u32": 1 ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "amend_milestones" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "amend_milestones" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 6 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "amend_milestones" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_amend_milestones_restructures_remaining.1.json b/contracts/escrow/test_snapshots/test/test_amend_milestones_restructures_remaining.1.json +new file mode 100644 +index 0000000..e4f23de +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_amend_milestones_restructures_remaining.1.json +@@ -0,0 +1,3454 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "amend_milestones", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ], ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "amend_milestones", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 3126073502131104533 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 3126073502131104533 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 90000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "amend_milestones" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "MilestonesAmended" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amended_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestone_count" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "remaining_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 7000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "amend_milestones" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_milestone_status" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_milestone_status" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 2 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_amend_milestones_sum_mismatch_panics.1.json b/contracts/escrow/test_snapshots/test/test_amend_milestones_sum_mismatch_panics.1.json +new file mode 100644 +index 0000000..40521ce +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_amend_milestones_sum_mismatch_panics.1.json +@@ -0,0 +1,1781 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 90000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "amend_milestones" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "amend_milestones" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 7 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 7 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 7 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "amend_milestones" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 7 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_cancel_brief_in_setup_marks_refunded_without_transfer.1.json b/contracts/escrow/test_snapshots/test/test_cancel_brief_in_setup_marks_refunded_without_transfer.1.json +new file mode 100644 +index 0000000..95102c3 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_cancel_brief_in_setup_marks_refunded_without_transfer.1.json +@@ -0,0 +1,1236 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 77 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "cancel_brief", ++ "args": [ ++ { ++ "u64": 77 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 77 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 77 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Refunded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 77 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 77 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "cancel_brief" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 77 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "BriefCanceled" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "canceled_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "canceled_by" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 77 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "refunded_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "cancel_brief" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 77 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Refunded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_deposit_event_emitted.1.json b/contracts/escrow/test_snapshots/test/test_deposit_event_emitted.1.json +index fb888ef..e53ee0d 100644 +--- a/contracts/escrow/test_snapshots/test/test_deposit_event_emitted.1.json ++++ b/contracts/escrow/test_snapshots/test/test_deposit_event_emitted.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -224,6 +245,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -263,7 +317,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -278,7 +332,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -296,7 +350,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -311,7 +365,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -409,6 +463,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -425,6 +487,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -500,6 +570,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -547,24 +625,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1404,6 +1487,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1660,6 +1790,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -1676,6 +1814,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -1751,6 +1897,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_deposit_invalid_state_not_setup.1.json b/contracts/escrow/test_snapshots/test/test_deposit_invalid_state_not_setup.1.json +index ab339d7..341dcc5 100644 +--- a/contracts/escrow/test_snapshots/test/test_deposit_invalid_state_not_setup.1.json ++++ b/contracts/escrow/test_snapshots/test/test_deposit_invalid_state_not_setup.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -255,7 +276,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -270,7 +291,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -285,10 +306,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -300,10 +321,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -414,6 +435,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -467,6 +521,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -483,6 +545,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -585,6 +655,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -632,24 +710,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1579,6 +1662,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +diff --git a/contracts/escrow/test_snapshots/test/test_deposit_negative_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_negative_panics.1.json +index 91567dd..023e647 100644 +--- a/contracts/escrow/test_snapshots/test/test_deposit_negative_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_deposit_negative_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -175,6 +196,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -214,7 +268,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -229,7 +283,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -327,6 +381,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -343,6 +405,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -418,6 +488,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -425,7 +503,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 0 ++ "lo": 1000 + } + } + } +@@ -465,24 +543,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +diff --git a/contracts/escrow/test_snapshots/test/test_deposit_no_milestones_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_no_milestones_panics.1.json +index fd6acd1..454ace3 100644 +--- a/contracts/escrow/test_snapshots/test/test_deposit_no_milestones_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_deposit_no_milestones_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -150,6 +171,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -189,7 +243,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 4837995959683129791 + } + }, + "durability": "temporary" +@@ -204,7 +258,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 4837995959683129791 + } + }, + "durability": "temporary", +@@ -269,6 +323,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -285,6 +347,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -332,6 +402,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -379,24 +457,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +diff --git a/contracts/escrow/test_snapshots/test/test_deposit_reentrancy_guard_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_reentrancy_guard_panics.1.json +new file mode 100644 +index 0000000..a0e1e84 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_deposit_reentrancy_guard_panics.1.json +@@ -0,0 +1,1546 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Setup" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Locked" ++ } ++ ] ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 12 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "deposit" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_deposit_success_transitions_to_funded.1.json b/contracts/escrow/test_snapshots/test/test_deposit_success_transitions_to_funded.1.json +index 2844e8d..3e585eb 100644 +--- a/contracts/escrow/test_snapshots/test/test_deposit_success_transitions_to_funded.1.json ++++ b/contracts/escrow/test_snapshots/test/test_deposit_success_transitions_to_funded.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -227,6 +248,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -266,7 +320,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -281,7 +335,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -299,7 +353,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -314,7 +368,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -412,6 +466,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -428,6 +490,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -503,6 +573,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -550,24 +628,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1459,6 +1542,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1715,6 +1845,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -1731,6 +1869,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -1806,6 +1952,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics.1.json +index 8050767..9f9f098 100644 +--- a/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -175,6 +196,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -214,7 +268,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -229,7 +283,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -327,6 +381,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -343,6 +405,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -418,6 +488,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -425,7 +503,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 0 ++ "lo": 500 + } + } + } +@@ -465,24 +543,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +diff --git a/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics_2.1.json b/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics_2.1.json +new file mode 100644 +index 0000000..416c4fc +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics_2.1.json +@@ -0,0 +1,3283 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_funds", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_funds", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_funds", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 1 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 94000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_funds: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_funds: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 1 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_funds: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_deposit_zero_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_zero_panics.1.json +index 9be8269..9dfb0b9 100644 +--- a/contracts/escrow/test_snapshots/test/test_deposit_zero_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_deposit_zero_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -175,6 +196,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -214,7 +268,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -229,7 +283,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -327,6 +381,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -343,6 +405,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -418,6 +488,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -425,7 +503,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 0 ++ "lo": 1000 + } + } + } +@@ -465,24 +543,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +diff --git a/contracts/escrow/test_snapshots/test/test_dispute_50_50_split.1.json b/contracts/escrow/test_snapshots/test/test_dispute_50_50_split.1.json +index ce0144f..ff1d1a5 100644 +--- a/contracts/escrow/test_snapshots/test/test_dispute_50_50_split.1.json ++++ b/contracts/escrow/test_snapshots/test/test_dispute_50_50_split.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -378,6 +399,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -417,7 +471,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { +- "nonce": 115220454072064130 ++ "nonce": 3126073502131104533 + } + }, + "durability": "temporary" +@@ -432,7 +486,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { +- "nonce": 115220454072064130 ++ "nonce": 3126073502131104533 + } + }, + "durability": "temporary", +@@ -450,7 +504,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 1194852393571756375 + } + }, + "durability": "temporary" +@@ -465,7 +519,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 1194852393571756375 + } + }, + "durability": "temporary", +@@ -681,7 +735,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { +- "nonce": 1194852393571756375 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary" +@@ -696,7 +750,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { +- "nonce": 1194852393571756375 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary", +@@ -761,6 +815,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -777,6 +839,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -933,6 +1003,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -980,24 +1058,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -2180,6 +2263,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2820,6 +2950,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2836,6 +2974,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -2992,6 +3138,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -3355,6 +3509,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -3371,6 +3533,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -3527,6 +3697,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_dispute_deadline_set_on_raise.1.json b/contracts/escrow/test_snapshots/test/test_dispute_deadline_set_on_raise.1.json +new file mode 100644 +index 0000000..596e348 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_dispute_deadline_set_on_raise.1.json +@@ -0,0 +1,1959 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "raise_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Disputed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "raise_dispute: job {}" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "DisputeRaised" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "u32": 1 ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_dispute_deadline" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_dispute_deadline" ++ } ++ ], ++ "data": { ++ "u64": 604800 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_dispute_event_emission.1.json b/contracts/escrow/test_snapshots/test/test_dispute_event_emission.1.json +index 267244d..93fb2ad 100644 +--- a/contracts/escrow/test_snapshots/test/test_dispute_event_emission.1.json ++++ b/contracts/escrow/test_snapshots/test/test_dispute_event_emission.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -252,7 +273,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -267,7 +288,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -282,10 +303,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -297,10 +318,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -411,6 +432,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -464,6 +518,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -480,6 +542,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -555,6 +625,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -602,24 +680,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1459,6 +1542,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1835,6 +1965,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -1851,6 +1989,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -1926,6 +2072,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_double_create_job_panics.1.json b/contracts/escrow/test_snapshots/test/test_double_create_job_panics.1.json +index 62d18ed..8190f50 100644 +--- a/contracts/escrow/test_snapshots/test/test_double_create_job_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_double_create_job_panics.1.json +@@ -130,6 +130,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -146,6 +154,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -193,6 +209,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -410,27 +434,16 @@ + "v0": { + "topics": [ + { +- "symbol": "log" ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" + } + ], + "data": { +- "vec": [ +- { +- "string": "caught panic 'job already exists' from contract function 'Symbol(obj#47)'" +- }, +- { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" +- } +- ] ++ "error": { ++ "contract": 4 ++ } + } + } + } +@@ -450,12 +463,12 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 4 + } + } + ], + "data": { +- "string": "caught error from function" ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } +@@ -475,7 +488,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 4 + } + } + ], +@@ -523,7 +536,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 4 + } + } + ], +diff --git a/contracts/escrow/test_snapshots/test/test_double_init.1.json b/contracts/escrow/test_snapshots/test/test_double_init.1.json +index a76a50f..a9e3dd9 100644 +--- a/contracts/escrow/test_snapshots/test/test_double_init.1.json ++++ b/contracts/escrow/test_snapshots/test/test_double_init.1.json +@@ -4,7 +4,28 @@ + "nonce": 0 + }, + "auth": [ +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [] + ], + "ledger": { +@@ -17,6 +38,39 @@ + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -44,24 +98,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +diff --git a/contracts/escrow/test_snapshots/test/test_double_release_milestone_is_blocked.1.json b/contracts/escrow/test_snapshots/test/test_double_release_milestone_is_blocked.1.json +new file mode 100644 +index 0000000..3f9763a +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_double_release_milestone_is_blocked.1.json +@@ -0,0 +1,2231 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 6 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "release_milestone" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_emergency_sweep_by_admin.1.json b/contracts/escrow/test_snapshots/test/test_emergency_sweep_by_admin.1.json +new file mode 100644 +index 0000000..e1b5057 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_emergency_sweep_by_admin.1.json +@@ -0,0 +1,2821 @@ ++{ ++ "generators": { ++ "address": 7, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "emergency_sweep", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "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": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Refunded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 90000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "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": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "symbol" ++ }, ++ "val": { ++ "string": "aaa" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AssetInfo" ++ } ++ ] ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "AlphaNum4" ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "asset_code" ++ }, ++ "val": { ++ "string": "aaa\\0" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "issuer" ++ }, ++ "val": { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 120960 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "emergency_sweep" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "EmergencySweep" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "rescue_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "swept_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "emergency_sweep" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Refunded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_emergency_sweep_nothing_to_sweep.1.json b/contracts/escrow/test_snapshots/test/test_emergency_sweep_nothing_to_sweep.1.json +new file mode 100644 +index 0000000..462427f +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_emergency_sweep_nothing_to_sweep.1.json +@@ -0,0 +1,2101 @@ ++{ ++ "generators": { ++ "address": 7, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "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": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "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": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "symbol" ++ }, ++ "val": { ++ "string": "aaa" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AssetInfo" ++ } ++ ] ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "AlphaNum4" ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "asset_code" ++ }, ++ "val": { ++ "string": "aaa\\0" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "issuer" ++ }, ++ "val": { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 120960 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "emergency_sweep" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "emergency_sweep" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 18 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 18 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 18 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "emergency_sweep" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 18 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_emergency_sweep_requires_admin_auth.1.json b/contracts/escrow/test_snapshots/test/test_emergency_sweep_requires_admin_auth.1.json +new file mode 100644 +index 0000000..e0b35df +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_emergency_sweep_requires_admin_auth.1.json +@@ -0,0 +1,1787 @@ ++{ ++ "generators": { ++ "address": 7, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "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": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "symbol" ++ }, ++ "val": { ++ "string": "aaa" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AssetInfo" ++ } ++ ] ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "AlphaNum4" ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "asset_code" ++ }, ++ "val": { ++ "string": "aaa\\0" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "issuer" ++ }, ++ "val": { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 120960 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "emergency_sweep" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "auth": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Unauthorized function call for address" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "auth": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "auth": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "auth": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "emergency_sweep" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "auth": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_exhaustive_release_funds_path.1.json b/contracts/escrow/test_snapshots/test/test_exhaustive_release_funds_path.1.json +index eb383c7..bfe7dd3 100644 +--- a/contracts/escrow/test_snapshots/test/test_exhaustive_release_funds_path.1.json ++++ b/contracts/escrow/test_snapshots/test/test_exhaustive_release_funds_path.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -405,6 +426,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -477,7 +531,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 1194852393571756375 + } + }, + "durability": "temporary" +@@ -492,7 +546,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 1194852393571756375 + } + }, + "durability": "temporary", +@@ -510,7 +564,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1194852393571756375 ++ "nonce": 1301173170172112462 + } + }, + "durability": "temporary" +@@ -525,7 +579,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1194852393571756375 ++ "nonce": 1301173170172112462 + } + }, + "durability": "temporary", +@@ -821,6 +875,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -837,6 +899,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -993,6 +1063,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -1040,24 +1118,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -2240,6 +2323,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -3432,6 +3562,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -3448,6 +3586,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -3604,6 +3750,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_expire_dispute_refunds_client_after_deadline.1.json b/contracts/escrow/test_snapshots/test/test_expire_dispute_refunds_client_after_deadline.1.json +new file mode 100644 +index 0000000..f25ea84 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_expire_dispute_refunds_client_after_deadline.1.json +@@ -0,0 +1,2491 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "raise_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "expire_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 691200, ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": 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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Refunded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 92000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "raise_dispute: job {}" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "DisputeRaised" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "u32": 1 ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "expire_dispute" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "expire_dispute: job {} refunded {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "DisputeExpired" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expired_at" ++ }, ++ "val": { ++ "u64": 691200 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "refunded_to" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "expire_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Refunded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 8000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_fee_split_rounds_dust_to_freelancer.1.json b/contracts/escrow/test_snapshots/test/test_fee_split_rounds_dust_to_freelancer.1.json +new file mode 100644 +index 0000000..59c199d +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_fee_split_rounds_dust_to_freelancer.1.json +@@ -0,0 +1,2570 @@ ++{ ++ "generators": { ++ "address": 7, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "set_fee_config", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "u32": 100 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "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": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "FeeBps" ++ } ++ ] ++ }, ++ "val": { ++ "u32": 100 ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Treasury" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 99001 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 990 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 9 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "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": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "symbol" ++ }, ++ "val": { ++ "string": "aaa" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AssetInfo" ++ } ++ ] ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "AlphaNum4" ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "asset_code" ++ }, ++ "val": { ++ "string": "aaa\\0" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "issuer" ++ }, ++ "val": { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 120960 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "set_fee_config" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "u32": 100 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "FeeConfigUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "fee_bps" ++ }, ++ "val": { ++ "u32": 100 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "treasury" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_fee_config" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 9 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 9 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 990 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 990 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "FeeSplit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "freelancer_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 990 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "split_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "treasury_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 9 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 999 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 9 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 990 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 9 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 990 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_fee_split_routes_fee_to_treasury.1.json b/contracts/escrow/test_snapshots/test/test_fee_split_routes_fee_to_treasury.1.json +new file mode 100644 +index 0000000..4d4c463 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_fee_split_routes_fee_to_treasury.1.json +@@ -0,0 +1,2613 @@ ++{ ++ "generators": { ++ "address": 7, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "set_fee_config", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "u32": 250 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "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": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "FeeBps" ++ } ++ ] ++ }, ++ "val": { ++ "u32": 250 ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Treasury" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 90000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 9750 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "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": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN", ++ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "symbol" ++ }, ++ "val": { ++ "string": "aaa" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AssetInfo" ++ } ++ ] ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "AlphaNum4" ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "asset_code" ++ }, ++ "val": { ++ "string": "aaa\\0" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "issuer" ++ }, ++ "val": { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 120960 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000006" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "set_fee_config" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "u32": 250 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "FeeConfigUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "fee_bps" ++ }, ++ "val": { ++ "u32": 250 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "treasury" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_fee_config" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "get_fee_bps" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_fee_bps" ++ } ++ ], ++ "data": { ++ "u32": 250 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "get_treasury" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_treasury" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 9750 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 9750 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "FeeSplit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "freelancer_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 9750 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "split_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "treasury_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 250 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 9750 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_get_job_not_found_panics.1.json b/contracts/escrow/test_snapshots/test/test_get_job_not_found_panics.1.json +index f5cb5aa..d85b49e 100644 +--- a/contracts/escrow/test_snapshots/test/test_get_job_not_found_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_get_job_not_found_panics.1.json +@@ -4,7 +4,28 @@ + "nonce": 0 + }, + "auth": [ +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [] + ], + "ledger": { +@@ -17,6 +38,39 @@ + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -44,24 +98,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -250,18 +309,16 @@ + "v0": { + "topics": [ + { +- "symbol": "log" ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" + } + ], + "data": { +- "vec": [ +- { +- "string": "caught panic 'job not found' from contract function 'Symbol(get_job)'" +- }, +- { +- "u64": 999 +- } +- ] ++ "error": { ++ "contract": 5 ++ } + } + } + } +@@ -281,12 +338,12 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 5 + } + } + ], + "data": { +- "string": "caught error from function" ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } +@@ -306,7 +363,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 5 + } + } + ], +@@ -345,7 +402,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 5 + } + } + ], +diff --git a/contracts/escrow/test_snapshots/test/test_get_multisig_config.1.json b/contracts/escrow/test_snapshots/test/test_get_multisig_config.1.json +new file mode 100644 +index 0000000..84f803a +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_get_multisig_config.1.json +@@ -0,0 +1,1467 @@ ++{ ++ "generators": { ++ "address": 8, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "function_name": "configure_multisig", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "account": { ++ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V", ++ "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": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Setup" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "MultisigConfig" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "MultisigConfig" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "current_signatures" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "required_signatures" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "signers" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "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": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", ++ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "symbol" ++ }, ++ "val": { ++ "string": "aaa" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AssetInfo" ++ } ++ ] ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "AlphaNum4" ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "asset_code" ++ }, ++ "val": { ++ "string": "aaa\\0" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "issuer" ++ }, ++ "val": { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 120960 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000007" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000008" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000008" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000008" ++ }, ++ { ++ "symbol": "configure_multisig" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "MultisigConfigured" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "configured_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "required_signatures" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_signers" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "configure_multisig" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000008" ++ }, ++ { ++ "symbol": "get_multisig_config" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_multisig_config" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "current_signatures" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "required_signatures" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "signers" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_happy_path_lifecycle.1.json b/contracts/escrow/test_snapshots/test/test_happy_path_lifecycle.1.json +index 33c197b..37d4c26 100644 +--- a/contracts/escrow/test_snapshots/test/test_happy_path_lifecycle.1.json ++++ b/contracts/escrow/test_snapshots/test/test_happy_path_lifecycle.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -345,6 +366,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -384,7 +438,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary" +@@ -399,7 +453,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary", +@@ -695,6 +749,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -711,6 +773,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -840,6 +910,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -887,24 +965,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1997,6 +2080,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -3063,6 +3193,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -3079,6 +3217,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -3208,6 +3354,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_instance_config_getters.1.json b/contracts/escrow/test_snapshots/test/test_instance_config_getters.1.json +new file mode 100644 +index 0000000..6d33711 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_instance_config_getters.1.json +@@ -0,0 +1,373 @@ ++{ ++ "generators": { ++ "address": 3, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "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": { ++ "vec": [ ++ { ++ "symbol": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "get_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "get_agent_judge" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_agent_judge" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_no_fee_when_unconfigured.1.json b/contracts/escrow/test_snapshots/test/test_no_fee_when_unconfigured.1.json +new file mode 100644 +index 0000000..45ab671 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_no_fee_when_unconfigured.1.json +@@ -0,0 +1,2051 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_fee_bps" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_fee_bps" ++ } ++ ], ++ "data": { ++ "u32": 0 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_open_dispute_by_rando_panics.1.json b/contracts/escrow/test_snapshots/test/test_open_dispute_by_rando_panics.1.json +index ac80f4d..c3c0830 100644 +--- a/contracts/escrow/test_snapshots/test/test_open_dispute_by_rando_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_open_dispute_by_rando_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -224,6 +245,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -263,7 +317,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -278,7 +332,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -296,7 +350,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -311,7 +365,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -409,6 +463,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -425,6 +487,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -500,6 +570,14 @@ + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -547,24 +625,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1404,6 +1487,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +diff --git a/contracts/escrow/test_snapshots/test/test_open_dispute_on_completed_panics.1.json b/contracts/escrow/test_snapshots/test/test_open_dispute_on_completed_panics.1.json +index 8918325..adb4906 100644 +--- a/contracts/escrow/test_snapshots/test/test_open_dispute_on_completed_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_open_dispute_on_completed_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -252,7 +273,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -267,7 +288,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -282,10 +303,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -297,10 +318,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -411,6 +432,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -464,6 +518,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -480,6 +542,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -555,6 +625,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -602,24 +680,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1532,6 +1615,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_blocks_release_funds.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_blocks_release_funds.1.json +index 5292531..909638a 100644 +--- a/contracts/escrow/test_snapshots/test/test_raise_dispute_blocks_release_funds.1.json ++++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_blocks_release_funds.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -325,7 +346,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -340,7 +361,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -355,10 +376,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -370,10 +391,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -484,6 +505,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -556,7 +610,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { +- "nonce": 5806905060045992000 ++ "nonce": 1194852393571756375 + } + }, + "durability": "temporary" +@@ -571,7 +625,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { +- "nonce": 5806905060045992000 ++ "nonce": 1194852393571756375 + } + }, + "durability": "temporary", +@@ -636,6 +690,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -652,6 +714,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -781,6 +851,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -828,24 +906,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1938,6 +2021,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2584,6 +2714,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2600,6 +2738,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -2729,6 +2875,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_client_locks_funds.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_client_locks_funds.1.json +index 0e50b0d..b08c2eb 100644 +--- a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_client_locks_funds.1.json ++++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_client_locks_funds.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -302,7 +323,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -317,7 +338,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -332,10 +353,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -347,10 +368,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -461,6 +482,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -580,6 +634,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -596,6 +658,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -725,6 +795,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -772,24 +850,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1809,6 +1892,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2185,6 +2315,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2201,6 +2339,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -2330,6 +2476,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_freelancer_locks_funds.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_freelancer_locks_funds.1.json +index b8771d1..6a2afda 100644 +--- a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_freelancer_locks_funds.1.json ++++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_freelancer_locks_funds.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -277,7 +298,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -292,7 +313,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -307,10 +328,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -322,10 +343,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -439,7 +460,7 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 +@@ -454,7 +475,7 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 +@@ -469,6 +490,39 @@ + 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": { +@@ -522,6 +576,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -538,6 +600,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -640,6 +710,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -687,24 +765,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1634,6 +1717,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2010,6 +2140,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2026,6 +2164,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -2128,6 +2274,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_third_party_panics.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_third_party_panics.1.json +index 7cb3bc3..5931078 100644 +--- a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_third_party_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_third_party_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -224,6 +245,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -263,7 +317,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -278,7 +332,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -296,7 +350,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -311,7 +365,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -409,6 +463,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -425,6 +487,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -500,6 +570,14 @@ + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -547,24 +625,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1404,6 +1487,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1643,21 +1773,16 @@ + "v0": { + "topics": [ + { +- "symbol": "log" ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "raise_dispute" + } + ], + "data": { +- "vec": [ +- { +- "string": "caught panic 'unauthorized: only client or freelancer can raise a dispute' from contract function 'Symbol(obj#449)'" +- }, +- { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" +- } +- ] ++ "error": { ++ "contract": 3 ++ } + } + } + } +@@ -1677,12 +1802,12 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 3 + } + } + ], + "data": { +- "string": "caught error from function" ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } +@@ -1702,7 +1827,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 3 + } + } + ], +@@ -1744,7 +1869,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 3 + } + } + ], +diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_on_completed_job_panics.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_on_completed_job_panics.1.json +index 7cc3a52..f0879f3 100644 +--- a/contracts/escrow/test_snapshots/test/test_raise_dispute_on_completed_job_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_on_completed_job_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -252,7 +273,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -267,7 +288,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -282,10 +303,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -297,10 +318,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -411,6 +432,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -464,6 +518,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -480,6 +542,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -555,6 +625,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -602,24 +680,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1532,6 +1615,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1989,21 +2119,16 @@ + "v0": { + "topics": [ + { +- "symbol": "log" ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "raise_dispute" + } + ], + "data": { +- "vec": [ +- { +- "string": "caught panic 'dispute cannot be raised: job is not in active state' from contract function 'Symbol(obj#615)'" +- }, +- { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" +- } +- ] ++ "error": { ++ "contract": 6 ++ } + } + } + } +@@ -2023,12 +2148,12 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 6 + } + } + ], + "data": { +- "string": "caught error from function" ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } +@@ -2048,7 +2173,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 6 + } + } + ], +@@ -2090,7 +2215,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 6 + } + } + ], +diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_then_resolve.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_then_resolve.1.json +index 19905c5..6ff3ec5 100644 +--- a/contracts/escrow/test_snapshots/test/test_raise_dispute_then_resolve.1.json ++++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_then_resolve.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -353,6 +374,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -392,7 +446,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { +- "nonce": 1194852393571756375 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary" +@@ -407,7 +461,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { +- "nonce": 1194852393571756375 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary", +@@ -425,7 +479,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 1194852393571756375 + } + }, + "durability": "temporary" +@@ -440,7 +494,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 1194852393571756375 + } + }, + "durability": "temporary", +@@ -703,6 +757,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -848,6 +910,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -895,24 +965,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -2005,6 +2080,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2651,6 +2773,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2796,6 +2926,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -3159,6 +3297,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -3304,6 +3450,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_reentrant_refund_panics.1.json b/contracts/escrow/test_snapshots/test/test_reentrant_refund_panics.1.json +new file mode 100644 +index 0000000..2631a7f +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_reentrant_refund_panics.1.json +@@ -0,0 +1,1928 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Locked" ++ } ++ ] ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "refund" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 12 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "refund" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_reentrant_release_funds_panics.1.json b/contracts/escrow/test_snapshots/test/test_reentrant_release_funds_panics.1.json +new file mode 100644 +index 0000000..ca90d88 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_reentrant_release_funds_panics.1.json +@@ -0,0 +1,1934 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Locked" ++ } ++ ] ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 12 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "release_funds" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_reentrant_release_milestone_panics.1.json b/contracts/escrow/test_snapshots/test/test_reentrant_release_milestone_panics.1.json +new file mode 100644 +index 0000000..e4a83e4 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_reentrant_release_milestone_panics.1.json +@@ -0,0 +1,1928 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Locked" ++ } ++ ] ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 12 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "release_milestone" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_refund.1.json b/contracts/escrow/test_snapshots/test/test_refund.1.json +index 93799cf..2ba5758 100644 +--- a/contracts/escrow/test_snapshots/test/test_refund.1.json ++++ b/contracts/escrow/test_snapshots/test/test_refund.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -177,6 +198,7 @@ + ] + ], + [], ++ [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -205,7 +227,7 @@ + "ledger": { + "protocol_version": 21, + "sequence_number": 0, +- "timestamp": 0, ++ "timestamp": 2592001, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, +@@ -279,7 +301,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -294,7 +316,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -309,10 +331,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -324,10 +346,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -438,6 +460,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -524,6 +579,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -540,6 +603,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -610,7 +681,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 0 + } + } + }, +@@ -642,6 +713,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -689,24 +768,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1636,6 +1720,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1885,6 +2016,55 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_expiry" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_expiry" ++ } ++ ], ++ "data": { ++ "u64": 2592000 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2073,7 +2253,7 @@ + } + }, + { +- "u64": 0 ++ "u64": 2592001 + } + ] + } +@@ -2162,6 +2342,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2178,6 +2366,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -2248,7 +2444,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 0 + } + } + }, +@@ -2280,6 +2476,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_refund_before_lockup_rejected.1.json b/contracts/escrow/test_snapshots/test/test_refund_before_lockup_rejected.1.json +new file mode 100644 +index 0000000..0459523 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_refund_before_lockup_rejected.1.json +@@ -0,0 +1,1755 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "refund" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "refund" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 17 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 17 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 17 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "refund" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 17 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_refund_by_non_client_panics.1.json b/contracts/escrow/test_snapshots/test/test_refund_by_non_client_panics.1.json +index afdc756..ee892b2 100644 +--- a/contracts/escrow/test_snapshots/test/test_refund_by_non_client_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_refund_by_non_client_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -224,6 +245,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -263,7 +317,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -278,7 +332,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -296,7 +350,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -311,7 +365,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -409,6 +463,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -425,6 +487,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -500,6 +570,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -547,24 +625,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1404,6 +1487,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +diff --git a/contracts/escrow/test_snapshots/test/test_refund_reentrant_lock_panics.1.json b/contracts/escrow/test_snapshots/test/test_refund_reentrant_lock_panics.1.json +new file mode 100644 +index 0000000..66da6ac +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_refund_reentrant_lock_panics.1.json +@@ -0,0 +1,1931 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobLock" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobLock" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "temporary", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 15 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 90000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "refund" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "refund" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 23 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 23 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 23 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "refund" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 23 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_explicit_index.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_explicit_index.1.json +index 029e37c..e111f86 100644 +--- a/contracts/escrow/test_snapshots/test/test_release_funds_explicit_index.1.json ++++ b/contracts/escrow/test_snapshots/test/test_release_funds_explicit_index.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -352,6 +373,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -391,7 +445,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary" +@@ -406,7 +460,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary", +@@ -702,6 +756,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -847,6 +909,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -894,24 +964,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -2004,6 +2079,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2962,6 +3084,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -3107,6 +3237,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics.1.json +index 2419cfd..047ba50 100644 +--- a/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -224,6 +245,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -263,7 +317,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -278,7 +332,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -296,7 +350,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -311,7 +365,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -409,6 +463,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -425,6 +487,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -500,6 +570,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -547,24 +625,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1404,6 +1487,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1646,24 +1776,16 @@ + "v0": { + "topics": [ + { +- "symbol": "log" ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_funds" + } + ], + "data": { +- "vec": [ +- { +- "string": "caught panic 'invalid milestone index' from contract function 'Symbol(obj#447)'" +- }, +- { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" +- }, +- { +- "u32": 5 +- } +- ] ++ "error": { ++ "contract": 4 ++ } + } + } + } +@@ -1683,12 +1805,12 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 4 + } + } + ], + "data": { +- "string": "caught error from function" ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } +@@ -1708,7 +1830,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 4 + } + } + ], +@@ -1753,7 +1875,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 4 + } + } + ], +diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics_2.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics_2.1.json +new file mode 100644 +index 0000000..b3a468a +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics_2.1.json +@@ -0,0 +1,1903 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2500 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2500 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 6 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2500 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2500 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_out_of_order.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_out_of_order.1.json +new file mode 100644 +index 0000000..416c4fc +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_release_funds_out_of_order.1.json +@@ -0,0 +1,3283 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_funds", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_funds", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_funds", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 1 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 94000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_funds: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_funds: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 1 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_funds: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 2000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_reentrant_lock_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_reentrant_lock_panics.1.json +new file mode 100644 +index 0000000..890f4ba +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_release_funds_reentrant_lock_panics.1.json +@@ -0,0 +1,1945 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobLock" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobLock" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "temporary", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 15 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 90000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_funds" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "caught panic 'reentrant job operation: ReentrantCall' from contract function 'Symbol(obj#485)'" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "release_funds" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "wasm_vm": "invalid_action" ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_twice_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_twice_panics.1.json +index 45a5aeb..096541a 100644 +--- a/contracts/escrow/test_snapshots/test/test_release_funds_twice_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_release_funds_twice_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -255,7 +276,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -270,7 +291,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -285,10 +306,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -300,10 +321,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -414,6 +435,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -467,6 +521,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -483,6 +545,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -558,6 +628,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -605,24 +683,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1535,6 +1618,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1959,24 +2089,16 @@ + "v0": { + "topics": [ + { +- "symbol": "log" ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_funds" + } + ], + "data": { +- "vec": [ +- { +- "string": "caught panic 'job not in releaseable state' from contract function 'Symbol(obj#605)'" +- }, +- { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" +- }, +- { +- "u32": 0 +- } +- ] ++ "error": { ++ "contract": 6 ++ } + } + } + } +@@ -1996,12 +2118,12 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 6 + } + } + ], + "data": { +- "string": "caught error from function" ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } +@@ -2021,7 +2143,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 6 + } + } + ], +@@ -2066,7 +2188,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 6 + } + } + ], +diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_no_pending_milestones.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_no_pending_milestones.1.json +index ca27c81..3f9763a 100644 +--- a/contracts/escrow/test_snapshots/test/test_release_milestone_no_pending_milestones.1.json ++++ b/contracts/escrow/test_snapshots/test/test_release_milestone_no_pending_milestones.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -252,7 +273,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -267,7 +288,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -282,10 +303,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -297,10 +318,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -411,6 +432,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -464,6 +518,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -480,6 +542,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -555,6 +625,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -602,24 +680,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1532,6 +1615,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_overflow_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_overflow_panics.1.json +index ca27c81..3f9763a 100644 +--- a/contracts/escrow/test_snapshots/test/test_release_milestone_overflow_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_release_milestone_overflow_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -252,7 +273,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -267,7 +288,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -282,10 +303,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -297,10 +318,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -411,6 +432,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -464,6 +518,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -480,6 +542,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -555,6 +625,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -602,24 +680,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1532,6 +1615,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_reentrancy_guard_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_reentrancy_guard_panics.1.json +new file mode 100644 +index 0000000..5969560 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_release_milestone_reentrancy_guard_panics.1.json +@@ -0,0 +1,1928 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Locked" ++ } ++ ] ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 99000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 12 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "release_milestone" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 12 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_reentrant_lock_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_reentrant_lock_panics.1.json +new file mode 100644 +index 0000000..6f5da66 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_release_milestone_reentrant_lock_panics.1.json +@@ -0,0 +1,1931 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobLock" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobLock" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "temporary", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 15 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 90000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 23 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 23 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 23 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "release_milestone" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 23 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_sequential_success.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_sequential_success.1.json +index 4501710..bd974d0 100644 +--- a/contracts/escrow/test_snapshots/test/test_release_milestone_sequential_success.1.json ++++ b/contracts/escrow/test_snapshots/test/test_release_milestone_sequential_success.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -345,6 +366,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -384,7 +438,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary" +@@ -399,7 +453,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary", +@@ -695,6 +749,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -711,6 +773,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -840,6 +910,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -887,24 +965,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1997,6 +2080,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2471,6 +2601,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2487,6 +2625,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -2616,6 +2762,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -2963,6 +3117,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2979,6 +3141,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -3108,6 +3278,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -3455,6 +3633,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -3471,6 +3657,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -3600,6 +3794,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_unauthorized_freelancer.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_unauthorized_freelancer.1.json +index e9f1d83..37f5a5b 100644 +--- a/contracts/escrow/test_snapshots/test/test_release_milestone_unauthorized_freelancer.1.json ++++ b/contracts/escrow/test_snapshots/test/test_release_milestone_unauthorized_freelancer.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -224,6 +245,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -263,7 +317,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -278,7 +332,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -296,7 +350,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -311,7 +365,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -409,6 +463,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -425,6 +487,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -500,6 +570,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -547,24 +625,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1404,6 +1487,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +diff --git a/contracts/escrow/test_snapshots/test/test_released_amount_matches_transferred_on_sequential_release.1.json b/contracts/escrow/test_snapshots/test/test_released_amount_matches_transferred_on_sequential_release.1.json +new file mode 100644 +index 0000000..2b0ec3d +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_released_amount_matches_transferred_on_sequential_release.1.json +@@ -0,0 +1,3876 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 90000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "WorkInProgress" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "WorkInProgress" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 2 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_resolve_after_deadline_fails.1.json b/contracts/escrow/test_snapshots/test/test_resolve_after_deadline_fails.1.json +new file mode 100644 +index 0000000..0b2dc9f +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_resolve_after_deadline_fails.1.json +@@ -0,0 +1,2110 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "raise_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 691200, ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Disputed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "raise_dispute: job {}" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "DisputeRaised" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "u32": 1 ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 20 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 20 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 20 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 20 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 20 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 20 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_resolve_before_deadline_succeeds.1.json b/contracts/escrow/test_snapshots/test/test_resolve_before_deadline_succeeds.1.json +new file mode 100644 +index 0000000..d391208 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_resolve_before_deadline_succeeds.1.json +@@ -0,0 +1,2433 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "raise_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "resolve_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 259200, ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": 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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Resolved" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 94000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "raise_dispute: job {}" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "DisputeRaised" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "u32": 1 ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "resolve_dispute: job {} payee {} payer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Resolved" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 6000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_payout_to_freelancer.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_payout_to_freelancer.1.json +index c14f8e8..3713cb3 100644 +--- a/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_payout_to_freelancer.1.json ++++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_payout_to_freelancer.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -278,6 +299,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -317,7 +371,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { +- "nonce": 8370022561469687789 ++ "nonce": 6277191135259896685 + } + }, + "durability": "temporary" +@@ -332,7 +386,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { +- "nonce": 8370022561469687789 ++ "nonce": 6277191135259896685 + } + }, + "durability": "temporary", +@@ -350,7 +404,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -365,7 +419,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -383,7 +437,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -398,7 +452,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -449,7 +503,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { +- "nonce": 4270020994084947596 ++ "nonce": 8370022561469687789 + } + }, + "durability": "temporary" +@@ -464,7 +518,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { +- "nonce": 4270020994084947596 ++ "nonce": 8370022561469687789 + } + }, + "durability": "temporary", +@@ -529,6 +583,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -545,6 +607,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -620,6 +690,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -667,24 +745,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1597,6 +1680,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2167,6 +2297,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2183,6 +2321,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -2258,6 +2404,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_refund_to_client.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_refund_to_client.1.json +index 2f1f68d..da8e9d8 100644 +--- a/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_refund_to_client.1.json ++++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_refund_to_client.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -285,7 +306,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -300,7 +321,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -315,10 +336,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 8370022561469687789 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -330,10 +351,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 8370022561469687789 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -348,10 +369,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 6277191135259896685 + } + }, + "durability": "temporary" +@@ -363,10 +384,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 6277191135259896685 + } + }, + "durability": "temporary", +@@ -477,6 +498,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -530,6 +584,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -546,6 +608,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -621,6 +691,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -668,24 +746,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1525,6 +1608,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -2095,6 +2225,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -2111,6 +2249,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -2186,6 +2332,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_invalid_state_panics.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_invalid_state_panics.1.json +new file mode 100644 +index 0000000..b3a468a +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_invalid_state_panics.1.json +@@ -0,0 +1,1903 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2500 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2500 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 6 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2500 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2500 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_not_disputed_panics.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_not_disputed_panics.1.json +index da128a2..2ad6860 100644 +--- a/contracts/escrow/test_snapshots/test/test_resolve_dispute_not_disputed_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_not_disputed_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -224,6 +245,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -263,7 +317,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -278,7 +332,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -296,7 +350,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -311,7 +365,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -409,6 +463,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -500,6 +562,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -547,24 +617,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1404,6 +1479,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1652,30 +1774,16 @@ + "v0": { + "topics": [ + { +- "symbol": "log" ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "resolve_dispute" + } + ], + "data": { +- "vec": [ +- { +- "string": "caught panic 'job not disputed' from contract function 'Symbol(obj#447)'" +- }, +- { +- "u64": 1 +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 2500 +- } +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 2500 +- } +- } +- ] ++ "error": { ++ "contract": 6 ++ } + } + } + } +@@ -1695,12 +1803,12 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 6 + } + } + ], + "data": { +- "string": "caught error from function" ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } +@@ -1720,7 +1828,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 6 + } + } + ], +@@ -1771,7 +1879,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 6 + } + } + ], +diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_panics.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_panics.1.json +new file mode 100644 +index 0000000..ca3a44e +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_panics.1.json +@@ -0,0 +1,3608 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "raise_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "resolve_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": 115220454072064130 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Resolved" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 92100 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 7900 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "raise_dispute: job {}" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "DisputeRaised" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 1 ++ }, ++ { ++ "u32": 3 ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Disputed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "resolve_dispute: job {} payee {} payer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Resolved" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 7900 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 92100 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_success.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_success.1.json +new file mode 100644 +index 0000000..ca3a44e +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_success.1.json +@@ -0,0 +1,3608 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "release_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "raise_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "resolve_dispute", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": 115220454072064130 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 115220454072064130 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1194852393571756375 ++ } ++ }, ++ "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5806905060045992000 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 6277191135259896685 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Resolved" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 92100 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 7900 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "release_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "ReleaseMilestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "raise_dispute: job {}" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "DisputeRaised" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 1 ++ }, ++ { ++ "u32": 3 ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "raise_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Disputed" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "resolve_dispute: job {} payee {} payer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 4900 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2100 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "resolve_dispute" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 604800 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Released" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 3000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Resolved" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 7900 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "balance" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 92100 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_set_agent_judge_updates_packed_config.1.json b/contracts/escrow/test_snapshots/test/test_set_agent_judge_updates_packed_config.1.json +new file mode 100644 +index 0000000..c7138b4 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_set_agent_judge_updates_packed_config.1.json +@@ -0,0 +1,532 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "set_agent_judge", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "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": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "set_agent_judge" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Agent Judge updated to: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "AgentJudgeUpdated" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_agent_judge" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_agent_judge" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_agent_judge" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_set_fee_config_too_high_panics.1.json b/contracts/escrow/test_snapshots/test/test_set_fee_config_too_high_panics.1.json +new file mode 100644 +index 0000000..52da7a7 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_set_fee_config_too_high_panics.1.json +@@ -0,0 +1,369 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "set_fee_config" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 10001 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_fee_config" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 16 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 16 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 16 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "set_fee_config" ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 10001 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 16 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_set_lockup_after_setup_rejected.1.json b/contracts/escrow/test_snapshots/test/test_set_lockup_after_setup_rejected.1.json +new file mode 100644 +index 0000000..4eac67f +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_set_lockup_after_setup_rejected.1.json +@@ -0,0 +1,1755 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "set_lockup_duration" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u64": 3600 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_lockup_duration" ++ } ++ ], ++ "data": { ++ "error": { ++ "contract": 6 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "set_lockup_duration" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u64": 3600 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 6 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_set_lockup_duration_then_refund_after_expiry.1.json b/contracts/escrow/test_snapshots/test/test_set_lockup_duration_then_refund_after_expiry.1.json +new file mode 100644 +index 0000000..c7685bf +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_set_lockup_duration_then_refund_after_expiry.1.json +@@ -0,0 +1,2253 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "set_lockup_duration", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u64": 3600 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "refund", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 3601, ++ "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": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 3600 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Refunded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AgentJudge" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "set_lockup_duration" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u64": 3600 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "LockupUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 3600 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_lockup_duration" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_expiry" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_expiry" ++ } ++ ], ++ "data": { ++ "u64": 3600 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "refund" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "refund: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Refunded" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ }, ++ { ++ "u64": 3601 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "refund" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 3600 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Refunded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_token_decimals_stored_on_deposit.1.json b/contracts/escrow/test_snapshots/test/test_token_decimals_stored_on_deposit.1.json +new file mode 100644 +index 0000000..036fca2 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_token_decimals_stored_on_deposit.1.json +@@ -0,0 +1,1784 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "set_admin", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "mint", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "create_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "add_milestone", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "deposit", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [ ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "function_name": "transfer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "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": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "created_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 2592000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "milestones" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Pending" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "released_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "requires_multisig" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Funded" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token" ++ }, ++ "val": { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "Config" ++ } ++ ] ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 95000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "authorized" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "clawback" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 518400 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Balance" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "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" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": { ++ "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "init_asset" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "set_admin" ++ }, ++ { ++ "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_admin" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "mint" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mint" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "Escrow initialized with admin: {} and agent_judge: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Initialized" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 0 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "create_job: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "create_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "add_milestone: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "add_milestone" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "transfer" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" ++ } ++ ], ++ "data": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "transfer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "deposit: job {} amount {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "escrow" ++ }, ++ { ++ "string": "Deposit" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "amount" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "deposited_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "deposit" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_token_decimals" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_token_decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json b/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json +index 5870434..456f4ca 100644 +--- a/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json ++++ b/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -255,7 +276,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary" +@@ -270,7 +291,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 5541220902715666415 ++ "nonce": 1033654523790656264 + } + }, + "durability": "temporary", +@@ -285,10 +306,10 @@ + [ + { + "contract_data": { +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary" +@@ -300,10 +321,10 @@ + "data": { + "contract_data": { + "ext": "v0", +- "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 5541220902715666415 + } + }, + "durability": "temporary", +@@ -414,6 +435,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -467,6 +521,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -483,6 +545,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -585,6 +655,14 @@ + "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -632,24 +710,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1579,6 +1662,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +diff --git a/contracts/escrow/test_snapshots/test/test_unauthorized_release_funds_by_freelancer_panics.1.json b/contracts/escrow/test_snapshots/test/test_unauthorized_release_funds_by_freelancer_panics.1.json +index 26afcd3..7f41d1a 100644 +--- a/contracts/escrow/test_snapshots/test/test_unauthorized_release_funds_by_freelancer_panics.1.json ++++ b/contracts/escrow/test_snapshots/test/test_unauthorized_release_funds_by_freelancer_panics.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -224,6 +245,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -263,7 +317,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary" +@@ -278,7 +332,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 2032731177588607455 + } + }, + "durability": "temporary", +@@ -296,7 +350,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary" +@@ -311,7 +365,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 2032731177588607455 ++ "nonce": 4270020994084947596 + } + }, + "durability": "temporary", +@@ -409,6 +463,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -425,6 +487,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -500,6 +570,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -547,24 +625,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1404,6 +1487,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -1646,24 +1776,16 @@ + "v0": { + "topics": [ + { +- "symbol": "log" ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "release_funds" + } + ], + "data": { +- "vec": [ +- { +- "string": "caught panic 'only client can release' from contract function 'Symbol(obj#447)'" +- }, +- { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" +- }, +- { +- "u32": 0 +- } +- ] ++ "error": { ++ "contract": 3 ++ } + } + } + } +@@ -1683,12 +1805,12 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 3 + } + } + ], + "data": { +- "string": "caught error from function" ++ "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } +@@ -1708,7 +1830,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 3 + } + } + ], +@@ -1753,7 +1875,7 @@ + }, + { + "error": { +- "wasm_vm": "invalid_action" ++ "contract": 3 + } + } + ], +diff --git a/contracts/escrow/test_snapshots/test/test_variable_milestone_amounts.1.json b/contracts/escrow/test_snapshots/test/test_variable_milestone_amounts.1.json +index 25b85f7..ebe75ea 100644 +--- a/contracts/escrow/test_snapshots/test/test_variable_milestone_amounts.1.json ++++ b/contracts/escrow/test_snapshots/test/test_variable_milestone_amounts.1.json +@@ -48,7 +48,28 @@ + } + ] + ], +- [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", +@@ -345,6 +366,39 @@ + 6311999 + ] + ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], + [ + { + "contract_data": { +@@ -384,7 +438,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary" +@@ -399,7 +453,7 @@ + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { +- "nonce": 1033654523790656264 ++ "nonce": 115220454072064130 + } + }, + "durability": "temporary", +@@ -695,6 +749,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -711,6 +773,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -840,6 +910,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +@@ -887,24 +965,29 @@ + "key": { + "vec": [ + { +- "symbol": "Admin" ++ "symbol": "Config" + } + ] + }, + "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- }, +- { +- "key": { +- "vec": [ ++ "map": [ ++ { ++ "key": { ++ "symbol": "admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, + { +- "symbol": "AgentJudge" ++ "key": { ++ "symbol": "agent_judge" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } + } + ] +- }, +- "val": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] +@@ -1997,6 +2080,53 @@ + }, + "failed_call": false + }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "decimals" ++ } ++ ], ++ "data": { ++ "u32": 7 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, + { + "event": { + "ext": "v0", +@@ -3186,6 +3316,14 @@ + "u64": 0 + } + }, ++ { ++ "key": { ++ "symbol": "dispute_deadline" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, + { + "key": { + "symbol": "expires_at" +@@ -3202,6 +3340,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "funded_ledger_seq" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, + { + "key": { + "symbol": "milestones" +@@ -3331,6 +3477,14 @@ + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, ++ { ++ "key": { ++ "symbol": "token_decimals" ++ }, ++ "val": { ++ "u32": 7 ++ } ++ }, + { + "key": { + "symbol": "total_amount" +diff --git a/contracts/escrow/test_snapshots/test/test_version.1.json b/contracts/escrow/test_snapshots/test/test_version.1.json +new file mode 100644 +index 0000000..87cf6d9 +--- /dev/null ++++ b/contracts/escrow/test_snapshots/test/test_version.1.json +@@ -0,0 +1,123 @@ ++{ ++ "generators": { ++ "address": 1, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000001" ++ }, ++ { ++ "symbol": "version" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "version" ++ } ++ ], ++ "data": { ++ "u32": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_accept_bid_after_expiration_panics.1.json b/contracts/job_registry/test_snapshots/test/test_accept_bid_after_expiration_panics.1.json +new file mode 100644 +index 0000000..88709cc +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_accept_bid_after_expiration_panics.1.json +@@ -0,0 +1,970 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 61, ++ "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_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "JobRegistry initialized with admin: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "init" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "post_job: id {} client {} budget {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "submit_bid: id {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "accept_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 16 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 16 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 16 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 16 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 16 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "accept_bid" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 16 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_accept_without_matching_bid_panics.1.json b/contracts/job_registry/test_snapshots/test/test_accept_without_matching_bid_panics.1.json +index 931a41d..25cb10f 100644 +--- a/contracts/job_registry/test_snapshots/test/test_accept_without_matching_bid_panics.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_accept_without_matching_bid_panics.1.json +@@ -44,8 +44,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -139,7 +145,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 1 +@@ -159,7 +165,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 1 +@@ -168,7 +174,7 @@ + }, + "durability": "persistent", + "val": { +- "vec": [] ++ "u32": 0 + } + } + }, +@@ -214,6 +220,14 @@ + "durability": "persistent", + "val": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -221,7 +235,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -233,6 +247,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -388,34 +410,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +@@ -475,44 +470,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "post_job: id {} client {} budget {}" +- }, +- { +- "u64": 1 + }, + { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ "u64": 30 + }, + { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } ++ "u64": 60 + } + ] + } +@@ -537,17 +502,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } +- } +- ] ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } +diff --git a/contracts/job_registry/test_snapshots/test/test_budget_above_maximum_panics.1.json b/contracts/job_registry/test_snapshots/test/test_budget_above_maximum_panics.1.json +new file mode 100644 +index 0000000..12aa8f4 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_budget_above_maximum_panics.1.json +@@ -0,0 +1,432 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000000000001 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 4 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "post_job" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000000000001 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_budget_at_maximum_succeeds.1.json b/contracts/job_registry/test_snapshots/test/test_budget_at_maximum_succeeds.1.json +new file mode 100644 +index 0000000..e19fe24 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_budget_at_maximum_succeeds.1.json +@@ -0,0 +1,645 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000000000000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000000000000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000000000000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000000000000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_budget_at_minimum_succeeds.1.json b/contracts/job_registry/test_snapshots/test/test_budget_at_minimum_succeeds.1.json +new file mode 100644 +index 0000000..495b161 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_budget_at_minimum_succeeds.1.json +@@ -0,0 +1,645 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_budget_below_minimum_panics.1.json b/contracts/job_registry/test_snapshots/test/test_budget_below_minimum_panics.1.json +new file mode 100644 +index 0000000..07bafa7 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_budget_below_minimum_panics.1.json +@@ -0,0 +1,432 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 99999 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 4 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "post_job" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 99999 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_cancel_expired_job_before_expiration_panics.1.json b/contracts/job_registry/test_snapshots/test/test_cancel_expired_job_before_expiration_panics.1.json +new file mode 100644 +index 0000000..accc297 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_cancel_expired_job_before_expiration_panics.1.json +@@ -0,0 +1,716 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "cancel_expired_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 18 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 18 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 18 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 18 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 18 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "cancel_expired_job" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 18 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_cancel_expired_job_by_client.1.json b/contracts/job_registry/test_snapshots/test/test_cancel_expired_job_by_client.1.json +new file mode 100644 +index 0000000..19e3628 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_cancel_expired_job_by_client.1.json +@@ -0,0 +1,813 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "cancel_expired_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 61, ++ "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_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Expired" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "JobRegistry initialized with admin: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "init" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "post_job: id {} client {} budget {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "cancel_expired_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "cancel_expired_job: id {} client {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "expired" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "cancel_expired_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Expired" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_double_initialize_panics.1.json b/contracts/job_registry/test_snapshots/test/test_double_initialize_panics.1.json +index 364f920..e4944ad 100644 +--- a/contracts/job_registry/test_snapshots/test/test_double_initialize_panics.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_double_initialize_panics.1.json +@@ -188,34 +188,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +diff --git a/contracts/job_registry/test_snapshots/test/test_duplicate_bid_panics.1.json b/contracts/job_registry/test_snapshots/test/test_duplicate_bid_panics.1.json +index 28f0fdc..13cd329 100644 +--- a/contracts/job_registry/test_snapshots/test/test_duplicate_bid_panics.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_duplicate_bid_panics.1.json +@@ -44,8 +44,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -71,6 +77,12 @@ + }, + { + "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } + } + ] + } +@@ -229,6 +241,25 @@ + "vec": [ + { + "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -293,6 +324,14 @@ + "durability": "persistent", + "val": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -300,7 +339,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -312,6 +351,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -467,34 +514,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +@@ -554,44 +574,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "post_job: id {} client {} budget {}" + }, + { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ "u64": 30 + }, + { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } ++ "u64": 60 + } + ] + } +@@ -616,17 +606,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } +- } +- ] ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } +@@ -682,36 +662,12 @@ + }, + { + "bytes": "516d50726f706f73616c" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "submit_bid: id {} freelancer {}" +- }, +- { +- "u64": 1 + }, + { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } + } + ] + } +@@ -792,6 +748,12 @@ + }, + { + "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } + } + ] + } +@@ -917,6 +879,12 @@ + }, + { + "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } + } + ] + } +diff --git a/contracts/job_registry/test_snapshots/test/test_empty_hash_panics.1.json b/contracts/job_registry/test_snapshots/test/test_empty_hash_panics.1.json +index 341afb7..345a555 100644 +--- a/contracts/job_registry/test_snapshots/test/test_empty_hash_panics.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_empty_hash_panics.1.json +@@ -188,34 +188,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +@@ -275,8 +248,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -406,8 +385,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +diff --git a/contracts/job_registry/test_snapshots/test/test_full_lifecycle.1.json b/contracts/job_registry/test_snapshots/test/test_full_lifecycle.1.json +index 7966029..e066e00 100644 +--- a/contracts/job_registry/test_snapshots/test/test_full_lifecycle.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_full_lifecycle.1.json +@@ -44,8 +44,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -72,6 +78,12 @@ + }, + { + "bytes": "516d50726f706f73616c48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } + } + ] + } +@@ -349,6 +361,25 @@ + "vec": [ + { + "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -458,6 +489,14 @@ + "durability": "persistent", + "val": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -465,7 +504,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -477,6 +516,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -634,34 +681,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +@@ -721,44 +741,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "post_job: id {} client {} budget {}" + }, + { +- "u64": 1 ++ "u64": 30 + }, + { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } ++ "u64": 60 + } + ] + } +@@ -783,17 +773,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } +- } +- ] ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } +@@ -864,6 +844,14 @@ + ], + "data": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -871,7 +859,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -883,6 +871,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -944,36 +940,12 @@ + }, + { + "bytes": "516d50726f706f73616c48617368" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "submit_bid: id {} freelancer {}" + }, + { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } + } + ] + } +@@ -1071,6 +1043,25 @@ + "vec": [ + { + "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -1132,39 +1123,6 @@ + }, + "failed_call": false + }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "accept_bid: id {} client {} freelancer {}" +- }, +- { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, + { + "event": { + "ext": "v0", +@@ -1252,6 +1210,14 @@ + ], + "data": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -1259,7 +1225,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -1271,6 +1237,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -1294,7 +1268,7 @@ + "val": { + "vec": [ + { +- "symbol": "InProgress" ++ "symbol": "Assigned" + } + ] + } +@@ -1342,36 +1316,6 @@ + }, + "failed_call": false + }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "submit_deliverable: id {} freelancer {}" +- }, +- { +- "u64": 1 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, + { + "event": { + "ext": "v0", +@@ -1459,6 +1403,14 @@ + ], + "data": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -1466,7 +1418,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -1478,6 +1430,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +diff --git a/contracts/job_registry/test_snapshots/test/test_get_bids_count_after_submissions.1.json b/contracts/job_registry/test_snapshots/test/test_get_bids_count_after_submissions.1.json +new file mode 100644 +index 0000000..213502f +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_get_bids_count_after_submissions.1.json +@@ -0,0 +1,1151 @@ ++{ ++ "generators": { ++ "address": 7, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_bids_count" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_bids_count" ++ } ++ ], ++ "data": { ++ "u32": 3 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_get_bids_count_empty_returns_zero.1.json b/contracts/job_registry/test_snapshots/test/test_get_bids_count_empty_returns_zero.1.json +new file mode 100644 +index 0000000..71b1e1f +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_get_bids_count_empty_returns_zero.1.json +@@ -0,0 +1,583 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_bids_count" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_bids_count" ++ } ++ ], ++ "data": { ++ "u32": 0 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_get_bids_for_missing_job_panics.1.json b/contracts/job_registry/test_snapshots/test/test_get_bids_for_missing_job_panics.1.json +new file mode 100644 +index 0000000..132eda6 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_get_bids_for_missing_job_panics.1.json +@@ -0,0 +1,419 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "JobRegistry initialized with admin: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "init" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_bids" ++ } ++ ], ++ "data": { ++ "u64": 404 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 7 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 7 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 7 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 7 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 7 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "get_bids" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 404 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 7 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_get_bids_page_first_window.1.json b/contracts/job_registry/test_snapshots/test/test_get_bids_page_first_window.1.json +new file mode 100644 +index 0000000..49f7a8f +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_get_bids_page_first_window.1.json +@@ -0,0 +1,1657 @@ ++{ ++ "generators": { ++ "address": 9, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_bids_page" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ }, ++ { ++ "u32": 3 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_bids_page" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_get_bids_page_offset_beyond_end_returns_empty.1.json b/contracts/job_registry/test_snapshots/test/test_get_bids_page_offset_beyond_end_returns_empty.1.json +new file mode 100644 +index 0000000..b962649 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_get_bids_page_offset_beyond_end_returns_empty.1.json +@@ -0,0 +1,1161 @@ ++{ ++ "generators": { ++ "address": 7, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_bids_page" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 10 ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_bids_page" ++ } ++ ], ++ "data": { ++ "vec": [] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_get_bids_page_second_window.1.json b/contracts/job_registry/test_snapshots/test/test_get_bids_page_second_window.1.json +new file mode 100644 +index 0000000..034ea95 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_get_bids_page_second_window.1.json +@@ -0,0 +1,1618 @@ ++{ ++ "generators": { ++ "address": 9, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 8370022561469687789 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_bids_page" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 3 ++ }, ++ { ++ "u32": 3 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_bids_page" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_get_deliverable_without_submission_panics.1.json b/contracts/job_registry/test_snapshots/test/test_get_deliverable_without_submission_panics.1.json +index 393eec5..cdef311 100644 +--- a/contracts/job_registry/test_snapshots/test/test_get_deliverable_without_submission_panics.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_get_deliverable_without_submission_panics.1.json +@@ -44,8 +44,11 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -139,7 +142,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 1 +@@ -159,7 +162,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 1 +@@ -168,7 +171,7 @@ + }, + "durability": "persistent", + "val": { +- "vec": [] ++ "u32": 0 + } + } + }, +@@ -214,6 +217,14 @@ + "durability": "persistent", + "val": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 100 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -221,7 +232,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -233,6 +244,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -475,8 +494,11 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -511,7 +533,7 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + ] +@@ -544,7 +566,7 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + ] +diff --git a/contracts/job_registry/test_snapshots/test/test_initialize_bootstraps_storage.1.json b/contracts/job_registry/test_snapshots/test/test_initialize_bootstraps_storage.1.json +index f42f18a..28ac159 100644 +--- a/contracts/job_registry/test_snapshots/test/test_initialize_bootstraps_storage.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_initialize_bootstraps_storage.1.json +@@ -190,34 +190,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +diff --git a/contracts/job_registry/test_snapshots/test/test_invalid_budget_panics.1.json b/contracts/job_registry/test_snapshots/test/test_invalid_budget_panics.1.json +index 92059e9..b97714f 100644 +--- a/contracts/job_registry/test_snapshots/test/test_invalid_budget_panics.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_invalid_budget_panics.1.json +@@ -188,34 +188,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +@@ -277,6 +250,12 @@ + "hi": 0, + "lo": 0 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -408,6 +387,12 @@ + "hi": 0, + "lo": 0 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +diff --git a/contracts/job_registry/test_snapshots/test/test_late_bid_after_acceptance_panics_with_job_not_open.1.json b/contracts/job_registry/test_snapshots/test/test_late_bid_after_acceptance_panics_with_job_not_open.1.json +new file mode 100644 +index 0000000..5941fed +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_late_bid_after_acceptance_panics_with_job_not_open.1.json +@@ -0,0 +1,1244 @@ ++{ ++ "generators": { ++ "address": 5, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "accept_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidByIndex" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidByIndex" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidCount" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidCount" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "u32": 1 ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidLookup" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidLookup" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Assigned" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "JobRegistry initialized with admin: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "init" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "post_job: id {} client {} budget {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "submit_bid: id {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "accept_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "accept_bid: id {} client {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "accept" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "accept_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d4c61746550726f706f73616c" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 8 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 8 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 8 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 8 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 8 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "submit_bid" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "bytes": "516d4c61746550726f706f73616c" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 8 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_assigned.1.json b/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_assigned.1.json +new file mode 100644 +index 0000000..05aa28d +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_assigned.1.json +@@ -0,0 +1,1076 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "accept_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "mark_disputed", ++ "args": [ ++ { ++ "u64": 1 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [ ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Disputed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "accept_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "accept" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "accept_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "mark_disputed" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "mark_disputed" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Disputed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_in_progress.1.json b/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_in_progress.1.json +index 34ff79e..0201b47 100644 +--- a/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_in_progress.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_in_progress.1.json +@@ -46,6 +46,9 @@ + "hi": 0, + "lo": 5000 + } ++ }, ++ { ++ "u64": 100 + } + ] + } +@@ -71,6 +74,12 @@ + }, + { + "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 50 ++ } + } + ] + } +@@ -339,6 +348,25 @@ + "vec": [ + { + "map": [ ++ { ++ "key": { ++ "symbol": "collateral_released" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "collateral_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 50 ++ } ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -403,6 +431,14 @@ + "durability": "persistent", + "val": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 100 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -668,6 +704,9 @@ + "hi": 0, + "lo": 5000 + } ++ }, ++ { ++ "u64": 100 + } + ] + } +@@ -794,6 +833,12 @@ + }, + { + "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 50 ++ } + } + ] + } +@@ -1127,6 +1172,14 @@ + ], + "data": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 100 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +diff --git a/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_open_panics.1.json b/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_open_panics.1.json +index e0db2e6..26431f4 100644 +--- a/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_open_panics.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_mark_disputed_from_open_panics.1.json +@@ -44,8 +44,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -139,7 +145,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 1 +@@ -159,7 +165,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 1 +@@ -168,7 +174,7 @@ + }, + "durability": "persistent", + "val": { +- "vec": [] ++ "u32": 0 + } + } + }, +@@ -214,6 +220,14 @@ + "durability": "persistent", + "val": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -221,7 +235,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -233,6 +247,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -388,34 +410,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +@@ -475,44 +470,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "post_job: id {} client {} budget {}" +- }, +- { +- "u64": 1 + }, + { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ "u64": 30 + }, + { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } ++ "u64": 60 + } + ] + } +@@ -537,17 +502,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } +- } +- ] ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } +diff --git a/contracts/job_registry/test_snapshots/test/test_oversized_cid_panics_with_invalid_hash.1.json b/contracts/job_registry/test_snapshots/test/test_oversized_cid_panics_with_invalid_hash.1.json +new file mode 100644 +index 0000000..f525281 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_oversized_cid_panics_with_invalid_hash.1.json +@@ -0,0 +1,447 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "JobRegistry initialized with admin: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "init" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 5 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 5 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 5 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 5 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "post_job" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 5 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_post_job_auto_allocates_sequential_ids.1.json b/contracts/job_registry/test_snapshots/test/test_post_job_auto_allocates_sequential_ids.1.json +index 502e078..4d4caf7 100644 +--- a/contracts/job_registry/test_snapshots/test/test_post_job_auto_allocates_sequential_ids.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_post_job_auto_allocates_sequential_ids.1.json +@@ -41,8 +41,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -69,8 +75,14 @@ + { + "i128": { + "hi": 0, +- "lo": 7000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -197,7 +209,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 1 +@@ -217,7 +229,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 1 +@@ -226,7 +238,7 @@ + }, + "durability": "persistent", + "val": { +- "vec": [] ++ "u32": 0 + } + } + }, +@@ -242,7 +254,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 2 +@@ -262,7 +274,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 2 +@@ -271,7 +283,7 @@ + }, + "durability": "persistent", + "val": { +- "vec": [] ++ "u32": 0 + } + } + }, +@@ -317,6 +329,14 @@ + "durability": "persistent", + "val": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -324,7 +344,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -336,6 +356,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -408,6 +436,14 @@ + "durability": "persistent", + "val": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -415,7 +451,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 7000 ++ "lo": 100000 + } + } + }, +@@ -427,6 +463,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -582,34 +626,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +@@ -666,77 +683,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "post_job_auto: id {} client {} budget {}" + }, + { +- "u64": 1 ++ "u64": 30 + }, + { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "jobauto" +- }, +- { +- "u64": 1 +- } +- ], +- "data": { +- "vec": [ +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } ++ "u64": 60 + } + ] + } +@@ -797,77 +751,14 @@ + { + "i128": { + "hi": 0, +- "lo": 7000 ++ "lo": 100000 + } +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "post_job_auto: id {} client {} budget {}" + }, + { +- "u64": 2 +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ "u64": 30 + }, + { +- "i128": { +- "hi": 0, +- "lo": 7000 +- } +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "jobauto" +- }, +- { +- "u64": 2 +- } +- ], +- "data": { +- "vec": [ +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 7000 +- } ++ "u64": 60 + } + ] + } +diff --git a/contracts/job_registry/test_snapshots/test/test_post_job_before_initialize_panics.1.json b/contracts/job_registry/test_snapshots/test/test_post_job_before_initialize_panics.1.json +index 6fdb52c..d8ac870 100644 +--- a/contracts/job_registry/test_snapshots/test/test_post_job_before_initialize_panics.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_post_job_before_initialize_panics.1.json +@@ -104,8 +104,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -235,8 +241,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +diff --git a/contracts/job_registry/test_snapshots/test/test_post_job_with_explicit_id_updates_next_job_id.1.json b/contracts/job_registry/test_snapshots/test/test_post_job_with_explicit_id_updates_next_job_id.1.json +index f5bfbf5..0052381 100644 +--- a/contracts/job_registry/test_snapshots/test/test_post_job_with_explicit_id_updates_next_job_id.1.json ++++ b/contracts/job_registry/test_snapshots/test/test_post_job_with_explicit_id_updates_next_job_id.1.json +@@ -44,8 +44,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 + } + ] + } +@@ -139,7 +145,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 42 +@@ -159,7 +165,7 @@ + "key": { + "vec": [ + { +- "symbol": "Bids" ++ "symbol": "BidCount" + }, + { + "u64": 42 +@@ -168,7 +174,7 @@ + }, + "durability": "persistent", + "val": { +- "vec": [] ++ "u32": 0 + } + } + }, +@@ -214,6 +220,14 @@ + "durability": "persistent", + "val": { + "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, + { + "key": { + "symbol": "budget_stroops" +@@ -221,7 +235,7 @@ + "val": { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } + } + }, +@@ -233,6 +247,14 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, + { + "key": { + "symbol": "freelancer" +@@ -388,34 +410,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "string": "JobRegistry initialized with admin: {}" +- }, +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "contract", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "init" +- } +- ], +- "data": { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ "string": "initialized" + } + } + } +@@ -475,44 +470,14 @@ + { + "i128": { + "hi": 0, +- "lo": 5000 ++ "lo": 100000 + } +- } +- ] +- } +- } +- } +- }, +- "failed_call": false +- }, +- { +- "event": { +- "ext": "v0", +- "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", +- "type_": "diagnostic", +- "body": { +- "v0": { +- "topics": [ +- { +- "symbol": "log" +- } +- ], +- "data": { +- "vec": [ +- { +- "string": "post_job: id {} client {} budget {}" +- }, +- { +- "u64": 42 + }, + { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ "u64": 30 + }, + { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } ++ "u64": 60 + } + ] + } +@@ -537,17 +502,7 @@ + } + ], + "data": { +- "vec": [ +- { +- "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" +- }, +- { +- "i128": { +- "hi": 0, +- "lo": 5000 +- } +- } +- ] ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } +diff --git a/contracts/job_registry/test_snapshots/test/test_set_escrow_deployer_round_trip.1.json b/contracts/job_registry/test_snapshots/test/test_set_escrow_deployer_round_trip.1.json +new file mode 100644 +index 0000000..b49d897 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_set_escrow_deployer_round_trip.1.json +@@ -0,0 +1,452 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "set_escrow_deployer", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "EscrowDeployer" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "JobRegistry initialized with admin: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "init" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "set_escrow_deployer" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "escrow_deployer configured: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "escrow" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_escrow_deployer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_escrow_deployer" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_escrow_deployer" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_submit_bid_after_expiration_panics.1.json b/contracts/job_registry/test_snapshots/test/test_submit_bid_after_expiration_panics.1.json +new file mode 100644 +index 0000000..5d5af4f +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_submit_bid_after_expiration_panics.1.json +@@ -0,0 +1,734 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 61, ++ "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_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Bids" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "vec": [] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "bidding_deadline" ++ }, ++ "val": { ++ "u64": 30 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "expires_at" ++ }, ++ "val": { ++ "u64": 60 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 100000 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 15 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 15 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 15 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 15 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 15 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "submit_bid" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1000 ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 15 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_unauthorized_accept_bid_panics_with_specific_error.1.json b/contracts/job_registry/test_snapshots/test/test_unauthorized_accept_bid_panics_with_specific_error.1.json +new file mode 100644 +index 0000000..f476746 +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_unauthorized_accept_bid_panics_with_specific_error.1.json +@@ -0,0 +1,1071 @@ ++{ ++ "generators": { ++ "address": 5, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "post_job", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_bid", ++ "args": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidByIndex" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidByIndex" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "u32": 0 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidCount" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidCount" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "u32": 1 ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidLookup" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "BidLookup" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "proposal_hash" ++ }, ++ "val": { ++ "bytes": "516d50726f706f73616c" ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": "void" ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d48617368" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Open" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 2 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "JobRegistry initialized with admin: {}" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "init" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "post_job: id {} client {} budget {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "jobpost" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5000 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "bytes": "516d50726f706f73616c" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "submit_bid: id {} freelancer {}" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "bid" ++ }, ++ { ++ "u64": 1 ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_bid" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "accept_bid" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 9 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 9 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 9 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 9 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 9 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "accept_bid" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 9 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/job_registry/test_snapshots/test/test_zero_budget_still_panics.1.json b/contracts/job_registry/test_snapshots/test/test_zero_budget_still_panics.1.json +new file mode 100644 +index 0000000..b97714f +--- /dev/null ++++ b/contracts/job_registry/test_snapshots/test/test_zero_budget_still_panics.1.json +@@ -0,0 +1,432 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "initialize", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "NextJobId" ++ } ++ ] ++ }, ++ "val": { ++ "u64": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "log" ++ } ++ ], ++ "data": { ++ "string": "initialized" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "post_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 4 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "post_job" ++ }, ++ { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "bytes": "516d48617368" ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ }, ++ { ++ "u64": 30 ++ }, ++ { ++ "u64": 60 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 4 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/src/lib.rs b/contracts/reputation/src/lib.rs +index 6ec8fef..45be0c2 100644 +--- a/contracts/reputation/src/lib.rs ++++ b/contracts/reputation/src/lib.rs +@@ -1,22 +1,26 @@ +-#![no_std] ++#![no_std] + + use soroban_sdk::{ + contract, contracterror, contractimpl, contracttype, Address, Bytes, BytesN, Env, IntoVal, + Symbol, Vec, + }; ++pub use profile::BadgeLevel; + + mod profile; + mod storage; ++pub use profile::{BadgeMetadataEntry, BadgeTier}; ++ ++use profile::{Profile, RoleMetrics}; + +-// Types matching Job Registry contract's public types for cross-contract decoding + #[contracttype] + #[derive(Clone, Debug, PartialEq)] + pub enum JobStatus { + Open, +- InProgress, ++ Assigned, + DeliverableSubmitted, + Completed, + Disputed, ++ Expired, + } + + #[contracttype] +@@ -26,7 +30,12 @@ pub struct JobRecord { + pub freelancer: Option
, + pub metadata_hash: Bytes, + pub budget_stroops: i128, ++ pub expires_at: u64, + pub status: JobStatus, ++ pub bid_deadline: u64, ++ pub collateral_token: Address, ++ pub collateral_amount: i128, ++ pub collateral_locked: bool, + } + + #[contracttype] +@@ -41,13 +50,15 @@ pub enum Role { + pub struct ReputationScore { + pub address: Address, + pub role: Role, +- /// Score in basis points (0–10000 = 0–100%) + pub score: i32, + pub total_jobs: u32, +- /// Sum of raw rating points (1-5) to compute aggregates off-chain +- pub total_points: i32, +- /// Number of reviews counted ++ pub total_points: i128, + pub reviews: u32, ++ /// Active badge level ++ pub badge_level: u32, ++ pub average_rating_bps: i32, ++ pub badge_level: u32, ++ pub blacklisted: bool, + } + + #[contracttype] +@@ -56,13 +67,16 @@ pub struct ReputationView { + pub address: Address, + pub client: ReputationScore, + pub freelancer: ReputationScore, ++ pub is_blacklisted: bool, + } + + #[contracttype] + pub enum DataKey { + Admin, + JobRegistry, ++ AuthorizedUpdater, + Reviewed(u64, Address), ++ AuthorizedContract(Address), + } + + #[contracterror] +@@ -75,6 +89,7 @@ pub enum ReputationError { + NotJobParticipant = 5, + AlreadyReviewed = 6, + ContractStateError = 7, ++ Blacklisted = 8, + } + + #[contracttype] +@@ -95,8 +110,11 @@ pub struct ReputationUpdatedEvent { + pub rating: u32, + pub new_score: i32, + pub total_jobs: u32, +- pub total_points: i32, ++ pub total_points: i128, + pub reviews: u32, ++ pub average_rating_bps: i32, ++ pub badge_level: u32, ++ pub blacklisted: bool, + pub updated_at: u64, + } + +@@ -108,9 +126,28 @@ pub struct ScoreAdjustedEvent { + pub delta: i32, + pub new_score: i32, + pub total_jobs: u32, ++ pub badge_level: u32, + pub adjusted_at: u64, + } + ++#[contracttype] ++#[derive(Clone)] ++pub struct AuthorizedContractUpdatedEvent { ++ pub by_admin: Address, ++ pub contract_address: Address, ++ pub updated_at: u64, ++} ++ ++#[contracttype] ++#[derive(Clone)] ++pub struct BlacklistUpdatedEvent { ++ pub address: Address, ++ pub is_blacklisted: bool, ++ pub client_score: i32, ++ pub freelancer_score: i32, ++ pub updated_at: u64, ++} ++ + #[contract] + pub struct ReputationContract; + +@@ -120,6 +157,11 @@ impl ReputationContract { + const INSTANCE_TTL_EXTEND_TO: u32 = 150_000; + const PERSISTENT_TTL_THRESHOLD: u32 = 50_000; + const PERSISTENT_TTL_EXTEND_TO: u32 = 150_000; ++ const SCORE_SCALE: i128 = 10_000; ++ const MAX_RATING: i128 = 5; ++ const DEFAULT_SCORE_BPS: i32 = 5_000; ++ const SLASH_DECAY_BPS: i32 = 8_000; ++ const BLACKLIST_DECAY_BPS: i32 = 1_000; + + fn bump_instance_ttl(env: &Env) { + env.storage() +@@ -127,36 +169,156 @@ impl ReputationContract { + .extend_ttl(Self::INSTANCE_TTL_THRESHOLD, Self::INSTANCE_TTL_EXTEND_TO); + } + +- fn score_from_rating(score: u32) -> i32 { +- (score as i32).saturating_mul(2_000) ++ fn clamp_score(value: i32) -> i32 { ++ value.clamp(0, 10_000) ++ } ++ ++ fn clamp_score_i128(value: i128) -> i32 { ++ Self::clamp_score(value.clamp(0, Self::SCORE_SCALE) as i32) ++ } ++ ++ fn read_admin(env: &Env) -> Address { ++ env.storage() ++ .instance() ++ .get(&DataKey::Admin) ++ .unwrap_or_else(|| soroban_sdk::panic_with_error!(env, ReputationError::NotInitialized)) ++ } ++ ++ fn read_authorized_updater(env: &Env) -> Address { ++ env.storage() ++ .instance() ++ .get(&DataKey::AuthorizedUpdater) ++ .unwrap_or_else(|| soroban_sdk::panic_with_error!(env, ReputationError::NotInitialized)) ++ } ++ ++ fn read_job_registry(env: &Env) -> Address { ++ env.storage() ++ .instance() ++ .get(&DataKey::JobRegistry) ++ .unwrap_or_else(|| soroban_sdk::panic_with_error!(env, ReputationError::NotInitialized)) ++ } ++ ++ fn require_admin(env: &Env, admin: &Address) { ++ let configured_admin = Self::read_admin(env); ++ admin.require_auth(); ++ if *admin != configured_admin { ++ soroban_sdk::panic_with_error!(env, ReputationError::Unauthorized); ++ } ++ } ++ ++ fn require_authorized_contract(env: &Env, caller_contract: &Address) { ++ let authorized_contract = Self::read_authorized_updater(env); ++ caller_contract.require_auth(); ++ if *caller_contract != authorized_contract { ++ soroban_sdk::panic_with_error!(env, ReputationError::Unauthorized); ++ } ++ } ++ ++ fn role_metrics<'a>(profile: &'a Profile, role: &Role) -> &'a RoleMetrics { ++ match role { ++ Role::Client => &profile.client, ++ Role::Freelancer => &profile.freelancer, ++ } ++ } ++ ++ fn role_metrics_mut<'a>(profile: &'a mut Profile, role: &Role) -> &'a mut RoleMetrics { ++ match role { ++ Role::Client => &mut profile.client, ++ Role::Freelancer => &mut profile.freelancer, ++ } + } + + fn score_from_profile( + address: &Address, + role: Role, +- profile: &profile::Profile, ++ profile: &Profile, + ) -> ReputationScore { +- match role { +- Role::Client => ReputationScore { +- address: address.clone(), +- role: Role::Client, +- score: profile.client_score, +- total_jobs: profile.client_jobs, +- total_points: profile.client_points, +- reviews: profile.client_jobs, +- }, +- Role::Freelancer => ReputationScore { +- address: address.clone(), +- role: Role::Freelancer, +- score: profile.freelancer_score, +- total_jobs: profile.freelancer_jobs, +- total_points: profile.freelancer_points, +- reviews: profile.freelancer_jobs, +- }, ++ let metrics = Self::role_metrics(profile, &role); ++ ReputationScore { ++ address: address.clone(), ++ role, ++ score: metrics.score, ++ total_jobs: metrics.completed_jobs, ++ total_points: metrics.review.total_points, ++ reviews: metrics.review.reviews, ++ average_rating_bps: metrics.review.average_rating_bps, ++ badge_level: metrics.badge_level, ++ blacklisted: profile.is_blacklisted, + } + } + +- /// Upgrades the current contract WASM. Only callable by admin. ++ fn checked_add_points(env: &Env, current: i128, incoming: u32) -> i128 { ++ current ++ .checked_add(incoming as i128) ++ .unwrap_or_else(|| soroban_sdk::panic_with_error!(env, ReputationError::ContractStateError)) ++ } ++ ++ fn average_rating_bps(env: &Env, total_points: i128, reviews: u32) -> i32 { ++ if reviews == 0 { ++ return Self::DEFAULT_SCORE_BPS; ++ } ++ ++ let numerator = total_points ++ .checked_mul(Self::SCORE_SCALE) ++ .unwrap_or_else(|| soroban_sdk::panic_with_error!(env, ReputationError::ContractStateError)); ++ let denominator = (reviews as i128) ++ .checked_mul(Self::MAX_RATING) ++ .unwrap_or_else(|| soroban_sdk::panic_with_error!(env, ReputationError::ContractStateError)); ++ ++ if denominator == 0 { ++ return Self::DEFAULT_SCORE_BPS; ++ } ++ ++ Self::clamp_score_i128(numerator / denominator) ++ } ++ ++ fn apply_decay_bps(env: &Env, score: i32, decay_bps: i32) -> i32 { ++ let decayed = (score as i128) ++ .checked_mul(decay_bps as i128) ++ .unwrap_or_else(|| soroban_sdk::panic_with_error!(env, ReputationError::ContractStateError)) ++ / Self::SCORE_SCALE; ++ Self::clamp_score_i128(decayed) ++ } ++ ++ fn badge_level(metrics: &RoleMetrics, is_blacklisted: bool) -> u32 { ++ if is_blacklisted { ++ 0 ++ } else if metrics.completed_jobs >= 15 && metrics.score >= 9_000 { ++ 3 ++ } else if metrics.completed_jobs >= 7 && metrics.score >= 8_000 { ++ 2 ++ } else if metrics.completed_jobs >= 3 && metrics.score >= 6_000 { ++ 1 ++ } else { ++ 0 ++ } ++ } ++ ++ fn refresh_badge(metrics: &mut RoleMetrics, is_blacklisted: bool) { ++ metrics.badge_level = Self::badge_level(metrics, is_blacklisted); ++ } ++ ++ fn apply_review(env: &Env, metrics: &mut RoleMetrics, score: u32, is_blacklisted: bool) { ++ metrics.review.total_points = ++ Self::checked_add_points(env, metrics.review.total_points, score); ++ metrics.review.reviews = metrics.review.reviews.saturating_add(1); ++ metrics.completed_jobs = metrics.completed_jobs.saturating_add(1); ++ metrics.review.average_rating_bps = ++ Self::average_rating_bps(env, metrics.review.total_points, metrics.review.reviews); ++ metrics.score = metrics.review.average_rating_bps; ++ Self::refresh_badge(metrics, is_blacklisted); ++ } ++ ++ fn apply_manual_delta(metrics: &mut RoleMetrics, delta: i32, is_blacklisted: bool) { ++ metrics.score = Self::clamp_score(metrics.score.saturating_add(delta)); ++ Self::refresh_badge(metrics, is_blacklisted); ++ } ++ ++ fn apply_role_decay(env: &Env, metrics: &mut RoleMetrics, decay_bps: i32, is_blacklisted: bool) { ++ metrics.score = Self::apply_decay_bps(env, metrics.score, decay_bps); ++ Self::refresh_badge(metrics, is_blacklisted); ++ } ++ + pub fn upgrade( + env: Env, + caller: Address, +@@ -165,12 +327,7 @@ impl ReputationContract { + Self::bump_instance_ttl(&env); + caller.require_auth(); + +- let admin: Address = env +- .storage() +- .instance() +- .get(&DataKey::Admin) +- .ok_or(ReputationError::NotInitialized)?; +- ++ let admin = Self::read_admin(&env); + if caller != admin { + return Err(ReputationError::Unauthorized); + } +@@ -197,23 +354,69 @@ impl ReputationContract { + Self::bump_instance_ttl(&env); + } + +- /// Set the JobRegistry contract address (admin only) + pub fn set_job_registry(env: Env, admin: Address, registry: Address) { ++ Self::require_admin(&env, &admin); ++ env.storage().instance().set(&DataKey::JobRegistry, ®istry); ++ Self::bump_instance_ttl(&env); ++ } ++ ++ pub fn set_authorized_contract(env: Env, admin: Address, contract_address: Address) { ++ Self::require_admin(&env, &admin); ++ env.storage() ++ .instance() ++ .set(&DataKey::AuthorizedUpdater, &contract_address); ++ env.events().publish( ++ ("reputation", "AuthorizedContractUpdated"), ++ AuthorizedContractUpdatedEvent { ++ by_admin: admin, ++ contract_address, ++ updated_at: env.ledger().timestamp(), ++ }, ++ ); ++ Self::bump_instance_ttl(&env); ++ } ++ ++ /// Authorize a contract address (admin only) ++ pub fn authorize_contract(env: Env, admin: Address, contract: Address) { ++ admin.require_auth(); + let configured_admin: Address = env + .storage() + .instance() + .get(&DataKey::Admin) + .expect("not initialized"); ++ assert!(admin == configured_admin, "only admin can authorize contracts"); ++ ++ env.storage() ++ .instance() ++ .set(&DataKey::AuthorizedContract(contract), &true); ++ Self::bump_instance_ttl(&env); ++ } + ++ /// Deauthorize a contract address (admin only) ++ pub fn deauthorize_contract(env: Env, admin: Address, contract: Address) { + admin.require_auth(); +- assert!(admin == configured_admin, "only admin can set job registry"); ++ let configured_admin: Address = env ++ .storage() ++ .instance() ++ .get(&DataKey::Admin) ++ .expect("not initialized"); ++ assert!(admin == configured_admin, "only admin can deauthorize contracts"); + + env.storage() + .instance() +- .set(&DataKey::JobRegistry, ®istry); ++ .remove(&DataKey::AuthorizedContract(contract)); + Self::bump_instance_ttl(&env); + } + ++ /// Check if a contract is authorized ++ pub fn is_contract_authorized(env: Env, contract: Address) -> bool { ++ Self::bump_instance_ttl(&env); ++ env.storage() ++ .instance() ++ .get(&DataKey::AuthorizedContract(contract)) ++ .unwrap_or(false) ++ } ++ + /// Submit a rating for a target address tied to a Job ID. Caller must be the client or freelancer + /// on the job, and the job must be Completed. + pub fn submit_rating(env: Env, caller: Address, job_id: u64, target: Address, score: u32) { +@@ -222,12 +425,7 @@ impl ReputationContract { + soroban_sdk::panic_with_error!(&env, ReputationError::InvalidInput); + } + +- let registry_addr: Address = env +- .storage() +- .instance() +- .get(&DataKey::JobRegistry) +- .expect("job registry not set"); +- ++ let registry_addr = Self::read_job_registry(&env); + let get_sym = Symbol::new(&env, "get_job"); + let args = soroban_sdk::vec![&env, job_id.into_val(&env)]; + let job: JobRecord = env +@@ -245,9 +443,10 @@ impl ReputationContract { + let caller_addr = caller.clone(); + let is_client = caller_addr == job.client; + let is_freelancer = match job.freelancer.clone() { +- Some(f) => caller_addr == f, ++ Some(freelancer) => caller_addr == freelancer, + None => false, + }; ++ + if !(is_client || is_freelancer) { + soroban_sdk::panic_with_error!(&env, ReputationError::Unauthorized); + } +@@ -258,33 +457,38 @@ impl ReputationContract { + } + + let mut profile = storage::read_profile_or_default(&env, &target); +- let (role, total_points, total_jobs, new_score) = if target == job.client { +- profile.client_points = profile.client_points.saturating_add(score as i32); +- profile.client_jobs = profile.client_jobs.saturating_add(1); +- let avg = profile.client_points / (profile.client_jobs as i32); +- let bps = Self::score_from_rating(avg as u32); +- profile.client_score = Self::clamp_score(bps); +- ( +- Role::Client, +- profile.client_points, +- profile.client_jobs, +- profile.client_score, +- ) +- } else if job.freelancer.as_ref() == Some(&target) { +- profile.freelancer_points = profile.freelancer_points.saturating_add(score as i32); +- profile.freelancer_jobs = profile.freelancer_jobs.saturating_add(1); +- let avg = profile.freelancer_points / (profile.freelancer_jobs as i32); +- let bps = Self::score_from_rating(avg as u32); +- profile.freelancer_score = Self::clamp_score(bps); +- ( +- Role::Freelancer, +- profile.freelancer_points, +- profile.freelancer_jobs, +- profile.freelancer_score, +- ) +- } else { +- soroban_sdk::panic_with_error!(&env, ReputationError::NotJobParticipant); +- }; ++ if profile.is_blacklisted { ++ soroban_sdk::panic_with_error!(&env, ReputationError::Blacklisted); ++ } ++ ++ let (role, total_points, total_jobs, new_score, reviews, average_rating_bps, badge_level) = ++ if target == job.client { ++ let is_blacklisted = profile.is_blacklisted; ++ Self::apply_review(&env, &mut profile.client, score, is_blacklisted); ++ ( ++ Role::Client, ++ profile.client.review.total_points, ++ profile.client.completed_jobs, ++ profile.client.score, ++ profile.client.review.reviews, ++ profile.client.review.average_rating_bps, ++ profile.client.badge_level, ++ ) ++ } else if job.freelancer.as_ref() == Some(&target) { ++ let is_blacklisted = profile.is_blacklisted; ++ Self::apply_review(&env, &mut profile.freelancer, score, is_blacklisted); ++ ( ++ Role::Freelancer, ++ profile.freelancer.review.total_points, ++ profile.freelancer.completed_jobs, ++ profile.freelancer.score, ++ profile.freelancer.review.reviews, ++ profile.freelancer.review.average_rating_bps, ++ profile.freelancer.badge_level, ++ ) ++ } else { ++ soroban_sdk::panic_with_error!(&env, ReputationError::NotJobParticipant); ++ }; + + storage::write_profile(&env, &target, &profile); + env.storage().persistent().set(&reviewed_key, &true); +@@ -304,7 +508,10 @@ impl ReputationContract { + new_score, + total_jobs, + total_points, +- reviews: total_jobs, ++ reviews, ++ average_rating_bps, ++ badge_level, ++ blacklisted: profile.is_blacklisted, + updated_at: env.ledger().timestamp(), + }, + ); +@@ -312,89 +519,195 @@ impl ReputationContract { + } + + /// Update reputation after a completed job. `delta` in basis points. +- /// Score is clamped to [0, 10000]. +- pub fn update_score(env: Env, address: Address, role: Role, delta: i32) { +- let admin: Address = env +- .storage() +- .instance() +- .get(&DataKey::Admin) +- .expect("not initialized"); +- admin.require_auth(); ++ /// Score is clamped to [0, 10000]. Only callable by admin or authorized contract address. ++ pub fn update_score(env: Env, caller_contract: Address, address: Address, role: Role, delta: i32) { ++ Self::require_authorized_contract(&env, &caller_contract); + + let mut profile = storage::read_profile_or_default(&env, &address); +- let (new_score, total_jobs) = match role { +- Role::Client => { +- profile.client_score = +- Self::clamp_score(profile.client_score.saturating_add(delta)); +- profile.client_jobs = profile.client_jobs.saturating_add(1); +- (profile.client_score, profile.client_jobs) +- } +- Role::Freelancer => { +- profile.freelancer_score = +- Self::clamp_score(profile.freelancer_score.saturating_add(delta)); +- profile.freelancer_jobs = profile.freelancer_jobs.saturating_add(1); +- (profile.freelancer_score, profile.freelancer_jobs) +- } +- }; ++ if profile.is_blacklisted { ++ soroban_sdk::panic_with_error!(&env, ReputationError::Blacklisted); ++ } ++ ++ let is_blacklisted = profile.is_blacklisted; ++ let metrics = Self::role_metrics_mut(&mut profile, &role); ++ let previous_score = metrics.score; ++ metrics.completed_jobs = metrics.completed_jobs.saturating_add(1); ++ Self::apply_manual_delta(metrics, delta, is_blacklisted); ++ let new_score = metrics.score; ++ let total_jobs = metrics.completed_jobs; ++ let badge_level = metrics.badge_level; + ++ profile.refresh_badges(); + storage::write_profile(&env, &address, &profile); + env.events().publish( + ("reputation", "ScoreAdjusted"), + ScoreAdjustedEvent { + address, + role, +- delta, ++ delta: new_score.saturating_sub(previous_score), + new_score, + total_jobs, ++ badge_level, + adjusted_at: env.ledger().timestamp(), + }, + ); + Self::bump_instance_ttl(&env); + } + +- /// Slash address for fraud / abandonment — reduces score by 20%. +- pub fn slash(env: Env, address: Address, role: Role, _reason: Symbol) { +- let admin: Address = env +- .storage() +- .instance() +- .get(&DataKey::Admin) +- .expect("not initialized"); +- admin.require_auth(); ++ /// Slash address for fraud / abandonment — reduces score by 20%. Only callable by admin or authorized contract. ++ pub fn slash(env: Env, caller_contract: Address, address: Address, role: Role, _reason: Symbol) { ++ Self::require_authorized_contract(&env, &caller_contract); + + let mut profile = storage::read_profile_or_default(&env, &address); +- let (new_score, total_jobs) = match role { +- Role::Client => { +- profile.client_score = Self::clamp_score(profile.client_score.saturating_sub(2000)); +- (profile.client_score, profile.client_jobs) +- } +- Role::Freelancer => { +- profile.freelancer_score = +- Self::clamp_score(profile.freelancer_score.saturating_sub(2000)); +- (profile.freelancer_score, profile.freelancer_jobs) +- } +- }; ++ if profile.is_blacklisted { ++ soroban_sdk::panic_with_error!(&env, ReputationError::Blacklisted); ++ } + ++ let is_blacklisted = profile.is_blacklisted; ++ let metrics = Self::role_metrics_mut(&mut profile, &role); ++ let previous_score = metrics.score; ++ Self::apply_role_decay(&env, metrics, Self::SLASH_DECAY_BPS, is_blacklisted); ++ let new_score = metrics.score; ++ let total_jobs = metrics.completed_jobs; ++ let badge_level = metrics.badge_level; ++ ++ profile.refresh_badges(); + storage::write_profile(&env, &address, &profile); + env.events().publish( + ("reputation", "ScoreAdjusted"), + ScoreAdjustedEvent { + address, + role, +- delta: -2_000, ++ delta: new_score.saturating_sub(previous_score), + new_score, + total_jobs, ++ badge_level, + adjusted_at: env.ledger().timestamp(), + }, + ); + Self::bump_instance_ttl(&env); + } + ++ pub fn blacklist_profile(env: Env, caller_contract: Address, address: Address, _reason: Symbol) { ++ Self::require_authorized_contract(&env, &caller_contract); ++ ++ let mut profile = storage::read_profile_or_default(&env, &address); ++ if !profile.is_blacklisted { ++ profile.is_blacklisted = true; ++ let is_blacklisted = profile.is_blacklisted; ++ Self::apply_role_decay(&env, &mut profile.client, Self::BLACKLIST_DECAY_BPS, is_blacklisted); ++ Self::apply_role_decay( ++ &env, ++ &mut profile.freelancer, ++ Self::BLACKLIST_DECAY_BPS, ++ is_blacklisted, ++ ); ++ } ++ ++ let client_score = profile.client.score; ++ let freelancer_score = profile.freelancer.score; ++ storage::write_profile(&env, &address, &profile); ++ env.events().publish( ++ ("reputation", "BlacklistUpdated"), ++ BlacklistUpdatedEvent { ++ address, ++ is_blacklisted: true, ++ client_score, ++ freelancer_score, ++ updated_at: env.ledger().timestamp(), ++ }, ++ ); ++ Self::bump_instance_ttl(&env); ++ } ++ ++ pub fn is_blacklisted(env: Env, address: Address) -> bool { ++ Self::bump_instance_ttl(&env); ++ storage::read_profile(&env, &address) ++ .map(|profile| profile.is_blacklisted) ++ .unwrap_or(false) ++ } ++ ++ /// Return the current badge level for an address/role pair. ++ pub fn get_badge(env: Env, address: Address, role: Role) -> BadgeLevel { ++ Self::bump_instance_ttl(&env); ++ let profile = storage::read_profile_or_default(&env, &address); ++ match role { ++ Role::Client => profile.client_badge, ++ Role::Freelancer => profile.freelancer_badge, ++ } ++ } ++ ++ /// Admin-only: set the decentralised-storage URI for a badge tier. ++ /// `uri` is typically an IPFS CID pointing to the badge image/JSON. ++ pub fn set_badge_metadata( ++ env: Env, ++ admin: Address, ++ address: Address, ++ tier: BadgeTier, ++ uri: Bytes, ++ ) { ++ let configured_admin: Address = env ++ .storage() ++ .instance() ++ .get(&DataKey::Admin) ++ .expect("not initialized"); ++ admin.require_auth(); ++ assert!(admin == configured_admin, "unauthorized"); ++ ++ let mut profile = storage::read_profile_or_default(&env, &address); ++ ++ // Replace existing entry for this tier or push a new one. ++ let mut found = false; ++ let len = profile.badge_metadata.len(); ++ for i in 0..len { ++ let entry = profile.badge_metadata.get(i).unwrap(); ++ if entry.tier == tier { ++ profile.badge_metadata.set(i, BadgeMetadataEntry { tier: tier.clone(), uri: uri.clone() }); ++ found = true; ++ break; ++ } ++ } ++ if !found { ++ profile.badge_metadata.push_back(BadgeMetadataEntry { tier, uri }); ++ } ++ ++ storage::write_profile(&env, &address, &profile); ++ Self::bump_instance_ttl(&env); ++ } ++ ++ /// Return the metadata URI for a given badge tier, or `None` if not set. ++ pub fn get_badge_metadata( ++ env: Env, ++ address: Address, ++ tier: BadgeTier, ++ ) -> Option { ++ Self::bump_instance_ttl(&env); ++ let profile = storage::read_profile_or_default(&env, &address); ++ for i in 0..profile.badge_metadata.len() { ++ let entry = profile.badge_metadata.get(i).unwrap(); ++ if entry.tier == tier { ++ return Some(entry.uri); ++ } ++ } ++ None ++ } ++ + pub fn get_score(env: Env, address: Address, role: Role) -> ReputationScore { + Self::bump_instance_ttl(&env); + let profile = storage::read_profile_or_default(&env, &address); + Self::score_from_profile(&address, role, &profile) + } + ++ /// Get active badge level ++ pub fn get_badge_level(env: Env, address: Address, role: Role) -> u32 { ++ Self::bump_instance_ttl(&env); ++ let profile = storage::read_profile_or_default(&env, &address); ++ match role { ++ Role::Client => profile.client.badge_level, ++ Role::Freelancer => profile.freelancer.badge_level, ++ } ++ } ++ + /// Update profile metadata hash (IPFS CID) + pub fn update_profile_metadata(env: Env, address: Address, metadata_hash: Bytes) { + address.require_auth(); +@@ -404,14 +717,13 @@ impl ReputationContract { + Self::bump_instance_ttl(&env); + } + +- /// Get profile metadata hash + pub fn get_profile_metadata(env: Env, address: Address) -> Option { + Self::bump_instance_ttl(&env); +- storage::read_profile(&env, &address).and_then(|p| p.metadata_hash) ++ storage::read_profile(&env, &address).and_then(|profile| profile.metadata_hash) + } + + /// Frontend-friendly aggregate metrics for public profile pages. +- /// Returns: [score_bps, total_jobs, total_points, reviews] ++ /// Returns: [score_bps, total_jobs, total_points, reviews, badge_level] + pub fn get_public_metrics(env: Env, address: Address, role_name: Symbol) -> Vec { + let role = if role_name == Symbol::new(&env, "client") { + Role::Client +@@ -420,17 +732,19 @@ impl ReputationContract { + } else { + soroban_sdk::panic_with_error!(&env, ReputationError::InvalidInput); + }; +- let rep = Self::get_score(env.clone(), address, role); + ++ let rep = Self::get_score(env.clone(), address, role); + let mut metrics = Vec::new(&env); + metrics.push_back(rep.score as i128); + metrics.push_back(rep.total_jobs as i128); +- metrics.push_back(rep.total_points as i128); ++ metrics.push_back(rep.total_points); + metrics.push_back(rep.reviews as i128); ++ metrics.push_back(rep.badge_level as i128); ++ metrics.push_back(rep.average_rating_bps as i128); ++ metrics.push_back(if rep.blacklisted { 1 } else { 0 }); + metrics + } + +- /// Read both role snapshots for a single address in one call. + pub fn query_reputation(env: Env, address: Address) -> ReputationView { + Self::bump_instance_ttl(&env); + let profile = storage::read_profile_or_default(&env, &address); +@@ -440,15 +754,12 @@ impl ReputationContract { + address, + client, + freelancer, ++ is_blacklisted: profile.is_blacklisted, + } + } + } + +-impl ReputationContract { +- fn clamp_score(value: i32) -> i32 { +- value.clamp(0, 10_000) +- } +-} ++ + + #[cfg(test)] + mod test { +@@ -470,64 +781,308 @@ mod test { + env.storage().persistent().set(&MockKey::Job(job_id), &job); + } + +- pub fn get_job(env: Env, _job_id: u64) -> Result { ++ pub fn get_job(env: Env, job_id: u64) -> Result { + Ok(env + .storage() + .persistent() +- .get(&MockKey::Job(_job_id)) ++ .get(&MockKey::Job(job_id)) + .expect("mock job missing")) + } + } + ++ #[contract] ++ pub struct AuthorizedAdjuster; ++ ++ #[contractimpl] ++ impl AuthorizedAdjuster { ++ pub fn award(env: Env, reputation: Address, target: Address, role: Role, delta: i32) { ++ let reputation_client = ReputationContractClient::new(&env, &reputation); ++ let caller_contract = env.current_contract_address(); ++ reputation_client.update_score(&caller_contract, &target, &role, &delta); ++ } ++ ++ pub fn slash(env: Env, reputation: Address, target: Address, role: Role, reason: Symbol) { ++ let reputation_client = ReputationContractClient::new(&env, &reputation); ++ let caller_contract = env.current_contract_address(); ++ reputation_client.slash(&caller_contract, &target, &role, &reason); ++ } ++ ++ pub fn blacklist(env: Env, reputation: Address, target: Address, reason: Symbol) { ++ let reputation_client = ReputationContractClient::new(&env, &reputation); ++ let caller_contract = env.current_contract_address(); ++ reputation_client.blacklist_profile(&caller_contract, &target, &reason); ++ } ++ } ++ ++ fn setup_job( ++ env: &Env, ++ registry: &Address, ++ job_id: u64, ++ client_address: &Address, ++ freelancer: &Address, ++ ) { ++ let job = JobRecord { ++ client: client_address.clone(), ++ freelancer: Some(freelancer.clone()), ++ metadata_hash: Bytes::from_slice(env, b"QmJob"), ++ budget_stroops: 10, ++ expires_at: 0, ++ status: JobStatus::Completed, ++ bid_deadline: 0, ++ collateral_token: Address::generate(env), ++ collateral_amount: 0, ++ collateral_locked: false, ++ }; ++ let registry_client = MockJobRegistryClient::new(env, registry); ++ registry_client.set_job(&job_id, &job); ++ } ++ + #[test] +- fn test_initial_score() { ++ fn test_empty_profile_reads_are_safe() { + let env = Env::default(); + let address = Address::generate(&env); + let contract_id = env.register_contract(None, ReputationContract); + let client = ReputationContractClient::new(&env, &contract_id); + + let score = client.get_score(&address, &Role::Freelancer); +- assert_eq!(score.score, 5000); ++ assert_eq!(score.score, 5_000); + assert_eq!(score.total_jobs, 0); ++ assert_eq!(score.total_points, 0); ++ assert_eq!(score.reviews, 0); ++ assert_eq!(score.average_rating_bps, 5_000); ++ assert_eq!(score.badge_level, 0); ++ assert!(!score.blacklisted); ++ ++ let view = client.query_reputation(&address); ++ assert_eq!(view.client.score, 5_000); ++ assert_eq!(view.freelancer.score, 5_000); ++ assert!(!view.is_blacklisted); ++ ++ let metadata = client.get_profile_metadata(&address); ++ assert_eq!(metadata, None); ++ } ++ ++ #[test] ++ fn test_authorized_contract_updates_score() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let target = Address::generate(&env); ++ let reputation_id = env.register_contract(None, ReputationContract); ++ let adjuster_id = env.register_contract(None, AuthorizedAdjuster); ++ let client = ReputationContractClient::new(&env, &reputation_id); ++ let adjuster = AuthorizedAdjusterClient::new(&env, &adjuster_id); ++ ++ client.initialize(&admin); ++ client.set_authorized_contract(&admin, &adjuster_id); ++ ++ adjuster.award(&reputation_id, &target, &Role::Freelancer, &1_500); ++ ++ let score = client.get_score(&target, &Role::Freelancer); ++ assert_eq!(score.score, 6_500); ++ assert_eq!(score.total_jobs, 0); ++ assert_eq!(score.badge_level, 0); ++ } ++ ++ #[test] ++ fn test_slash_uses_fixed_point_decay() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let client_addr = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ let reputation_id = env.register_contract(None, ReputationContract); ++ let registry_id = env.register_contract(None, MockJobRegistry); ++ let adjuster_id = env.register_contract(None, AuthorizedAdjuster); ++ let client = ReputationContractClient::new(&env, &reputation_id); ++ let adjuster = AuthorizedAdjusterClient::new(&env, &adjuster_id); ++ ++ client.initialize(&admin); ++ client.set_job_registry(&admin, ®istry_id); ++ client.set_authorized_contract(&admin, &adjuster_id); ++ ++ setup_job(&env, ®istry_id, 1, &client_addr, &freelancer); ++ client.submit_rating(&client_addr, &1, &freelancer, &5); ++ ++ adjuster.slash( ++ &reputation_id, ++ &freelancer, ++ &Role::Freelancer, ++ &Symbol::new(&env, "fraud"), ++ ); ++ ++ let score = client.get_score(&freelancer, &Role::Freelancer); ++ assert_eq!(score.score, 8_000); ++ assert_eq!(score.badge_level, 0); + } + + #[test] +- fn test_update_score() { ++ fn test_badge_upgrades_reflect_immediately_in_public_getters() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ let client_one = Address::generate(&env); ++ let client_two = Address::generate(&env); ++ let client_three = Address::generate(&env); ++ let reputation_id = env.register_contract(None, ReputationContract); ++ let registry_id = env.register_contract(None, MockJobRegistry); ++ let client = ReputationContractClient::new(&env, &reputation_id); ++ ++ client.initialize(&admin); ++ client.set_job_registry(&admin, ®istry_id); ++ ++ setup_job(&env, ®istry_id, 11, &client_one, &freelancer); ++ setup_job(&env, ®istry_id, 12, &client_two, &freelancer); ++ setup_job(&env, ®istry_id, 13, &client_three, &freelancer); ++ ++ client.submit_rating(&client_one, &11, &freelancer, &5); ++ let after_first = client.get_public_metrics(&freelancer, &Symbol::new(&env, "freelancer")); ++ assert_eq!(after_first.get(4), Some(0)); ++ ++ client.submit_rating(&client_two, &12, &freelancer, &5); ++ let after_second = client.get_public_metrics(&freelancer, &Symbol::new(&env, "freelancer")); ++ assert_eq!(after_second.get(4), Some(0)); ++ ++ client.submit_rating(&client_three, &13, &freelancer, &5); ++ let after_third = client.get_public_metrics(&freelancer, &Symbol::new(&env, "freelancer")); ++ assert_eq!(after_third.get(4), Some(1)); ++ assert_eq!(after_third.get(5), Some(10_000)); ++ ++ let score = client.get_score(&freelancer, &Role::Freelancer); ++ assert_eq!(score.badge_level, 1); ++ assert_eq!(score.total_jobs, 3); ++ } ++ ++ #[test] ++ fn test_blacklist_clears_badges_and_sets_flag() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ let client_one = Address::generate(&env); ++ let client_two = Address::generate(&env); ++ let client_three = Address::generate(&env); ++ let reputation_id = env.register_contract(None, ReputationContract); ++ let registry_id = env.register_contract(None, MockJobRegistry); ++ let adjuster_id = env.register_contract(None, AuthorizedAdjuster); ++ let client = ReputationContractClient::new(&env, &reputation_id); ++ let adjuster = AuthorizedAdjusterClient::new(&env, &adjuster_id); ++ ++ client.initialize(&admin); ++ client.set_job_registry(&admin, ®istry_id); ++ client.set_authorized_contract(&admin, &adjuster_id); ++ ++ setup_job(&env, ®istry_id, 21, &client_one, &freelancer); ++ setup_job(&env, ®istry_id, 22, &client_two, &freelancer); ++ setup_job(&env, ®istry_id, 23, &client_three, &freelancer); ++ ++ client.submit_rating(&client_one, &21, &freelancer, &5); ++ client.submit_rating(&client_two, &22, &freelancer, &5); ++ client.submit_rating(&client_three, &23, &freelancer, &5); ++ adjuster.blacklist(&reputation_id, &freelancer, &Symbol::new(&env, "fraud")); ++ ++ let score = client.get_score(&freelancer, &Role::Freelancer); ++ assert!(score.blacklisted); ++ assert_eq!(score.score, 1_000); ++ assert_eq!(score.badge_level, 0); ++ ++ let view = client.query_reputation(&freelancer); ++ assert!(view.is_blacklisted); ++ assert!(client.is_blacklisted(&freelancer)); ++ } ++ ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #3)")] ++ fn test_get_public_metrics_rejects_unknown_role() { ++ let env = Env::default(); + let address = Address::generate(&env); + let contract_id = env.register_contract(None, ReputationContract); + let client = ReputationContractClient::new(&env, &contract_id); + ++ client.get_public_metrics(&address, &Symbol::new(&env, "bogus")); ++ } ++ ++ #[test] ++ fn test_submit_rating_updates_client_and_freelancer_paths() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let caller = Address::generate(&env); ++ let target = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ let caller_two = Address::generate(&env); ++ let contract_id = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &contract_id); + client.initialize(&admin); +- client.update_score(&address, &Role::Freelancer, &500); + +- let score = client.get_score(&address, &Role::Freelancer); +- assert_eq!(score.score, 5500); +- assert_eq!(score.total_jobs, 1); ++ let registry_id = env.register_contract(None, MockJobRegistry); ++ client.set_job_registry(&admin, ®istry_id); ++ ++ setup_job(&env, ®istry_id, 7, &caller, &freelancer); ++ setup_job(&env, ®istry_id, 8, &caller_two, &target); ++ ++ client.submit_rating(&caller, &7, &freelancer, &5); ++ let freelancer_score = client.get_score(&freelancer, &Role::Freelancer); ++ assert_eq!(freelancer_score.score, 10_000); ++ assert_eq!(freelancer_score.total_jobs, 1); ++ assert_eq!(freelancer_score.total_points, 5); ++ assert_eq!(freelancer_score.reviews, 1); ++ assert_eq!(freelancer_score.average_rating_bps, 10_000); ++ assert_eq!(freelancer_score.badge_level, 0); ++ ++ client.submit_rating(&caller_two, &8, &target, &4); ++ let second_freelancer_score = client.get_score(&target, &Role::Freelancer); ++ assert_eq!(second_freelancer_score.score, 8_000); ++ assert_eq!(second_freelancer_score.total_jobs, 1); ++ assert_eq!(second_freelancer_score.total_points, 4); ++ assert_eq!(second_freelancer_score.reviews, 1); ++ assert_eq!(second_freelancer_score.average_rating_bps, 8_000); + } + + #[test] +- fn test_slash() { ++ #[should_panic(expected = "Error(Contract, #2)")] ++ fn test_direct_score_adjustment_requires_authorized_contract() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); +- let address = Address::generate(&env); ++ let attacker = Address::generate(&env); ++ let target = Address::generate(&env); + let contract_id = env.register_contract(None, ReputationContract); ++ let authorized_contract = env.register_contract(None, AuthorizedAdjuster); + let client = ReputationContractClient::new(&env, &contract_id); + + client.initialize(&admin); +- client.slash( +- &address, +- &Role::Client, +- &soroban_sdk::Symbol::new(&env, "fraud"), +- ); ++ client.set_authorized_contract(&admin, &authorized_contract); ++ client.update_score(&attacker, &target, &Role::Freelancer, &500); ++ } + +- let score = client.get_score(&address, &Role::Client); +- assert_eq!(score.score, 3000); // 5000 - 2000 ++ #[test] ++ #[should_panic(expected = "Error(Contract, #2)")] ++ fn test_direct_reviews_from_unverified_public_keys_are_rejected() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let attacker = Address::generate(&env); ++ let job_client = Address::generate(&env); ++ let freelancer = Address::generate(&env); ++ let contract_id = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &contract_id); ++ ++ client.initialize(&admin); ++ let registry_id = env.register_contract(None, MockJobRegistry); ++ client.set_job_registry(&admin, ®istry_id); ++ setup_job(&env, ®istry_id, 33, &job_client, &freelancer); ++ ++ client.submit_rating(&attacker, &33, &freelancer, &5); + } + + #[test] +@@ -546,127 +1101,279 @@ mod test { + assert_eq!(saved_hash, Some(hash)); + } + ++ // ΓöÇΓöÇ Issue #402: badge minting ΓöÇΓöÇ ++ + #[test] +- fn test_unified_storage() { ++ fn test_badge_starts_at_bronze_for_default_score() { + let env = Env::default(); + env.mock_all_auths(); ++ let admin = Address::generate(&env); ++ let addr = Address::generate(&env); ++ let cid = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &cid); ++ client.initialize(&admin); ++ ++ // Default score is 5000 ΓåÆ Bronze ++ let badge = client.get_badge(&addr, &Role::Freelancer); ++ assert_eq!(badge, BadgeLevel::Bronze); ++ } + ++ #[test] ++ fn test_badge_upgrades_to_silver_at_6000() { ++ let env = Env::default(); ++ env.mock_all_auths(); + let admin = Address::generate(&env); +- let address = Address::generate(&env); +- let contract_id = env.register_contract(None, ReputationContract); +- let client = ReputationContractClient::new(&env, &contract_id); ++ let addr = Address::generate(&env); ++ let cid = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &cid); ++ client.initialize(&admin); ++ client.set_authorized_contract(&admin, &admin); + ++ // Raise score by 1000 ΓåÆ 5000+1000 = 6000 ΓåÆ Silver ++ client.update_score(&admin, &addr, &Role::Freelancer, &1000); ++ let badge = client.get_badge(&addr, &Role::Freelancer); ++ assert_eq!(badge, BadgeLevel::Silver); ++ } ++ ++ #[test] ++ fn test_badge_upgrades_to_gold_at_8000() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ let admin = Address::generate(&env); ++ let addr = Address::generate(&env); ++ let cid = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &cid); + client.initialize(&admin); ++ client.set_authorized_contract(&admin, &admin); + +- // Update freelancer score +- client.update_score(&address, &Role::Freelancer, &1000); +- // Update client score for SAME address +- client.update_score(&address, &Role::Client, &500); ++ client.update_score(&admin, &addr, &Role::Freelancer, &3000); // 5000+3000=8000 ++ assert_eq!(client.get_badge(&addr, &Role::Freelancer), BadgeLevel::Gold); ++ } ++ ++ #[test] ++ fn test_slash_downgrades_badge() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ let admin = Address::generate(&env); ++ let addr = Address::generate(&env); ++ let cid = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &cid); ++ client.initialize(&admin); ++ client.set_authorized_contract(&admin, &admin); ++ ++ // Bring to Gold first, then slash twice to drop back to Bronze ++ client.update_score(&admin, &addr, &Role::Client, &3000); // 8000 ΓåÆ Gold ++ assert_eq!(client.get_badge(&addr, &Role::Client), BadgeLevel::Gold); ++ client.slash(&admin, &addr, &Role::Client, &soroban_sdk::Symbol::new(&env, "fraud")); // 6000 ΓåÆ Silver ++ assert_eq!(client.get_badge(&addr, &Role::Client), BadgeLevel::Silver); ++ client.slash(&admin, &addr, &Role::Client, &soroban_sdk::Symbol::new(&env, "fraud")); // 4000 ΓåÆ Bronze ++ assert_eq!(client.get_badge(&addr, &Role::Client), BadgeLevel::Bronze); ++ } + +- let f_score = client.get_score(&address, &Role::Freelancer); +- let c_score = client.get_score(&address, &Role::Client); ++ // ΓöÇΓöÇ Issue #406: badge metadata mapping ΓöÇΓöÇ + +- assert_eq!(f_score.score, 6000); +- assert_eq!(c_score.score, 5500); ++ #[test] ++ fn test_set_and_get_badge_metadata() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ let admin = Address::generate(&env); ++ let addr = Address::generate(&env); ++ let cid = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &cid); ++ client.initialize(&admin); ++ ++ let uri = Bytes::from_slice(&env, b"ipfs://QmBronzeBadge"); ++ client.set_badge_metadata(&admin, &addr, &BadgeTier::Bronze, &uri); ++ ++ let result = client.get_badge_metadata(&addr, &BadgeTier::Bronze); ++ assert_eq!(result, Some(uri)); + } + + #[test] +- fn test_query_reputation_returns_both_roles() { ++ fn test_badge_metadata_returns_none_when_unset() { + let env = Env::default(); + env.mock_all_auths(); ++ let addr = Address::generate(&env); ++ let cid = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &cid); + ++ let result = client.get_badge_metadata(&addr, &BadgeTier::Gold); ++ assert_eq!(result, None); ++ } ++ ++ #[test] ++ fn test_badge_metadata_update_overwrites_existing() { ++ let env = Env::default(); ++ env.mock_all_auths(); + let admin = Address::generate(&env); +- let address = Address::generate(&env); ++ let addr = Address::generate(&env); ++ let cid = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &cid); ++ client.initialize(&admin); ++ ++ let uri_v1 = Bytes::from_slice(&env, b"ipfs://QmSilverV1"); ++ let uri_v2 = Bytes::from_slice(&env, b"ipfs://QmSilverV2"); ++ client.set_badge_metadata(&admin, &addr, &BadgeTier::Silver, &uri_v1); ++ client.set_badge_metadata(&admin, &addr, &BadgeTier::Silver, &uri_v2); ++ ++ assert_eq!(client.get_badge_metadata(&addr, &BadgeTier::Silver), Some(uri_v2)); ++ } ++ ++ #[test] ++ fn test_multiple_tiers_stored_independently() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ let admin = Address::generate(&env); ++ let addr = Address::generate(&env); ++ let cid = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &cid); ++ client.initialize(&admin); ++ ++ let bronze_uri = Bytes::from_slice(&env, b"ipfs://Bronze"); ++ let gold_uri = Bytes::from_slice(&env, b"ipfs://Gold"); ++ client.set_badge_metadata(&admin, &addr, &BadgeTier::Bronze, &bronze_uri); ++ client.set_badge_metadata(&admin, &addr, &BadgeTier::Gold, &gold_uri); ++ ++ assert_eq!(client.get_badge_metadata(&addr, &BadgeTier::Bronze), Some(bronze_uri)); ++ assert_eq!(client.get_badge_metadata(&addr, &BadgeTier::Gold), Some(gold_uri)); ++ assert_eq!(client.get_badge_metadata(&addr, &BadgeTier::Silver), None); ++ } ++ ++ #[test] ++ #[should_panic(expected = "Error(Contract, #2)")] ++ fn test_upgrade_requires_admin() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let attacker = Address::generate(&env); + let contract_id = env.register_contract(None, ReputationContract); + let client = ReputationContractClient::new(&env, &contract_id); + + client.initialize(&admin); +- client.update_score(&address, &Role::Freelancer, &1000); +- client.update_score(&address, &Role::Client, &500); +- +- let view = client.query_reputation(&address); +- assert_eq!(view.address, address); +- assert_eq!(view.client.score, 5500); +- assert_eq!(view.client.total_jobs, 1); +- assert_eq!(view.client.total_points, 0); +- assert_eq!(view.freelancer.score, 6000); +- assert_eq!(view.freelancer.total_jobs, 1); +- assert_eq!(view.freelancer.total_points, 0); ++ let wasm_hash = BytesN::from_array(&env, &[0; 32]); ++ client.upgrade(&attacker, &wasm_hash); + } + + #[test] +- #[should_panic(expected = "Error(Contract, #3)")] +- fn test_get_public_metrics_rejects_unknown_role() { ++ fn test_empty_account_load_save() { + let env = Env::default(); + let address = Address::generate(&env); + let contract_id = env.register_contract(None, ReputationContract); + let client = ReputationContractClient::new(&env, &contract_id); + +- client.get_public_metrics(&address, &soroban_sdk::Symbol::new(&env, "bogus")); ++ // Fetching score for empty account should not panic and return defaults ++ let score = client.get_score(&address, &Role::Freelancer); ++ assert_eq!(score.score, 5000); ++ assert_eq!(score.badge_level, 0); ++ ++ let level = client.get_badge_level(&address, &Role::Freelancer); ++ assert_eq!(level, 0); + } + + #[test] +- fn test_submit_rating_updates_client_and_freelancer_paths() { ++ fn test_badge_upgrades() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); +- let caller = Address::generate(&env); +- let target = Address::generate(&env); +- let freelancer = Address::generate(&env); +- let caller2 = Address::generate(&env); ++ let address = Address::generate(&env); + let contract_id = env.register_contract(None, ReputationContract); + let client = ReputationContractClient::new(&env, &contract_id); ++ + client.initialize(&admin); ++ client.set_authorized_contract(&admin, &admin); + +- let mock_id = env.register_contract(None, MockJobRegistry); +- client.set_job_registry(&admin, &mock_id); ++ // Initially level 0 ++ assert_eq!(client.get_badge_level(&address, &Role::Freelancer), 0); + +- let job = JobRecord { +- client: caller.clone(), +- freelancer: Some(freelancer.clone()), +- metadata_hash: Bytes::from_slice(&env, b"QmJob"), +- budget_stroops: 10, +- status: JobStatus::Completed, +- }; +- let mock_client = MockJobRegistryClient::new(&env, &mock_id); +- mock_client.set_job(&7u64, &job); +- let other_job = JobRecord { +- client: caller2.clone(), +- freelancer: Some(target.clone()), +- metadata_hash: Bytes::from_slice(&env, b"QmJob2"), +- budget_stroops: 10, +- status: JobStatus::Completed, +- }; +- mock_client.set_job(&8u64, &other_job); ++ // Level 1: score >= 6000 and completed_jobs >= 3 ++ // First job: score 5500 ++ client.update_score(&admin, &address, &Role::Freelancer, &500); ++ assert_eq!(client.get_badge_level(&address, &Role::Freelancer), 0); + +- client.submit_rating(&caller, &7u64, &freelancer, &5u32); +- let client_score = client.get_score(&freelancer, &Role::Freelancer); +- assert_eq!(client_score.score, 10_000); +- assert_eq!(client_score.total_jobs, 1); +- assert_eq!(client_score.total_points, 5); ++ // Second job: score 6000, total_jobs = 2 ++ client.update_score(&admin, &address, &Role::Freelancer, &500); ++ assert_eq!(client.get_badge_level(&address, &Role::Freelancer), 0); + +- client.submit_rating(&caller2, &8u64, &target, &4u32); +- let freelancer_score = client.get_score(&target, &Role::Freelancer); +- assert_eq!(freelancer_score.score, 8_000); +- assert_eq!(freelancer_score.total_jobs, 1); +- assert_eq!(freelancer_score.total_points, 4); +- assert_eq!(freelancer_score.reviews, 1); ++ // Third job: score 6500, total_jobs = 3 -> Should upgrade to level 1! ++ client.update_score(&admin, &address, &Role::Freelancer, &500); ++ assert_eq!(client.get_badge_level(&address, &Role::Freelancer), 1); ++ ++ // Check public metrics ++ let metrics = client.get_public_metrics(&address, &soroban_sdk::Symbol::new(&env, "freelancer")); ++ assert_eq!(metrics.get(0).unwrap(), 6500); ++ assert_eq!(metrics.get(1).unwrap(), 3); ++ assert_eq!(metrics.get(4).unwrap(), 1); + } + + #[test] +- #[should_panic(expected = "Error(Contract, #2)")] +- fn test_upgrade_requires_admin() { ++ fn test_authorized_contract_score_adjustment() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); +- let attacker = Address::generate(&env); ++ let authorized_contract = Address::generate(&env); ++ let unauthorized_contract = Address::generate(&env); ++ let address = Address::generate(&env); ++ + let contract_id = env.register_contract(None, ReputationContract); + let client = ReputationContractClient::new(&env, &contract_id); + + client.initialize(&admin); +- let wasm_hash = BytesN::from_array(&env, &[0; 32]); +- client.upgrade(&attacker, &wasm_hash); ++ ++ // Authorize the contract ++ client.authorize_contract(&admin, &authorized_contract); ++ assert!(client.is_contract_authorized(&authorized_contract)); ++ assert!(!client.is_contract_authorized(&unauthorized_contract)); ++ ++ // Authorized contract adjusts score ++ client.update_score(&authorized_contract, &address, &Role::Freelancer, &100); ++ let score = client.get_score(&address, &Role::Freelancer); ++ assert_eq!(score.score, 5100); ++ ++ // Unauthorized contract attempt to adjust score should panic ++ let res = client.try_update_score(&unauthorized_contract, &address, &Role::Freelancer, &100); ++ assert!(res.is_err()); ++ ++ // Deauthorize ++ client.deauthorize_contract(&admin, &authorized_contract); ++ assert!(!client.is_contract_authorized(&authorized_contract)); ++ ++ // Now it should fail ++ let res2 = client.try_update_score(&authorized_contract, &address, &Role::Freelancer, &100); ++ assert!(res2.is_err()); ++ } ++ ++ #[test] ++ fn test_arbitrary_direct_review_rejected() { ++ let env = Env::default(); ++ env.mock_all_auths(); ++ ++ let admin = Address::generate(&env); ++ let client_addr = Address::generate(&env); ++ let freelancer_addr = Address::generate(&env); ++ let attacker = Address::generate(&env); ++ ++ let contract_id = env.register_contract(None, ReputationContract); ++ let client = ReputationContractClient::new(&env, &contract_id); ++ client.initialize(&admin); ++ ++ let mock_id = env.register_contract(None, MockJobRegistry); ++ client.set_job_registry(&admin, &mock_id); ++ ++ let job = JobRecord { ++ client: client_addr.clone(), ++ freelancer: Some(freelancer_addr.clone()), ++ metadata_hash: Bytes::from_slice(&env, b"QmJob"), ++ budget_stroops: 10, ++ status: JobStatus::Completed, ++ }; ++ let mock_client = MockJobRegistryClient::new(&env, &mock_id); ++ mock_client.set_job(&7u64, &job); ++ ++ // Attacker who is not part of the job tries to rate the freelancer ++ let res = client.try_submit_rating(&attacker, &7u64, &freelancer_addr, &5u32); ++ assert!(res.is_err()); // should reject with unauthorized + } + } +diff --git a/contracts/reputation/src/profile.rs b/contracts/reputation/src/profile.rs +index 5a47aa1..77e1dfe 100644 +--- a/contracts/reputation/src/profile.rs ++++ b/contracts/reputation/src/profile.rs +@@ -1,35 +1,121 @@ +-use soroban_sdk::{contracttype, Address, Bytes, Env}; ++use soroban_sdk::{contracttype, Address, Bytes, Env}; ++ ++#[contracttype] ++#[derive(Clone, Debug, PartialEq)] ++pub struct ReviewAggregate { ++ pub total_points: i128, ++ pub reviews: u32, ++ pub average_rating_bps: i32, ++} ++ ++impl ReviewAggregate { ++ pub fn new() -> Self { ++ Self { ++ total_points: 0, ++ reviews: 0, ++ average_rating_bps: 5_000, ++ } ++ } ++} ++ ++#[contracttype] ++#[derive(Clone, Debug, PartialEq)] ++pub struct RoleMetrics { ++ pub score: i32, ++ pub completed_jobs: u32, ++ pub review: ReviewAggregate, ++ pub badge_level: u32, ++} ++ ++impl RoleMetrics { ++ pub fn new() -> Self { ++ Self { ++ score: 5_000, ++ completed_jobs: 0, ++ review: ReviewAggregate::new(), ++ badge_level: 0, ++ } ++ } ++} ++ ++/// Badge tier awarded based on cumulative score thresholds. ++/// Scores are in basis points (0ΓÇô10 000). ++/// ++/// Thresholds: ++/// Bronze ΓëÑ 4 000 ++/// Silver ΓëÑ 6 000 ++/// Gold ΓëÑ 8 000 ++/// Platinum ΓëÑ 9 500 ++#[contracttype] ++#[derive(Clone, Debug, PartialEq, Eq)] ++pub enum BadgeLevel { ++ None, ++ Bronze, ++ Silver, ++ Gold, ++ Platinum, ++} ++ ++impl BadgeLevel { ++ pub fn from_score(score: i32) -> Self { ++ match score { ++ s if s >= 9_500 => BadgeLevel::Platinum, ++ s if s >= 8_000 => BadgeLevel::Gold, ++ s if s >= 6_000 => BadgeLevel::Silver, ++ s if s >= 4_000 => BadgeLevel::Bronze, ++ _ => BadgeLevel::None, ++ } ++ } ++} ++ ++/// Badge tiers keyed in the metadata map. ++#[contracttype] ++#[derive(Clone, Debug, PartialEq, Eq)] ++pub enum BadgeTier { ++ Bronze, ++ Silver, ++ Gold, ++ Platinum, ++} ++ ++#[contracttype] ++#[derive(Clone, Debug, PartialEq)] ++pub struct BadgeMetadataEntry { ++ pub tier: BadgeTier, ++ /// IPFS CID (or any URI) pointing to the badge image / JSON metadata. ++ pub uri: Bytes, ++} + + #[contracttype] + #[derive(Clone, Debug, PartialEq)] + pub struct Profile { + pub address: Address, +- pub client_score: i32, +- pub client_points: i32, +- pub client_jobs: u32, +- pub freelancer_score: i32, +- pub freelancer_points: i32, +- pub freelancer_jobs: u32, ++ pub client: RoleMetrics, ++ pub freelancer: RoleMetrics, ++ pub is_blacklisted: bool, + pub metadata_hash: Option, ++ /// Per-tier badge metadata URIs set by the admin. ++ pub badge_metadata: soroban_sdk::Vec, ++ pub client_badge: BadgeLevel, ++ pub freelancer_badge: BadgeLevel, + } + + impl Profile { +- pub fn new(_env: &Env, address: Address) -> Self { ++ pub fn new(env: &Env, address: Address) -> Self { + Self { + address, +- client_score: 5000, +- client_points: 0, +- client_jobs: 0, +- freelancer_score: 5000, +- freelancer_points: 0, +- freelancer_jobs: 0, ++ client: RoleMetrics::new(), ++ freelancer: RoleMetrics::new(), ++ is_blacklisted: false, + metadata_hash: None, ++ badge_metadata: soroban_sdk::Vec::new(env), ++ client_badge: BadgeLevel::Bronze, ++ freelancer_badge: BadgeLevel::Bronze, + } + } + +- pub fn default(_env: Env) -> Self { +- // This is tricky because we need an address. +- // We'll leave it to the caller to provide an address. +- panic!("Profile needs an address; use new(env, address)") ++ pub fn refresh_badges(&mut self) { ++ self.client_badge = BadgeLevel::from_score(self.client.score); ++ self.freelancer_badge = BadgeLevel::from_score(self.freelancer.score); + } + } +diff --git a/contracts/reputation/src/storage.rs b/contracts/reputation/src/storage.rs +index 1c1242d..048c97f 100644 +--- a/contracts/reputation/src/storage.rs ++++ b/contracts/reputation/src/storage.rs +@@ -1,4 +1,4 @@ +-use crate::profile::Profile; ++use crate::profile::Profile; + use soroban_sdk::{Address, Env}; + + const PERSISTENT_TTL_THRESHOLD: u32 = 50_000; +diff --git a/contracts/reputation/test_snapshots/test/test_authorized_contract_can_be_replaced_by_admin.1.json b/contracts/reputation/test_snapshots/test/test_authorized_contract_can_be_replaced_by_admin.1.json +new file mode 100644 +index 0000000..3aa828d +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_authorized_contract_can_be_replaced_by_admin.1.json +@@ -0,0 +1,1094 @@ ++{ ++ "generators": { ++ "address": 5, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "function_name": "set_authorized_contract", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "function_name": "set_authorized_contract", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_metadata" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 7000 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "is_blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AuthorizedUpdater" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": null ++ } ++ } ++ } ++ }, ++ "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": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "AuthorizedContractUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "by_admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "contract_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "AuthorizedContractUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "by_admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "contract_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" ++ }, ++ { ++ "symbol": "award" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Client" ++ } ++ ] ++ }, ++ { ++ "i32": 2000 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "update_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Client" ++ } ++ ] ++ }, ++ { ++ "i32": 2000 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ScoreAdjusted" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "adjusted_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "delta" ++ }, ++ "val": { ++ "i32": 2000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 7000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Client" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "update_score" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "award" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Client" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Client" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 7000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_authorized_contract_updates_score.1.json b/contracts/reputation/test_snapshots/test/test_authorized_contract_updates_score.1.json +new file mode 100644 +index 0000000..c08eb66 +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_authorized_contract_updates_score.1.json +@@ -0,0 +1,905 @@ ++{ ++ "generators": { ++ "address": 4, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "function_name": "set_authorized_contract", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_metadata" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 6500 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "is_blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AuthorizedUpdater" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "AuthorizedContractUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "by_admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "contract_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "award" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "i32": 1500 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "update_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "i32": 1500 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ScoreAdjusted" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "adjusted_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "delta" ++ }, ++ "val": { ++ "i32": 1500 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 6500 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "update_score" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "award" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 6500 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_badge_upgrades_reflect_immediately_in_public_getters.1.json b/contracts/reputation/test_snapshots/test/test_badge_upgrades_reflect_immediately_in_public_getters.1.json +new file mode 100644 +index 0000000..4729689 +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_badge_upgrades_reflect_immediately_in_public_getters.1.json +@@ -0,0 +1,2744 @@ ++{ ++ "generators": { ++ "address": 7, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "set_job_registry", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "submit_rating", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u64": 11 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "submit_rating", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "u64": 12 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "submit_rating", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "u64": 13 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 5541220902715666415 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_metadata" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 15 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "is_blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 11 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 11 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 12 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 12 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 13 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 13 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobRegistry" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 11 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 11 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 12 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 12 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 13 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 13 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "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": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "set_job_registry" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job_registry" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 11 ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 12 ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 13 ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u64": 11 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 11 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ReputationUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "caller" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 11 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "rating" ++ }, ++ "val": { ++ "u32": 5 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "target" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_public_metrics" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "symbol": "freelancer" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_public_metrics" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 5 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "u64": 12 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 12 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ReputationUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "caller" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 12 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "rating" ++ }, ++ "val": { ++ "u32": 5 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "target" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_public_metrics" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "symbol": "freelancer" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_public_metrics" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 1 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "u64": 13 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 13 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ReputationUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "caller" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 13 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "rating" ++ }, ++ "val": { ++ "u32": 5 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "target" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 15 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_public_metrics" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "symbol": "freelancer" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_public_metrics" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 15 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 3 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 2 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 10000 ++ } ++ }, ++ { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 15 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_blacklist_clears_badges_and_sets_flag.1.json b/contracts/reputation/test_snapshots/test/test_blacklist_clears_badges_and_sets_flag.1.json +new file mode 100644 +index 0000000..5167989 +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_blacklist_clears_badges_and_sets_flag.1.json +@@ -0,0 +1,3117 @@ ++{ ++ "generators": { ++ "address": 8, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "set_job_registry", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "set_authorized_contract", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "submit_rating", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u64": 21 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "submit_rating", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "u64": 22 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "function_name": "submit_rating", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "u64": 23 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 4837995959683129791 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 2032731177588607455 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_metadata" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 500 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 15 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 1000 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "is_blacklisted" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 21 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 21 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 22 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 22 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 23 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 23 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AuthorizedUpdater" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobRegistry" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 21 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 21 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 22 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 22 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 23 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 23 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "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": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "set_job_registry" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job_registry" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "AuthorizedContractUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "by_admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "contract_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 21 ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 22 ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 23 ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u64": 21 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 21 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ReputationUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "caller" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 21 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "rating" ++ }, ++ "val": { ++ "u32": 5 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "target" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "u64": 22 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 22 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ReputationUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "caller" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 22 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "rating" ++ }, ++ "val": { ++ "u32": 5 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "target" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "u64": 23 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 23 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ReputationUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 2 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "caller" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 23 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "rating" ++ }, ++ "val": { ++ "u32": 5 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "target" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 15 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000008" ++ }, ++ { ++ "symbol": "blacklist" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "blacklist_profile" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "BlacklistUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client_score" ++ }, ++ "val": { ++ "i32": 500 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer_score" ++ }, ++ "val": { ++ "i32": 1000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "is_blacklisted" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "blacklist_profile" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "blacklist" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 1000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 15 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "query_reputation" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "query_reputation" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Client" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 500 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": true ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 1000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 3 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 15 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "is_blacklisted" ++ }, ++ "val": { ++ "bool": true ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "is_blacklisted" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "is_blacklisted" ++ } ++ ], ++ "data": { ++ "bool": true ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_blacklist_requires_authorized_contract.1.json b/contracts/reputation/test_snapshots/test/test_blacklist_requires_authorized_contract.1.json +new file mode 100644 +index 0000000..8a56d48 +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_blacklist_requires_authorized_contract.1.json +@@ -0,0 +1,689 @@ ++{ ++ "generators": { ++ "address": 5, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "function_name": "set_authorized_contract", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "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": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AuthorizedUpdater" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": null ++ } ++ } ++ } ++ }, ++ "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": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "AuthorizedContractUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "by_admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "contract_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" ++ }, ++ { ++ "symbol": "blacklist" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "blacklist_profile" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "blacklist_profile" ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "blacklist" ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_direct_reviews_from_unverified_public_keys_are_rejected.1.json b/contracts/reputation/test_snapshots/test/test_direct_reviews_from_unverified_public_keys_are_rejected.1.json +new file mode 100644 +index 0000000..9a0bbf1 +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_direct_reviews_from_unverified_public_keys_are_rejected.1.json +@@ -0,0 +1,777 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "function_name": "set_job_registry", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "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": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobRegistry" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 33 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 33 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "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": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" ++ }, ++ { ++ "symbol": "set_job_registry" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job_registry" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 33 ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 33 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 33 ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "submit_rating" ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 33 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_direct_score_adjustment_requires_authorized_contract.1.json b/contracts/reputation/test_snapshots/test/test_direct_score_adjustment_requires_authorized_contract.1.json +new file mode 100644 +index 0000000..02fe8b6 +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_direct_score_adjustment_requires_authorized_contract.1.json +@@ -0,0 +1,540 @@ ++{ ++ "generators": { ++ "address": 5, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "set_authorized_contract", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AuthorizedUpdater" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "AuthorizedContractUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "by_admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "contract_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "update_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "i32": 500 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "update_score" ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "i32": 500 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_empty_profile_reads_are_safe.1.json b/contracts/reputation/test_snapshots/test/test_empty_profile_reads_are_safe.1.json +new file mode 100644 +index 0000000..a580e61 +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_empty_profile_reads_are_safe.1.json +@@ -0,0 +1,507 @@ ++{ ++ "generators": { ++ "address": 2, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000002" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000002" ++ }, ++ { ++ "symbol": "query_reputation" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "query_reputation" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Client" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "is_blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000002" ++ }, ++ { ++ "symbol": "get_profile_metadata" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_profile_metadata" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_profile_metadata.1.json b/contracts/reputation/test_snapshots/test/test_profile_metadata.1.json +index edd47fa..1b12c7a 100644 +--- a/contracts/reputation/test_snapshots/test/test_profile_metadata.1.json ++++ b/contracts/reputation/test_snapshots/test/test_profile_metadata.1.json +@@ -118,50 +118,156 @@ + }, + { + "key": { +- "symbol": "client_jobs" ++ "symbol": "badge_metadata" + }, + "val": { +- "u32": 0 ++ "vec": [] + } + }, + { + "key": { +- "symbol": "client_points" ++ "symbol": "client" + }, + "val": { +- "i32": 0 ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ } ++ ] + } + }, + { + "key": { +- "symbol": "client_score" ++ "symbol": "freelancer" + }, + "val": { +- "i32": 5000 ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ } ++ ] + } + }, + { + "key": { +- "symbol": "freelancer_jobs" ++ "symbol": "is_blacklisted" + }, + "val": { +- "u32": 0 +- } +- }, +- { +- "key": { +- "symbol": "freelancer_points" +- }, +- "val": { +- "i32": 0 +- } +- }, +- { +- "key": { +- "symbol": "freelancer_score" +- }, +- "val": { +- "i32": 5000 ++ "bool": false + } + }, + { +diff --git a/contracts/reputation/test_snapshots/test/test_slash_requires_authorized_contract.1.json b/contracts/reputation/test_snapshots/test/test_slash_requires_authorized_contract.1.json +new file mode 100644 +index 0000000..a39f3ba +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_slash_requires_authorized_contract.1.json +@@ -0,0 +1,717 @@ ++{ ++ "generators": { ++ "address": 5, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", ++ "function_name": "set_authorized_contract", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "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": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AuthorizedUpdater" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": null ++ } ++ } ++ } ++ }, ++ "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": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "AuthorizedContractUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "by_admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "contract_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" ++ }, ++ { ++ "symbol": "slash" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000003" ++ }, ++ { ++ "symbol": "slash" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "slash" ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "slash" ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_slash_uses_fixed_point_decay.1.json b/contracts/reputation/test_snapshots/test/test_slash_uses_fixed_point_decay.1.json +new file mode 100644 +index 0000000..d042f73 +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_slash_uses_fixed_point_decay.1.json +@@ -0,0 +1,1658 @@ ++{ ++ "generators": { ++ "address": 6, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "set_job_registry", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "set_authorized_contract", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "function_name": "submit_rating", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "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": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 1033654523790656264 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Profile" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_metadata" ++ }, ++ "val": { ++ "vec": [] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 8000 ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "is_blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": "void" ++ } ++ ] ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Reviewed" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "bool": true ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AuthorizedUpdater" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "JobRegistry" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Job" ++ }, ++ { ++ "u64": 1 ++ } ++ ] ++ }, ++ "durability": "persistent", ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ }, ++ "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": null ++ } ++ } ++ } ++ }, ++ "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": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "set_job_registry" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job_registry" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "AuthorizedContractUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "by_admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "contract_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "u64": 1 ++ }, ++ { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_job" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "u64": 1 ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "u32": 5 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "u64": 1 ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_job" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "budget_stroops" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 10 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "client" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "freelancer" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "metadata_hash" ++ }, ++ "val": { ++ "bytes": "516d4a6f62" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "status" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Completed" ++ } ++ ] ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ReputationUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "caller" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "job_id" ++ }, ++ "val": { ++ "u64": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "rating" ++ }, ++ "val": { ++ "u32": 5 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "target" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5 ++ } ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "submit_rating" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" ++ }, ++ { ++ "symbol": "slash" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "slash" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "symbol": "fraud" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "ScoreAdjusted" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "adjusted_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "delta" ++ }, ++ "val": { ++ "i32": -2000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "new_score" ++ }, ++ "val": { ++ "i32": 8000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "slash" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "slash" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "get_score" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "role" ++ }, ++ "val": { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 8000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5 ++ } ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/contracts/reputation/test_snapshots/test/test_submit_rating_updates_client_and_freelancer_paths.1.json b/contracts/reputation/test_snapshots/test/test_submit_rating_updates_client_and_freelancer_paths.1.json +index 361f427..73d4985 100644 +--- a/contracts/reputation/test_snapshots/test/test_submit_rating_updates_client_and_freelancer_paths.1.json ++++ b/contracts/reputation/test_snapshots/test/test_submit_rating_updates_client_and_freelancer_paths.1.json +@@ -244,50 +244,156 @@ + }, + { + "key": { +- "symbol": "client_jobs" ++ "symbol": "badge_metadata" + }, + "val": { +- "u32": 0 ++ "vec": [] + } + }, + { + "key": { +- "symbol": "client_points" +- }, +- "val": { +- "i32": 0 +- } +- }, +- { +- "key": { +- "symbol": "client_score" +- }, +- "val": { +- "i32": 5000 +- } +- }, +- { +- "key": { +- "symbol": "freelancer_jobs" ++ "symbol": "client" + }, + "val": { +- "u32": 1 ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ } ++ ] + } + }, + { + "key": { +- "symbol": "freelancer_points" ++ "symbol": "freelancer" + }, + "val": { +- "i32": 4 ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 8000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 4 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 8000 ++ } ++ } ++ ] + } + }, + { + "key": { +- "symbol": "freelancer_score" ++ "symbol": "is_blacklisted" + }, + "val": { +- "i32": 8000 ++ "bool": false + } + }, + { +@@ -352,50 +458,156 @@ + }, + { + "key": { +- "symbol": "client_jobs" +- }, +- "val": { +- "u32": 0 +- } +- }, +- { +- "key": { +- "symbol": "client_points" +- }, +- "val": { +- "i32": 0 +- } +- }, +- { +- "key": { +- "symbol": "client_score" ++ "symbol": "badge_metadata" + }, + "val": { +- "i32": 5000 ++ "vec": [] + } + }, + { + "key": { +- "symbol": "freelancer_jobs" ++ "symbol": "client" + }, + "val": { +- "u32": 1 ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 0 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 0 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 5000 ++ } ++ } ++ ] + } + }, + { + "key": { +- "symbol": "freelancer_points" ++ "symbol": "freelancer" + }, + "val": { +- "i32": 5 ++ "map": [ ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "completed_jobs" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "review" ++ }, ++ "val": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "reviews" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "total_points" ++ }, ++ "val": { ++ "i128": { ++ "hi": 0, ++ "lo": 5 ++ } ++ } ++ } ++ ] ++ } ++ }, ++ { ++ "key": { ++ "symbol": "score" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ } ++ ] + } + }, + { + "key": { +- "symbol": "freelancer_score" ++ "symbol": "is_blacklisted" + }, + "val": { +- "i32": 10000 ++ "bool": false + } + }, + { +@@ -734,7 +946,7 @@ + "symbol": "metadata_hash" + }, + "val": { +- "bytes": "516d4a6f6232" ++ "bytes": "516d4a6f62" + } + }, + { +@@ -1074,7 +1286,7 @@ + "symbol": "metadata_hash" + }, + "val": { +- "bytes": "516d4a6f6232" ++ "bytes": "516d4a6f62" + } + }, + { +@@ -1272,6 +1484,30 @@ + ], + "data": { + "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, + { + "key": { + "symbol": "caller" +@@ -1345,7 +1581,10 @@ + "symbol": "total_points" + }, + "val": { +- "i32": 5 ++ "i128": { ++ "hi": 0, ++ "lo": 5 ++ } + } + }, + { +@@ -1446,6 +1685,30 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 10000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, + { + "key": { + "symbol": "reviews" +@@ -1487,7 +1750,10 @@ + "symbol": "total_points" + }, + "val": { +- "i32": 5 ++ "i128": { ++ "hi": 0, ++ "lo": 5 ++ } + } + } + ] +@@ -1611,7 +1877,7 @@ + "symbol": "metadata_hash" + }, + "val": { +- "bytes": "516d4a6f6232" ++ "bytes": "516d4a6f62" + } + }, + { +@@ -1650,6 +1916,30 @@ + ], + "data": { + "map": [ ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 8000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, + { + "key": { + "symbol": "caller" +@@ -1723,7 +2013,10 @@ + "symbol": "total_points" + }, + "val": { +- "i32": 4 ++ "i128": { ++ "hi": 0, ++ "lo": 4 ++ } + } + }, + { +@@ -1824,6 +2117,30 @@ + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, ++ { ++ "key": { ++ "symbol": "average_rating_bps" ++ }, ++ "val": { ++ "i32": 8000 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "badge_level" ++ }, ++ "val": { ++ "u32": 1 ++ } ++ }, ++ { ++ "key": { ++ "symbol": "blacklisted" ++ }, ++ "val": { ++ "bool": false ++ } ++ }, + { + "key": { + "symbol": "reviews" +@@ -1865,7 +2182,10 @@ + "symbol": "total_points" + }, + "val": { +- "i32": 4 ++ "i128": { ++ "hi": 0, ++ "lo": 4 ++ } + } + } + ] +diff --git a/contracts/reputation/test_snapshots/test/test_unauthorized_contract_update_score_is_rejected.1.json b/contracts/reputation/test_snapshots/test/test_unauthorized_contract_update_score_is_rejected.1.json +new file mode 100644 +index 0000000..a06def1 +--- /dev/null ++++ b/contracts/reputation/test_snapshots/test/test_unauthorized_contract_update_score_is_rejected.1.json +@@ -0,0 +1,717 @@ ++{ ++ "generators": { ++ "address": 5, ++ "nonce": 0 ++ }, ++ "auth": [ ++ [], ++ [ ++ [ ++ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ { ++ "function": { ++ "contract_fn": { ++ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "function_name": "set_authorized_contract", ++ "args": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ }, ++ "sub_invocations": [] ++ } ++ ] ++ ], ++ [] ++ ], ++ "ledger": { ++ "protocol_version": 21, ++ "sequence_number": 0, ++ "timestamp": 0, ++ "network_id": "0000000000000000000000000000000000000000000000000000000000000000", ++ "base_reserve": 0, ++ "min_persistent_entry_ttl": 4096, ++ "min_temp_entry_ttl": 16, ++ "max_entry_ttl": 6312000, ++ "ledger_entries": [ ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", ++ "key": { ++ "ledger_key_nonce": { ++ "nonce": 801925984706572462 ++ } ++ }, ++ "durability": "temporary", ++ "val": "void" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 6311999 ++ ] ++ ], ++ [ ++ { ++ "contract_data": { ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": [ ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "Admin" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "vec": [ ++ { ++ "symbol": "AuthorizedUpdater" ++ } ++ ] ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ], ++ [ ++ { ++ "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_data": { ++ "ext": "v0", ++ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", ++ "key": "ledger_key_contract_instance", ++ "durability": "persistent", ++ "val": { ++ "contract_instance": { ++ "executable": { ++ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ }, ++ "storage": null ++ } ++ } ++ } ++ }, ++ "ext": "v0" ++ }, ++ 4095 ++ ] ++ ], ++ [ ++ { ++ "contract_code": { ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ++ } ++ }, ++ [ ++ { ++ "last_modified_ledger_seq": 0, ++ "data": { ++ "contract_code": { ++ "ext": "v0", ++ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ++ "code": "" ++ } ++ }, ++ "ext": "v0" ++ }, ++ 150000 ++ ] ++ ] ++ ] ++ }, ++ "events": [ ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000002" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "initialize" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000002" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", ++ "type_": "contract", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "string": "reputation" ++ }, ++ { ++ "string": "AuthorizedContractUpdated" ++ } ++ ], ++ "data": { ++ "map": [ ++ { ++ "key": { ++ "symbol": "by_admin" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "contract_address" ++ }, ++ "val": { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" ++ } ++ }, ++ { ++ "key": { ++ "symbol": "updated_at" ++ }, ++ "val": { ++ "u64": 0 ++ } ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_return" ++ }, ++ { ++ "symbol": "set_authorized_contract" ++ } ++ ], ++ "data": "void" ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000004" ++ }, ++ { ++ "symbol": "award" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "i32": 500 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "fn_call" ++ }, ++ { ++ "bytes": "0000000000000000000000000000000000000000000000000000000000000002" ++ }, ++ { ++ "symbol": "update_score" ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "i32": 500 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "failing with contract error" ++ }, ++ { ++ "u32": 2 ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000002", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "update_score" ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "i32": 500 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "caught error from function" ++ } ++ } ++ } ++ }, ++ "failed_call": true ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "vec": [ ++ { ++ "string": "contract call failed" ++ }, ++ { ++ "symbol": "award" ++ }, ++ { ++ "vec": [ ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" ++ }, ++ { ++ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" ++ }, ++ { ++ "vec": [ ++ { ++ "symbol": "Freelancer" ++ } ++ ] ++ }, ++ { ++ "i32": 500 ++ } ++ ] ++ } ++ ] ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ }, ++ { ++ "event": { ++ "ext": "v0", ++ "contract_id": null, ++ "type_": "diagnostic", ++ "body": { ++ "v0": { ++ "topics": [ ++ { ++ "symbol": "error" ++ }, ++ { ++ "error": { ++ "contract": 2 ++ } ++ } ++ ], ++ "data": { ++ "string": "escalating error to panic" ++ } ++ } ++ } ++ }, ++ "failed_call": false ++ } ++ ] ++} +\ No newline at end of file +diff --git a/docs/contracts/job_registry.md b/docs/contracts/job_registry.md +index 72d3c40..c969ec0 100644 +--- a/docs/contracts/job_registry.md ++++ b/docs/contracts/job_registry.md +@@ -2,7 +2,7 @@ + + ## Overview + +-The `JobRegistry` contract manages job postings, bid submissions, bid acceptance, deliverable submission, and dispute status updates for the Lance protocol. ++The `JobRegistry` contract manages job postings, bid submissions, bid cancellation, collateral refund accounting, bid acceptance, deliverable submission, and dispute status updates for the Lance protocol. + + ## `post_job` and `post_job_auto` + +@@ -13,8 +13,9 @@ These functions allow a client to post a new job to the Lance protocol, making i + ### Behavior + + - Authenticates the caller with `client.require_auth()`. +-- Validates inputs: checks for invalid (zero) budget, validates the deliverable IPFS hash size, and checks for zero job ID. +-- Stores the job data (`client`, `metadata_hash`, `budget_stroops`, `status = Open`) in persistent storage. ++- Validates inputs: checks for invalid (zero) budget, validates the compact IPFS CID size, and checks for zero job ID. ++- Stores the job data (`client`, compact IPFS CID metadata, `budget_stroops`, `status = Open`) in persistent storage. ++- Initializes a compact per-job bid counter; individual bids are stored in indexed rows only when submitted. + - Automatically increments the internal `NextJobId` counter. + - Emits a `jobpost` (or `jobauto`) event for on-chain tracking and off-chain indexing. + +@@ -24,19 +25,19 @@ These functions use `JobRegistryError` to return structured error information: + + - `InvalidJobId` (3): job ID cannot be zero. + - `InvalidBudget` (4): budget must be greater than zero. +-- `InvalidHash` (5): metadata hash must not be empty or exceed maximum length. ++- `InvalidHash` (5): metadata CID must not be empty or exceed maximum length. + - `JobAlreadyExists` (6): the explicitly requested job ID is already taken. + - `Overflow` (14): the next job ID counter overflowed. + + ### Security + +-These functions perform strict validation on inputs to prevent issues like overflow and garbage data (e.g. invalid IPFS hashes). All inputs are bounded, ensuring minimal on-chain footprint and deterministic behavior. ++These functions perform strict validation on inputs to prevent issues like overflow and oversized metadata. All CID inputs are bounded, ensuring minimal on-chain footprint and deterministic behavior. + + ## `accept_bid` + + ### Purpose + +-`accept_bid` is called by a job client to accept one freelancer's bid and move the job into an in-progress state. ++`accept_bid` is called by a job client to accept one freelancer's bid and move the job into the assigned state. + + ### Behavior + +@@ -44,19 +45,68 @@ These functions perform strict validation on inputs to prevent issues like overf + - Verifies the job exists and is currently in the `Open` state. + - Confirms the caller is the job's client. + - Validates that the selected freelancer previously submitted a bid for the job. +-- Updates the job status to `InProgress` and records the accepted freelancer. ++- Credits collateral from non-selected bids to each losing freelancer's refund balance. ++- Compacts bid storage down to the accepted bid. ++- Updates the job status to `Assigned` and records the accepted freelancer. + - Emits a `BidAccepted` event for on-chain auditing. + + ### Errors + + `accept_bid` uses `JobRegistryError` to return structured error information: + +-- `JobNotFound` (1): job does not exist. +-- `InvalidState` (5): job is not open for bid acceptance. +-- `Unauthorized` (3): caller is not the job's client. +-- `BidNotFound` (6): selected freelancer did not submit a bid. ++- `JobNotFound` (7): job does not exist. ++- `JobNotOpen` (8): job is not open for bid acceptance. ++- `Unauthorized` (9): caller is not the job's client. ++- `BidNotFound` (11): selected freelancer did not submit a bid. + + This implementation strengthens trustlessness by ensuring bid acceptance can only succeed for bidders who actually participated in the auction. ++The bid lookup is keyed by `(job_id, freelancer)`, so acceptance does not deserialize the full bid collection. ++ ++## `submit_bid` and `submit_bid_with_collateral` ++ ++### Purpose ++ ++These functions let freelancers submit compact CID-backed proposals. `submit_bid` keeps the legacy zero-collateral path, while `submit_bid_with_collateral` records a non-negative collateral amount for later refund if the bidder cancels before assignment. ++ ++### Behavior ++ ++- Authenticates the caller with `freelancer.require_auth()`. ++- Verifies the job exists and is still `Open`. ++- Validates that the proposal CID is non-empty and within the CID size bound. ++- Rejects duplicate bids through `BidIndex(job_id, freelancer)`. ++- Stores the bid in `Bid(job_id, index)` and increments `BidCount(job_id)` with checked math. ++- Records collateral in the bid row without storing heavy proposal text on-chain. ++ ++### Errors ++ ++- `JobNotFound` (7): job does not exist. ++- `JobNotOpen` (8): job is not open for bid submission. ++- `BidAlreadySubmitted` (10): freelancer already has an active bid for this job. ++- `InvalidCollateral` (16): collateral is negative. ++ ++## `cancel_bid`, `claim_refund`, and `get_refund_balance` ++ ++### Purpose ++ ++`cancel_bid` lets a freelancer withdraw an open bid and credit its collateral to a refundable balance. `claim_refund` clears and returns the accumulated balance, while `get_refund_balance` exposes the current amount for wallets and indexers. ++ ++### Behavior ++ ++- Only the bidding freelancer can cancel or claim their own refund. ++- Cancellation is allowed only while the job is `Open`. ++- The bid row is removed with a swap-remove operation so `BidCount(job_id)` remains a tight upper bound. ++- If the removed bid is not the last row, the last bid is moved into the cancelled index and its `BidIndex` is updated. ++- Collateral is added to `Refund(freelancer)` with checked math. ++- Losing bid collateral is also credited during `accept_bid`. ++- `claim_refund` removes the refund storage entry after returning the amount. ++ ++### Errors ++ ++- `JobNotFound` (7): job does not exist. ++- `JobNotOpen` (8): bid cancellation is no longer allowed. ++- `BidNotFound` (11): the freelancer has no active bid for the job. ++- `Overflow` (14): refund balance addition overflowed. ++- `NoRefund` (17): the freelancer has no refundable balance to claim. + + ## `get_job` + +@@ -71,7 +121,7 @@ This implementation strengthens trustlessness by ensuring bid acceptance can onl + + ### Errors + +-- `JobNotFound` (1): The specified job ID does not exist. ++- `JobNotFound` (7): The specified job ID does not exist. + + ## `get_bids` + +@@ -82,37 +132,55 @@ This implementation strengthens trustlessness by ensuring bid acceptance can onl + ### Behavior + + - Verifies the job exists. +-- Retrieves the list of `BidRecord`s associated with the job. ++- Reconstructs the list of `BidRecord`s from indexed bid rows associated with the job. + - Returns an empty list if the job exists but has no bids. + + ### Errors + +-- `JobNotFound` (1): The specified job ID does not exist. ++- `JobNotFound` (7): The specified job ID does not exist. ++ ++## `get_bid_at` ++ ++### Purpose ++ ++`get_bid_at` retrieves one indexed bid row for callers that need paged or bounded access. ++ ++### Behavior ++ ++- Verifies the job exists. ++- Checks `index < BidCount(job_id)`. ++- Returns only the requested bid record. ++ ++### Errors ++ ++- `JobNotFound` (7): The specified job ID does not exist. ++- `BidIndexOutOfBounds` (15): The requested bid index is outside the stored bounds. ++ + ## `submit_deliverable` + + ### Purpose + +-`submit_deliverable` is called by a freelancer to submit their completed work for a job that is in progress. The deliverable is stored as an IPFS hash, enabling decentralized content storage while maintaining on-chain auditability. ++`submit_deliverable` is called by a freelancer to submit their completed work for an assigned job. The deliverable is stored as a compact IPFS CID, enabling decentralized content storage while maintaining on-chain auditability. + + ### Behavior + + - Authenticates the caller with `freelancer.require_auth()`. +-- Validates that the deliverable hash is not empty to prevent invalid submissions. +-- Verifies the job exists and is currently in the `InProgress` state. ++- Validates that the deliverable CID is not empty or oversized to prevent invalid submissions. ++- Verifies the job exists and is currently in the `Assigned` state. + - Confirms the caller is the assigned freelancer for the job. + - Updates the job status to `DeliverableSubmitted`. +-- Stores the deliverable hash in persistent storage for later retrieval. ++- Stores the deliverable CID in persistent storage for later retrieval. + - Emits a `DeliverableSubmitted` event with timestamp for on-chain auditing and off-chain indexing. + + ### Errors + + `submit_deliverable` uses `JobRegistryError` to return structured error information: + +-- `JobNotFound` (1): job does not exist. +-- `InvalidInput` (4): deliverable hash is empty. +-- `InvalidState` (5): job is not in `InProgress` status. +-- `Unauthorized` (3): caller is not the assigned freelancer for the job. ++- `JobNotFound` (7): job does not exist. ++- `InvalidHash` (5): deliverable CID is empty or exceeds the CID size bound. ++- `InvalidStateTransition` (12): job is not in `Assigned` status. ++- `Unauthorized` (9): caller is not the assigned freelancer for the job. + + ### Notes + +-This function is critical for the job completion workflow, enabling freelancers to submit their work while maintaining security through authentication and state validation. The IPFS hash storage minimizes on-chain data while preserving immutability and accessibility. ++This function is critical for the job completion workflow, enabling freelancers to submit their work while maintaining security through authentication and state validation. Compact IPFS CID storage minimizes on-chain data while preserving immutability and accessibility. +diff --git a/docs/contracts/storage_layout_optimization.md b/docs/contracts/storage_layout_optimization.md +index ed72d76..ad7fba0 100644 +--- a/docs/contracts/storage_layout_optimization.md ++++ b/docs/contracts/storage_layout_optimization.md +@@ -8,7 +8,7 @@ The objective is to lower rent footprint and execution overhead without changing + + ## What Changed + +-### 1) JobRegistry: lazy `Bids(job_id)` ContractData allocation ++### 1) JobRegistry: indexed bid rows instead of monolithic bid vectors + + File: `contracts/job_registry/src/lib.rs` + +@@ -17,17 +17,28 @@ Before: + - `post_job` always created two persistent entries: + - `Job(job_id)` + - `Bids(job_id)` initialized as an empty vector ++- Each `submit_bid` deserialized and rewrote the whole vector. ++- `accept_bid` scanned the whole vector to confirm that a freelancer had bid. + + After: + + - `post_job` creates only `Job(job_id)`. +-- `Bids(job_id)` is created on first `submit_bid` write. +-- Read paths (`get_bids`, `accept_bid`) already safely handle missing bids entry via `unwrap_or_else(Vec::new)`. ++- `BidCount(job_id)` tracks the current bid bounds. ++- `Bid(job_id, index)` stores each proposal as an independent row. ++- `BidIndex(job_id, freelancer)` provides constant-key duplicate checks, cancellation, and accept validation. ++- `Refund(freelancer)` accumulates collateral credited by cancelled bids until the freelancer claims it. ++- `get_bids` remains a compatibility view that reconstructs a vector only for read callers. ++- `get_bid_at` provides bounded indexed reads and returns `BidIndexOutOfBounds` (15) for invalid indices. + + Impact: + + - One less persistent `ContractData` entry per newly posted job that never receives bids. +-- Lower storage rent pressure and smaller ledger footprint. ++- Write paths avoid repeatedly deserializing and rewriting a growing bid vector. ++- Bid cancellation uses swap-remove compaction so indexed bounds remain tight after dynamic removals. ++- Bid acceptance refunds non-selected collateral and compacts storage down to the accepted row. ++- Collateral refund accounting uses checked addition and clears storage on claim. ++- Late bid submissions after assignment remain blocked with `JobNotOpen` (8). ++- Lower execution overhead for duplicate checks and bid acceptance. + + ### 2) Reputation: strict admin verification for instance config updates + +@@ -47,9 +58,10 @@ Impact: + + - `ContractInstance`: used for compact, singleton contract config (admin, registry pointers). + - `ContractData`: used for per-job/per-user dynamic state. +-- Dynamic keys are now allocated lazily where possible (`Bids(job_id)`), minimizing persistent data creation. ++- Dynamic bid keys are now allocated per submitted proposal, bounded by `BidCount(job_id)`, and compacted on cancellation, minimizing unnecessary persistent data reads and rewrites. + + ## Compatibility + + - No public function signatures were changed. +-- Existing tests and behavior remain compatible. ++- `submit_bid` remains available as the zero-collateral compatibility path. ++- `BidRecord` now includes `collateral_stroops` so callers can inspect refundable bid collateral. +diff --git a/package-lock.json b/package-lock.json +index f60900e..452893e 100644 +--- a/package-lock.json ++++ b/package-lock.json +@@ -14,7 +14,8 @@ + }, + "devDependencies": { + "@playwright/test": "^1.43.0", +- "@types/node": "^20.0.0" ++ "@types/node": "^20.0.0", ++ "vitest": "^4.1.7" + }, + "optionalDependencies": { + "@next/swc-linux-x64-gnu": "16.1.6", +@@ -55,8 +56,10 @@ + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", ++ "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", ++ "@testing-library/user-event": "^14.6.1", + "@types/node": "^20.19.39", + "@types/react": "^19", + "@types/react-dom": "^19", +@@ -241,23 +244,6 @@ + "url": "https://opencollective.com/vitest" + } + }, +- "apps/web/node_modules/chai": { +- "version": "6.2.2", +- "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", +- "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", +- "dev": true, +- "license": "MIT", +- "engines": { +- "node": ">=18" +- } +- }, +- "apps/web/node_modules/es-module-lexer": { +- "version": "2.1.0", +- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", +- "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", +- "dev": true, +- "license": "MIT" +- }, + "apps/web/node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", +@@ -270,13 +256,6 @@ + "source-map-js": "^1.2.1" + } + }, +- "apps/web/node_modules/pathe": { +- "version": "2.0.3", +- "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", +- "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", +- "dev": true, +- "license": "MIT" +- }, + "apps/web/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", +@@ -319,50 +298,6 @@ + "node": "^10 || ^12 || >=14" + } + }, +- "apps/web/node_modules/std-env": { +- "version": "4.1.0", +- "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", +- "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", +- "dev": true, +- "license": "MIT" +- }, +- "apps/web/node_modules/tinyexec": { +- "version": "1.1.2", +- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", +- "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", +- "dev": true, +- "license": "MIT", +- "engines": { +- "node": ">=18" +- } +- }, +- "apps/web/node_modules/tinyglobby": { +- "version": "0.2.16", +- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", +- "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", +- "dev": true, +- "license": "MIT", +- "dependencies": { +- "fdir": "^6.5.0", +- "picomatch": "^4.0.4" +- }, +- "engines": { +- "node": ">=12.0.0" +- }, +- "funding": { +- "url": "https://github.com/sponsors/SuperchupuDev" +- } +- }, +- "apps/web/node_modules/tinyrainbow": { +- "version": "3.1.0", +- "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", +- "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", +- "dev": true, +- "license": "MIT", +- "engines": { +- "node": ">=14.0.0" +- } +- }, + "apps/web/node_modules/vite": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", +@@ -4467,6 +4402,43 @@ + "react": "^18 || ^19" + } + }, ++ "node_modules/@testing-library/dom": { ++ "version": "10.4.1", ++ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", ++ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@babel/code-frame": "^7.10.4", ++ "@babel/runtime": "^7.12.5", ++ "@types/aria-query": "^5.0.1", ++ "aria-query": "5.3.0", ++ "dom-accessibility-api": "^0.5.9", ++ "lz-string": "^1.5.0", ++ "picocolors": "1.1.1", ++ "pretty-format": "^27.0.2" ++ }, ++ "engines": { ++ "node": ">=18" ++ } ++ }, ++ "node_modules/@testing-library/dom/node_modules/aria-query": { ++ "version": "5.3.0", ++ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", ++ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", ++ "dev": true, ++ "license": "Apache-2.0", ++ "dependencies": { ++ "dequal": "^2.0.3" ++ } ++ }, ++ "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { ++ "version": "0.5.16", ++ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", ++ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", ++ "dev": true, ++ "license": "MIT" ++ }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "dev": true, +@@ -4511,6 +4483,20 @@ + } + } + }, ++ "node_modules/@testing-library/user-event": { ++ "version": "14.6.1", ++ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", ++ "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=12", ++ "npm": ">=6" ++ }, ++ "peerDependencies": { ++ "@testing-library/dom": ">=7.21.4" ++ } ++ }, + "node_modules/@trezor/analytics": { + "version": "1.4.3", + "license": "See LICENSE.md in repo root", +@@ -5094,6 +5080,13 @@ + "license": "0BSD", + "optional": true + }, ++ "node_modules/@types/aria-query": { ++ "version": "5.0.4", ++ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", ++ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", ++ "dev": true, ++ "license": "MIT" ++ }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", +@@ -5513,6 +5506,119 @@ + "linux" + ] + }, ++ "node_modules/@vitest/expect": { ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.7.tgz", ++ "integrity": "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@standard-schema/spec": "^1.1.0", ++ "@types/chai": "^5.2.2", ++ "@vitest/spy": "4.1.7", ++ "@vitest/utils": "4.1.7", ++ "chai": "^6.2.2", ++ "tinyrainbow": "^3.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/mocker": { ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.7.tgz", ++ "integrity": "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/spy": "4.1.7", ++ "estree-walker": "^3.0.3", ++ "magic-string": "^0.30.21" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ }, ++ "peerDependencies": { ++ "msw": "^2.4.9", ++ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" ++ }, ++ "peerDependenciesMeta": { ++ "msw": { ++ "optional": true ++ }, ++ "vite": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/@vitest/pretty-format": { ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.7.tgz", ++ "integrity": "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "tinyrainbow": "^3.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/runner": { ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.7.tgz", ++ "integrity": "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/utils": "4.1.7", ++ "pathe": "^2.0.3" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/snapshot": { ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.7.tgz", ++ "integrity": "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/pretty-format": "4.1.7", ++ "@vitest/utils": "4.1.7", ++ "magic-string": "^0.30.21", ++ "pathe": "^2.0.3" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/spy": { ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.7.tgz", ++ "integrity": "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==", ++ "dev": true, ++ "license": "MIT", ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, ++ "node_modules/@vitest/utils": { ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.7.tgz", ++ "integrity": "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/pretty-format": "4.1.7", ++ "convert-source-map": "^2.0.0", ++ "tinyrainbow": "^3.1.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ } ++ }, + "node_modules/@wallet-standard/base": { + "version": "1.1.0", + "license": "Apache-2.0", +@@ -6843,6 +6949,16 @@ + "node": ">=20" + } + }, ++ "node_modules/chai": { ++ "version": "6.2.2", ++ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", ++ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=18" ++ } ++ }, + "node_modules/chalk": { + "version": "5.6.2", + "license": "MIT", +@@ -7402,6 +7518,16 @@ + "node": ">= 0.8" + } + }, ++ "node_modules/dequal": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", ++ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=6" ++ } ++ }, + "node_modules/des.js": { + "version": "1.1.0", + "license": "MIT", +@@ -7662,6 +7788,13 @@ + "node": ">= 0.4" + } + }, ++ "node_modules/es-module-lexer": { ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", ++ "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", ++ "dev": true, ++ "license": "MIT" ++ }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", +@@ -9687,15 +9820,18 @@ + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, +- "node_modules/lightningcss-linux-x64-gnu": { ++ "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", ++ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ +- "x64" ++ "arm64" + ], ++ "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ +- "linux" ++ "android" + ], + "engines": { + "node": ">= 12.0.0" +@@ -9705,15 +9841,18 @@ + "url": "https://opencollective.com/parcel" + } + }, +- "node_modules/lightningcss-linux-x64-musl": { ++ "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", ++ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ +- "x64" ++ "arm64" + ], ++ "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ +- "linux" ++ "darwin" + ], + "engines": { + "node": ">= 12.0.0" +@@ -9723,50 +9862,239 @@ + "url": "https://opencollective.com/parcel" + } + }, +- "node_modules/lit": { +- "version": "3.3.0", +- "license": "BSD-3-Clause", +- "dependencies": { +- "@lit/reactive-element": "^2.1.0", +- "lit-element": "^4.2.0", +- "lit-html": "^3.3.0" +- } +- }, +- "node_modules/lit-element": { +- "version": "4.2.2", +- "license": "BSD-3-Clause", +- "dependencies": { +- "@lit-labs/ssr-dom-shim": "^1.5.0", +- "@lit/reactive-element": "^2.1.0", +- "lit-html": "^3.3.0" +- } +- }, +- "node_modules/lit-html": { +- "version": "3.3.2", +- "license": "BSD-3-Clause", +- "dependencies": { +- "@types/trusted-types": "^2.0.2" +- } +- }, +- "node_modules/locate-path": { +- "version": "6.0.0", ++ "node_modules/lightningcss-darwin-x64": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", ++ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", ++ "cpu": [ ++ "x64" ++ ], + "dev": true, +- "license": "MIT", +- "dependencies": { +- "p-locate": "^5.0.0" +- }, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], + "engines": { +- "node": ">=10" ++ "node": ">= 12.0.0" + }, + "funding": { +- "url": "https://github.com/sponsors/sindresorhus" ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" + } + }, +- "node_modules/lodash.merge": { +- "version": "4.6.2", +- "dev": true, +- "license": "MIT" +- }, ++ "node_modules/lightningcss-freebsd-x64": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", ++ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "freebsd" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-arm-gnueabihf": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", ++ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", ++ "cpu": [ ++ "arm" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-arm64-gnu": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", ++ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-arm64-musl": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", ++ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "musl" ++ ], ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-x64-gnu": { ++ "version": "1.32.0", ++ "cpu": [ ++ "x64" ++ ], ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-linux-x64-musl": { ++ "version": "1.32.0", ++ "cpu": [ ++ "x64" ++ ], ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-win32-arm64-msvc": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", ++ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lightningcss-win32-x64-msvc": { ++ "version": "1.32.0", ++ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", ++ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MPL-2.0", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": ">= 12.0.0" ++ }, ++ "funding": { ++ "type": "opencollective", ++ "url": "https://opencollective.com/parcel" ++ } ++ }, ++ "node_modules/lit": { ++ "version": "3.3.0", ++ "license": "BSD-3-Clause", ++ "dependencies": { ++ "@lit/reactive-element": "^2.1.0", ++ "lit-element": "^4.2.0", ++ "lit-html": "^3.3.0" ++ } ++ }, ++ "node_modules/lit-element": { ++ "version": "4.2.2", ++ "license": "BSD-3-Clause", ++ "dependencies": { ++ "@lit-labs/ssr-dom-shim": "^1.5.0", ++ "@lit/reactive-element": "^2.1.0", ++ "lit-html": "^3.3.0" ++ } ++ }, ++ "node_modules/lit-html": { ++ "version": "3.3.2", ++ "license": "BSD-3-Clause", ++ "dependencies": { ++ "@types/trusted-types": "^2.0.2" ++ } ++ }, ++ "node_modules/locate-path": { ++ "version": "6.0.0", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "p-locate": "^5.0.0" ++ }, ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/lodash.merge": { ++ "version": "4.6.2", ++ "dev": true, ++ "license": "MIT" ++ }, + "node_modules/long": { + "version": "5.2.5", + "license": "Apache-2.0" +@@ -9797,6 +10125,16 @@ + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, ++ "node_modules/lz-string": { ++ "version": "1.5.0", ++ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", ++ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", ++ "dev": true, ++ "license": "MIT", ++ "bin": { ++ "lz-string": "bin/bin.js" ++ } ++ }, + "node_modules/magic-string": { + "version": "0.30.21", + "dev": true, +@@ -9945,7 +10283,9 @@ + "license": "MIT" + }, + "node_modules/nanoid": { +- "version": "3.3.11", ++ "version": "3.3.12", ++ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", ++ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", +@@ -10464,6 +10804,13 @@ + "dev": true, + "license": "MIT" + }, ++ "node_modules/pathe": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", ++ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", ++ "dev": true, ++ "license": "MIT" ++ }, + "node_modules/pbkdf2": { + "version": "3.1.5", + "license": "MIT", +@@ -10582,7 +10929,9 @@ + } + }, + "node_modules/postcss": { +- "version": "8.5.8", ++ "version": "8.5.15", ++ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", ++ "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { +@@ -10600,7 +10949,7 @@ + ], + "license": "MIT", + "dependencies": { +- "nanoid": "^3.3.11", ++ "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, +@@ -10624,6 +10973,41 @@ + "node": ">= 0.8.0" + } + }, ++ "node_modules/pretty-format": { ++ "version": "27.5.1", ++ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", ++ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "ansi-regex": "^5.0.1", ++ "ansi-styles": "^5.0.0", ++ "react-is": "^17.0.1" ++ }, ++ "engines": { ++ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" ++ } ++ }, ++ "node_modules/pretty-format/node_modules/ansi-styles": { ++ "version": "5.2.0", ++ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", ++ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/chalk/ansi-styles?sponsor=1" ++ } ++ }, ++ "node_modules/pretty-format/node_modules/react-is": { ++ "version": "17.0.2", ++ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", ++ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", ++ "dev": true, ++ "license": "MIT" ++ }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" +@@ -11664,6 +12048,13 @@ + "dev": true, + "license": "MIT" + }, ++ "node_modules/std-env": { ++ "version": "4.1.0", ++ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", ++ "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", ++ "dev": true, ++ "license": "MIT" ++ }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "dev": true, +@@ -11983,13 +12374,25 @@ + "dev": true, + "license": "MIT" + }, ++ "node_modules/tinyexec": { ++ "version": "1.2.2", ++ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.2.tgz", ++ "integrity": "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=18" ++ } ++ }, + "node_modules/tinyglobby": { +- "version": "0.2.15", ++ "version": "0.2.16", ++ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", ++ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", +- "picomatch": "^4.0.3" ++ "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" +@@ -12009,6 +12412,16 @@ + "url": "https://github.com/sponsors/jonschlinkert" + } + }, ++ "node_modules/tinyrainbow": { ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", ++ "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=14.0.0" ++ } ++ }, + "node_modules/tldts": { + "version": "6.1.86", + "dev": true, +@@ -12753,6 +13166,526 @@ + } + } + }, ++ "node_modules/vite": { ++ "version": "8.0.14", ++ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.14.tgz", ++ "integrity": "sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "lightningcss": "^1.32.0", ++ "picomatch": "^4.0.4", ++ "postcss": "^8.5.15", ++ "rolldown": "1.0.2", ++ "tinyglobby": "^0.2.16" ++ }, ++ "bin": { ++ "vite": "bin/vite.js" ++ }, ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ }, ++ "funding": { ++ "url": "https://github.com/vitejs/vite?sponsor=1" ++ }, ++ "optionalDependencies": { ++ "fsevents": "~2.3.3" ++ }, ++ "peerDependencies": { ++ "@types/node": "^20.19.0 || >=22.12.0", ++ "@vitejs/devtools": "^0.1.18", ++ "esbuild": "^0.27.0 || ^0.28.0", ++ "jiti": ">=1.21.0", ++ "less": "^4.0.0", ++ "sass": "^1.70.0", ++ "sass-embedded": "^1.70.0", ++ "stylus": ">=0.54.8", ++ "sugarss": "^5.0.0", ++ "terser": "^5.16.0", ++ "tsx": "^4.8.1", ++ "yaml": "^2.4.2" ++ }, ++ "peerDependenciesMeta": { ++ "@types/node": { ++ "optional": true ++ }, ++ "@vitejs/devtools": { ++ "optional": true ++ }, ++ "esbuild": { ++ "optional": true ++ }, ++ "jiti": { ++ "optional": true ++ }, ++ "less": { ++ "optional": true ++ }, ++ "sass": { ++ "optional": true ++ }, ++ "sass-embedded": { ++ "optional": true ++ }, ++ "stylus": { ++ "optional": true ++ }, ++ "sugarss": { ++ "optional": true ++ }, ++ "terser": { ++ "optional": true ++ }, ++ "tsx": { ++ "optional": true ++ }, ++ "yaml": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/vite/node_modules/@oxc-project/types": { ++ "version": "0.132.0", ++ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.132.0.tgz", ++ "integrity": "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==", ++ "dev": true, ++ "license": "MIT", ++ "funding": { ++ "url": "https://github.com/sponsors/Boshen" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-android-arm64": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.2.tgz", ++ "integrity": "sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "android" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-darwin-arm64": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.2.tgz", ++ "integrity": "sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-darwin-x64": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.2.tgz", ++ "integrity": "sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "darwin" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-freebsd-x64": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.2.tgz", ++ "integrity": "sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "freebsd" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-linux-arm-gnueabihf": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.2.tgz", ++ "integrity": "sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==", ++ "cpu": [ ++ "arm" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-gnu": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.2.tgz", ++ "integrity": "sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-musl": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.2.tgz", ++ "integrity": "sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "libc": [ ++ "musl" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-linux-ppc64-gnu": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.2.tgz", ++ "integrity": "sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==", ++ "cpu": [ ++ "ppc64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-linux-s390x-gnu": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.2.tgz", ++ "integrity": "sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==", ++ "cpu": [ ++ "s390x" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-linux-x64-gnu": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.2.tgz", ++ "integrity": "sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "libc": [ ++ "glibc" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-linux-x64-musl": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.2.tgz", ++ "integrity": "sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "libc": [ ++ "musl" ++ ], ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "linux" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-openharmony-arm64": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.2.tgz", ++ "integrity": "sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "openharmony" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-wasm32-wasi": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.2.tgz", ++ "integrity": "sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==", ++ "cpu": [ ++ "wasm32" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "dependencies": { ++ "@emnapi/core": "1.10.0", ++ "@emnapi/runtime": "1.10.0", ++ "@napi-rs/wasm-runtime": "^1.1.4" ++ }, ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-win32-arm64-msvc": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.2.tgz", ++ "integrity": "sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==", ++ "cpu": [ ++ "arm64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/binding-win32-x64-msvc": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.2.tgz", ++ "integrity": "sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==", ++ "cpu": [ ++ "x64" ++ ], ++ "dev": true, ++ "license": "MIT", ++ "optional": true, ++ "os": [ ++ "win32" ++ ], ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ } ++ }, ++ "node_modules/vite/node_modules/@rolldown/pluginutils": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", ++ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", ++ "dev": true, ++ "license": "MIT" ++ }, ++ "node_modules/vite/node_modules/picomatch": { ++ "version": "4.0.4", ++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", ++ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/jonschlinkert" ++ } ++ }, ++ "node_modules/vite/node_modules/rolldown": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.2.tgz", ++ "integrity": "sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@oxc-project/types": "=0.132.0", ++ "@rolldown/pluginutils": "^1.0.0" ++ }, ++ "bin": { ++ "rolldown": "bin/cli.mjs" ++ }, ++ "engines": { ++ "node": "^20.19.0 || >=22.12.0" ++ }, ++ "optionalDependencies": { ++ "@rolldown/binding-android-arm64": "1.0.2", ++ "@rolldown/binding-darwin-arm64": "1.0.2", ++ "@rolldown/binding-darwin-x64": "1.0.2", ++ "@rolldown/binding-freebsd-x64": "1.0.2", ++ "@rolldown/binding-linux-arm-gnueabihf": "1.0.2", ++ "@rolldown/binding-linux-arm64-gnu": "1.0.2", ++ "@rolldown/binding-linux-arm64-musl": "1.0.2", ++ "@rolldown/binding-linux-ppc64-gnu": "1.0.2", ++ "@rolldown/binding-linux-s390x-gnu": "1.0.2", ++ "@rolldown/binding-linux-x64-gnu": "1.0.2", ++ "@rolldown/binding-linux-x64-musl": "1.0.2", ++ "@rolldown/binding-openharmony-arm64": "1.0.2", ++ "@rolldown/binding-wasm32-wasi": "1.0.2", ++ "@rolldown/binding-win32-arm64-msvc": "1.0.2", ++ "@rolldown/binding-win32-x64-msvc": "1.0.2" ++ } ++ }, ++ "node_modules/vitest": { ++ "version": "4.1.7", ++ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.7.tgz", ++ "integrity": "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==", ++ "dev": true, ++ "license": "MIT", ++ "dependencies": { ++ "@vitest/expect": "4.1.7", ++ "@vitest/mocker": "4.1.7", ++ "@vitest/pretty-format": "4.1.7", ++ "@vitest/runner": "4.1.7", ++ "@vitest/snapshot": "4.1.7", ++ "@vitest/spy": "4.1.7", ++ "@vitest/utils": "4.1.7", ++ "es-module-lexer": "^2.0.0", ++ "expect-type": "^1.3.0", ++ "magic-string": "^0.30.21", ++ "obug": "^2.1.1", ++ "pathe": "^2.0.3", ++ "picomatch": "^4.0.3", ++ "std-env": "^4.0.0-rc.1", ++ "tinybench": "^2.9.0", ++ "tinyexec": "^1.0.2", ++ "tinyglobby": "^0.2.15", ++ "tinyrainbow": "^3.1.0", ++ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", ++ "why-is-node-running": "^2.3.0" ++ }, ++ "bin": { ++ "vitest": "vitest.mjs" ++ }, ++ "engines": { ++ "node": "^20.0.0 || ^22.0.0 || >=24.0.0" ++ }, ++ "funding": { ++ "url": "https://opencollective.com/vitest" ++ }, ++ "peerDependencies": { ++ "@edge-runtime/vm": "*", ++ "@opentelemetry/api": "^1.9.0", ++ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", ++ "@vitest/browser-playwright": "4.1.7", ++ "@vitest/browser-preview": "4.1.7", ++ "@vitest/browser-webdriverio": "4.1.7", ++ "@vitest/coverage-istanbul": "4.1.7", ++ "@vitest/coverage-v8": "4.1.7", ++ "@vitest/ui": "4.1.7", ++ "happy-dom": "*", ++ "jsdom": "*", ++ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" ++ }, ++ "peerDependenciesMeta": { ++ "@edge-runtime/vm": { ++ "optional": true ++ }, ++ "@opentelemetry/api": { ++ "optional": true ++ }, ++ "@types/node": { ++ "optional": true ++ }, ++ "@vitest/browser-playwright": { ++ "optional": true ++ }, ++ "@vitest/browser-preview": { ++ "optional": true ++ }, ++ "@vitest/browser-webdriverio": { ++ "optional": true ++ }, ++ "@vitest/coverage-istanbul": { ++ "optional": true ++ }, ++ "@vitest/coverage-v8": { ++ "optional": true ++ }, ++ "@vitest/ui": { ++ "optional": true ++ }, ++ "happy-dom": { ++ "optional": true ++ }, ++ "jsdom": { ++ "optional": true ++ }, ++ "vite": { ++ "optional": false ++ } ++ } ++ }, ++ "node_modules/vitest/node_modules/picomatch": { ++ "version": "4.0.4", ++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", ++ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", ++ "dev": true, ++ "license": "MIT", ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/jonschlinkert" ++ } ++ }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "dev": true, +diff --git a/package.json b/package.json +index 8d964fa..908f1b3 100644 +--- a/package.json ++++ b/package.json +@@ -11,7 +11,8 @@ + }, + "devDependencies": { + "@playwright/test": "^1.43.0", +- "@types/node": "^20.0.0" ++ "@types/node": "^20.0.0", ++ "vitest": "^4.1.7" + }, + "optionalDependencies": { + "@next/swc-linux-x64-gnu": "16.1.6", diff --git a/contracts/escrow/src/lib.rs b/contracts/escrow/src/lib.rs index 4063449e..20fa33bc 100644 --- a/contracts/escrow/src/lib.rs +++ b/contracts/escrow/src/lib.rs @@ -42,6 +42,23 @@ pub struct EscrowJob { pub milestone_count: u32, } +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub struct TreasuryConfig { + pub routing_address: Address, + pub fee_bps: u32, +} + +#[contracttype] +#[derive(Clone)] +pub struct FeeConfigUpdatedEvent { + pub treasury: Address, + pub fee_bps: u32, + pub updated_at: u64, +} + +pub const MAX_FEE_BPS: u32 = 10_000; + #[contracttype] pub enum DataKey { Job(u64), @@ -49,6 +66,7 @@ pub enum DataKey { AgentJudge, GuardFlag(u64), Milestone(u64, u32), + Treasury, } #[contracttype] @@ -89,6 +107,41 @@ impl EscrowContract { .set(&DataKey::AgentJudge, &new_agent_judge); } + pub fn configure_treasury(env: Env, routing_address: Address, fee_bps: u32) { + let admin: Address = env + .storage() + .instance() + .get(&DataKey::Admin) + .expect("not initialized"); + admin.require_auth(); + + assert!(fee_bps <= MAX_FEE_BPS, "FeeTooHigh"); + + let config = TreasuryConfig { + routing_address: routing_address.clone(), + fee_bps, + }; + + env.storage().instance().set(&DataKey::Treasury, &config); + + env.events().publish( + ("escrow", "FeeConfigUpdated"), + FeeConfigUpdatedEvent { + treasury: routing_address, + fee_bps, + updated_at: env.ledger().timestamp(), + }, + ); + } + + pub fn get_treasury(env: Env) -> Option
{ + if let Some(config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { + Some(config.routing_address) + } else { + None + } + } + /// Client creates a job entry in Setup phase. pub fn create_job( env: Env, @@ -359,11 +412,33 @@ impl EscrowContract { assert!(total_payout <= remaining, "payout exceeds remaining funds"); let token_client = token::Client::new(&env, &job.token); - if payee_amount > 0 { + let mut freelancer_amount = payee_amount; + + if let Some(treasury_config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { + let fee = payee_amount + .checked_mul(treasury_config.fee_bps as i128) + .expect("overflow") + .checked_div(10000) + .expect("overflow"); + + if fee > 0 { + freelancer_amount = payee_amount + .checked_sub(fee) + .expect("overflow"); + + token_client.transfer( + &env.current_contract_address(), + &treasury_config.routing_address, + &fee, + ); + } + } + + if freelancer_amount > 0 { token_client.transfer( &env.current_contract_address(), &job.freelancer, - &payee_amount, + &freelancer_amount, ); } if payer_amount > 0 { @@ -486,12 +561,7 @@ impl EscrowContract { .expect("overflow"); job.status = EscrowStatus::WorkInProgress; - let token_client = token::Client::new(&env, &job.token); - token_client.transfer( - &env.current_contract_address(), - &job.freelancer, - &milestone.amount, - ); + Self::payout_with_fee(&env, job, milestone.amount); if job.released_amount == job.total_amount { job.status = EscrowStatus::Completed; @@ -499,6 +569,39 @@ impl EscrowContract { env.storage().persistent().set(&DataKey::Job(job_id), job); } + + fn payout_with_fee(env: &Env, job: &EscrowJob, amount: i128) { + let token_client = token::Client::new(env, &job.token); + let mut freelancer_amount = amount; + + if let Some(treasury_config) = env.storage().instance().get::<_, TreasuryConfig>(&DataKey::Treasury) { + let fee = amount + .checked_mul(treasury_config.fee_bps as i128) + .expect("overflow") + .checked_div(10000) + .expect("overflow"); + + if fee > 0 { + freelancer_amount = amount + .checked_sub(fee) + .expect("overflow"); + + token_client.transfer( + &env.current_contract_address(), + &treasury_config.routing_address, + &fee, + ); + } + } + + if freelancer_amount > 0 { + token_client.transfer( + &env.current_contract_address(), + &job.freelancer, + &freelancer_amount, + ); + } + } } #[cfg(test)] diff --git a/contracts/escrow/test_output.log b/contracts/escrow/test_output.log new file mode 100644 index 00000000..78b4ab30 --- /dev/null +++ b/contracts/escrow/test_output.log @@ -0,0 +1,338 @@ +warning: unused variable: `job_id` + --> contracts/escrow/src/lib.rs:375:35 + | +375 | ...yout_with_fee(env: &Env, job_id: u64, job: &EscrowJob, amount: i128)... + | ^^^^^^ help: if this is intentional, prefix it with an underscore: `_job_id` + | + = note: `#[warn(unused_variables)]` on by default + +warning: variable does not need to be mutable + --> contracts/escrow/src/lib.rs:1178:13 + | +1178 | let mut job: EscrowJob = env + | ----^^^ + | | + | help: remove this `mut` + | + = note: `#[warn(unused_mut)]` on by default + +warning: `escrow` (lib) generated 2 warnings (run `cargo fix --lib -p escrow` to apply 1 suggestion) +warning: `escrow` (lib test) generated 2 warnings (2 duplicates) + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.81s + Running unittests src/lib.rs (/home/kaycee/Desktop/OS/lance/target/debug/deps/escrow-28de2df4515832fa) + +running 60 tests +test test::test_cancel_brief_in_setup_marks_refunded_without_transfer ... ok +test test::test_deposit_event_emitted ... ok +test test::test_add_milestone_over_max_panics - should panic ... ok +test test::test_add_milestone_over_max_budget_panics - should panic ... ok +test test::test_deposit_invalid_state_not_setup - should panic ... ok +test test::test_deposit_no_milestones_panics - should panic ... ok +test test::test_deposit_negative_panics - should panic ... ok +test test::test_add_milestone_limit_panics - should panic ... ok +test test::test_deposit_success_transitions_to_funded ... ok +test test::test_deposit_with_wrong_total_panics - should panic ... ok +test test::test_deposit_zero_panics - should panic ... ok +test test::test_deposit_reentrancy_guard_panics - should panic ... ok +test test::test_dispute_deadline_set_on_raise ... ok +test test::test_double_create_job_panics - should panic ... ok +test test::test_deposit_with_wrong_total_panics_2 - should panic ... FAILED +test test::test_double_init - should panic ... ok +test test::test_dispute_event_emission ... ok +test test::test_double_release_milestone_is_blocked - should panic ... ok +test test::test_expire_dispute_refunds_client_after_deadline ... ok +test test::test_dispute_50_50_split ... ok +test test::test_get_job_not_found_panics - should panic ... ok +test test::test_instance_config_getters ... ok +test test::test_get_multisig_config ... ok +test test::test_open_dispute_on_completed_panics - should panic ... ok +test test::test_open_dispute_by_rando_panics - should panic ... ok +test test::test_exhaustive_release_funds_path ... ok +test test::test_raise_dispute_by_freelancer_locks_funds ... ok +test test::test_happy_path_lifecycle ... ok +test test::test_raise_dispute_blocks_release_funds ... ok +test test::test_raise_dispute_by_client_locks_funds ... ok +test test::test_reentrant_refund_panics - should panic ... FAILED +test test::test_raise_dispute_by_third_party_panics - should panic ... ok +test test::test_raise_dispute_on_completed_job_panics - should panic ... ok +test test::test_refund ... FAILED +test test::test_reentrant_release_funds_panics - should panic ... ok +test test::test_refund_reentrant_lock_panics - should panic ... FAILED +test test::test_release_funds_invalid_index_panics_2 - should panic ... FAILED +test test::test_reentrant_release_milestone_panics - should panic ... ok +test test::test_refund_by_non_client_panics - should panic ... ok +test test::test_release_funds_reentrant_lock_panics - should panic ... ok +test test::test_release_funds_invalid_index_panics - should panic ... ok +test test::test_release_funds_twice_panics - should panic ... ok +test test::test_release_milestone_no_pending_milestones - should panic ... ok +test test::test_release_milestone_reentrancy_guard_panics - should panic ... ok +test test::test_release_milestone_overflow_panics - should panic ... ok +test test::test_release_milestone_reentrant_lock_panics - should panic ... FAILED +test test::test_release_milestone_unauthorized_freelancer - should panic ... ok +test test::test_resolve_after_deadline_fails - should panic ... ok +test test::test_released_amount_matches_transferred_on_sequential_release ... ok +test test::test_release_milestone_sequential_success ... ok +test test::test_resolve_before_deadline_succeeds ... ok +test test::test_set_agent_judge_updates_packed_config ... ok +test test::test_resolve_dispute_full_payout_to_freelancer ... ok +test test::test_token_decimals_stored_on_deposit ... ok +test test::test_resolve_dispute_panics - should panic ... FAILED +test test::test_resolve_dispute_full_refund_to_client ... ok +test test::test_version ... ok +test test::test_unauthorized_release - should panic ... ok +test test::test_unauthorized_release_funds_by_freelancer_panics - should panic ... ok +test test::test_variable_milestone_amounts ... ok + +failures: + +---- test::test_deposit_with_wrong_total_panics_2 stdout ---- +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 1000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 2000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 3000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 6000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["release_funds: job {} amount {}", 1, 3000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["release_funds: job {} amount {}", 1, 1000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["release_funds: job {} amount {}", 1, 2000] +Writing test snapshot file for test "test::test_deposit_with_wrong_total_panics_2" to "test_snapshots/test/test_deposit_with_wrong_total_panics_2.1.json". +note: test did not panic as expected at contracts/escrow/src/lib.rs:2628:8 +---- test::test_reentrant_refund_panics stdout ---- +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 5000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 5000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["refund: job {} amount {}", 1, 5000] +Writing test snapshot file for test "test::test_reentrant_refund_panics" to "test_snapshots/test/test_reentrant_refund_panics.1.json". +note: test did not panic as expected at contracts/escrow/src/lib.rs:3445:8 +---- test::test_refund stdout ---- +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 2500] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 2500] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 5000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["refund: job {} amount {}", 1, 5000] + +thread 'test::test_refund' panicked at contracts/escrow/src/lib.rs:2110:9: +assertion `left == right` failed + left: Funded + right: Refunded +Writing test snapshot file for test "test::test_refund" to "test_snapshots/test/test_refund.1.json". + +---- test::test_refund_reentrant_lock_panics stdout ---- +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 10000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] + +thread 'test::test_refund_reentrant_lock_panics' panicked at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:768:9: +HostError: Error(Contract, #23) + +Event log (newest first): + 0: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:"escalating error to panic" + 1: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:["contract call failed", refund, [1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]] + 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #23)], data:"escalating Ok(ScErrorType::Contract) frame-exit to Err" + 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, refund], data:Error(Contract, #23) + 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), refund], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M] + 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void + 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Deposit"], data:{amount: 10000, deposited_at: 0, job_id: 1} + 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] + 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void + 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"], data:10000 + 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 10000] + 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7 + 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void + 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 10000] + 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void + 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 10000] + 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 10000] + 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void + 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] + 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG] + 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void + 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Initialized"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0] + 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] + 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] + 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void + 25: ... 7 events elided ... + +Backtrace (newest first): + 0: ::escalate_error_to_panic + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31 + 1: soroban_sdk::env::internal::reject_err::{{closure}} + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27 + 2: core::result::Result::map_err + at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27 + 3: soroban_sdk::env::internal::reject_err + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11 + 4: ::call + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13 + 5: soroban_sdk::env::Env::invoke_contract + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18 + 6: escrow::EscrowContractClient::refund + at src/lib.rs:335:1 + 7: escrow::test::test_refund_reentrant_lock_panics + at src/lib.rs:2621:12 + 8: escrow::test::test_refund_reentrant_lock_panics::{{closure}} + at src/lib.rs:2600:43 + 9: core::ops::function::FnOnce::call_once + at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5 + + +Writing test snapshot file for test "test::test_refund_reentrant_lock_panics" to "test_snapshots/test/test_refund_reentrant_lock_panics.1.json". +note: panic did not contain expected string + panic message: "HostError: Error(Contract, #23)\n\nEvent log (newest first):\n 0: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:\"escalating error to panic\"\n 1: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:[\"contract call failed\", refund, [1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]]\n 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #23)], data:\"escalating Ok(ScErrorType::Contract) frame-exit to Err\"\n 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, refund], data:Error(Contract, #23)\n 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), refund], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]\n 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void\n 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Deposit\"], data:{amount: 10000, deposited_at: 0, job_id: 1}\n 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"deposit: job {} amount {}\", 1, 10000]\n 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void\n 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, \"aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV\"], data:10000\n 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 10000]\n 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7\n 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void\n 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 10000]\n 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void\n 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"add_milestone: job {} amount {}\", 1, 10000]\n 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 10000]\n 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void\n 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"create_job: id {} client {} freelancer {}\", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4]\n 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG]\n 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void\n 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Initialized\"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0]\n 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"Escrow initialized with admin: {} and agent_judge: {}\", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void\n 25: ... 7 events elided ...\n\nBacktrace (newest first):\n 0: ::escalate_error_to_panic\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31\n 1: soroban_sdk::env::internal::reject_err::{{closure}}\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27\n 2: core::result::Result::map_err\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27\n 3: soroban_sdk::env::internal::reject_err\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11\n 4: ::call\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13\n 5: soroban_sdk::env::Env::invoke_contract\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18\n 6: escrow::EscrowContractClient::refund\n at src/lib.rs:335:1\n 7: escrow::test::test_refund_reentrant_lock_panics\n at src/lib.rs:2621:12\n 8: escrow::test::test_refund_reentrant_lock_panics::{{closure}}\n at src/lib.rs:2600:43\n 9: core::ops::function::FnOnce::call_once\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5\n\n" + expected substring: "Error(Contract, #11)" +---- test::test_release_funds_invalid_index_panics_2 stdout ---- +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 5000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 5000] + +thread 'test::test_release_funds_invalid_index_panics_2' panicked at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:768:9: +HostError: Error(Contract, #6) + +Event log (newest first): + 0: [Diagnostic Event] topics:[error, Error(Contract, #6)], data:"escalating error to panic" + 1: [Diagnostic Event] topics:[error, Error(Contract, #6)], data:["contract call failed", resolve_dispute, [1, 2500, 2500]] + 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #6)], data:"escalating Ok(ScErrorType::Contract) frame-exit to Err" + 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, resolve_dispute], data:Error(Contract, #6) + 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), resolve_dispute], data:[1, 2500, 2500] + 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void + 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Deposit"], data:{amount: 5000, deposited_at: 0, job_id: 1} + 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 5000] + 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void + 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"], data:5000 + 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 5000] + 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7 + 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void + 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 5000] + 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void + 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 5000] + 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 5000] + 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void + 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] + 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG] + 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void + 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Initialized"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0] + 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] + 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] + 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void + 25: ... 7 events elided ... + +Backtrace (newest first): + 0: ::escalate_error_to_panic + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31 + 1: soroban_sdk::env::internal::reject_err::{{closure}} + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27 + 2: core::result::Result::map_err + at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27 + 3: soroban_sdk::env::internal::reject_err + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11 + 4: ::call + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13 + 5: soroban_sdk::env::Env::invoke_contract + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18 + 6: escrow::EscrowContractClient::resolve_dispute + at src/lib.rs:335:1 + 7: escrow::test::test_release_funds_invalid_index_panics_2 + at src/lib.rs:3118:12 + 8: escrow::test::test_release_funds_invalid_index_panics_2::{{closure}} + at src/lib.rs:3097:51 + 9: core::ops::function::FnOnce::call_once + at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5 + + +Writing test snapshot file for test "test::test_release_funds_invalid_index_panics_2" to "test_snapshots/test/test_release_funds_invalid_index_panics_2.1.json". +note: panic did not contain expected string + panic message: "HostError: Error(Contract, #6)\n\nEvent log (newest first):\n 0: [Diagnostic Event] topics:[error, Error(Contract, #6)], data:\"escalating error to panic\"\n 1: [Diagnostic Event] topics:[error, Error(Contract, #6)], data:[\"contract call failed\", resolve_dispute, [1, 2500, 2500]]\n 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #6)], data:\"escalating Ok(ScErrorType::Contract) frame-exit to Err\"\n 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, resolve_dispute], data:Error(Contract, #6)\n 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), resolve_dispute], data:[1, 2500, 2500]\n 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void\n 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Deposit\"], data:{amount: 5000, deposited_at: 0, job_id: 1}\n 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"deposit: job {} amount {}\", 1, 5000]\n 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void\n 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, \"aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV\"], data:5000\n 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 5000]\n 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7\n 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void\n 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 5000]\n 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void\n 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"add_milestone: job {} amount {}\", 1, 5000]\n 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 5000]\n 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void\n 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"create_job: id {} client {} freelancer {}\", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4]\n 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG]\n 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void\n 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Initialized\"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0]\n 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"Escrow initialized with admin: {} and agent_judge: {}\", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void\n 25: ... 7 events elided ...\n\nBacktrace (newest first):\n 0: ::escalate_error_to_panic\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31\n 1: soroban_sdk::env::internal::reject_err::{{closure}}\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27\n 2: core::result::Result::map_err\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27\n 3: soroban_sdk::env::internal::reject_err\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11\n 4: ::call\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13\n 5: soroban_sdk::env::Env::invoke_contract\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18\n 6: escrow::EscrowContractClient::resolve_dispute\n at src/lib.rs:335:1\n 7: escrow::test::test_release_funds_invalid_index_panics_2\n at src/lib.rs:3118:12\n 8: escrow::test::test_release_funds_invalid_index_panics_2::{{closure}}\n at src/lib.rs:3097:51\n 9: core::ops::function::FnOnce::call_once\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5\n\n" + expected substring: "invalid milestone index" +---- test::test_release_milestone_reentrant_lock_panics stdout ---- +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 10000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] + +thread 'test::test_release_milestone_reentrant_lock_panics' panicked at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:768:9: +HostError: Error(Contract, #23) + +Event log (newest first): + 0: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:"escalating error to panic" + 1: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:["contract call failed", release_milestone, [1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]] + 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #23)], data:"escalating Ok(ScErrorType::Contract) frame-exit to Err" + 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, release_milestone], data:Error(Contract, #23) + 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), release_milestone], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M] + 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void + 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Deposit"], data:{amount: 10000, deposited_at: 0, job_id: 1} + 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] + 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void + 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"], data:10000 + 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 10000] + 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7 + 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void + 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 10000] + 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void + 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 10000] + 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 10000] + 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void + 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] + 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG] + 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void + 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:["escrow", "Initialized"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0] + 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] + 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] + 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void + 25: ... 7 events elided ... + +Backtrace (newest first): + 0: ::escalate_error_to_panic + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31 + 1: soroban_sdk::env::internal::reject_err::{{closure}} + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27 + 2: core::result::Result::map_err + at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27 + 3: soroban_sdk::env::internal::reject_err + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11 + 4: ::call + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13 + 5: soroban_sdk::env::Env::invoke_contract + at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18 + 6: escrow::EscrowContractClient::release_milestone + at src/lib.rs:335:1 + 7: escrow::test::test_release_milestone_reentrant_lock_panics + at src/lib.rs:2958:12 + 8: escrow::test::test_release_milestone_reentrant_lock_panics::{{closure}} + at src/lib.rs:2937:54 + 9: core::ops::function::FnOnce::call_once + at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5 + + +Writing test snapshot file for test "test::test_release_milestone_reentrant_lock_panics" to "test_snapshots/test/test_release_milestone_reentrant_lock_panics.1.json". +note: panic did not contain expected string + panic message: "HostError: Error(Contract, #23)\n\nEvent log (newest first):\n 0: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:\"escalating error to panic\"\n 1: [Diagnostic Event] topics:[error, Error(Contract, #23)], data:[\"contract call failed\", release_milestone, [1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]]\n 2: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[error, Error(Contract, #23)], data:\"escalating Ok(ScErrorType::Contract) frame-exit to Err\"\n 3: [Failed Diagnostic Event (not emitted)] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, release_milestone], data:Error(Contract, #23)\n 4: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), release_milestone], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M]\n 5: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, deposit], data:Void\n 6: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Deposit\"], data:{amount: 10000, deposited_at: 0, job_id: 1}\n 7: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"deposit: job {} amount {}\", 1, 10000]\n 8: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, transfer], data:Void\n 9: [Contract Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[transfer, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, \"aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV\"], data:10000\n 10: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), transfer], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, 10000]\n 11: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, decimals], data:7\n 12: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_call, Bytes(d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73), decimals], data:Void\n 13: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), deposit], data:[1, 10000]\n 14: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, add_milestone], data:Void\n 15: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"add_milestone: job {} amount {}\", 1, 10000]\n 16: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), add_milestone], data:[1, 10000]\n 17: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, create_job], data:Void\n 18: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"create_job: id {} client {} freelancer {}\", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4]\n 19: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), create_job], data:[1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4, CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG]\n 20: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[fn_return, initialize], data:Void\n 21: [Contract Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[\"escrow\", \"Initialized\"], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4, 0]\n 22: [Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:[\"Escrow initialized with admin: {} and agent_judge: {}\", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 23: [Diagnostic Event] topics:[fn_call, Bytes(0000000000000000000000000000000000000000000000000000000000000006), initialize], data:[CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4]\n 24: [Diagnostic Event] contract:CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG, topics:[fn_return, mint], data:Void\n 25: ... 7 events elided ...\n\nBacktrace (newest first):\n 0: ::escalate_error_to_panic\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-env-host-21.2.1/src/host.rs:767:31\n 1: soroban_sdk::env::internal::reject_err::{{closure}}\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:27\n 2: core::result::Result::map_err\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/result.rs:914:27\n 3: soroban_sdk::env::internal::reject_err\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:52:11\n 4: ::call\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:1667:13\n 5: soroban_sdk::env::Env::invoke_contract\n at /home/kaycee/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/soroban-sdk-21.7.7/src/env.rs:379:18\n 6: escrow::EscrowContractClient::release_milestone\n at src/lib.rs:335:1\n 7: escrow::test::test_release_milestone_reentrant_lock_panics\n at src/lib.rs:2958:12\n 8: escrow::test::test_release_milestone_reentrant_lock_panics::{{closure}}\n at src/lib.rs:2937:54\n 9: core::ops::function::FnOnce::call_once\n at /rustc/29483883eed69d5fb4db01964cdf2af4d86e9cb2/library/core/src/ops/function.rs:250:5\n\n" + expected substring: "Error(Contract, #11)" +---- test::test_resolve_dispute_panics stdout ---- +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["Escrow initialized with admin: {} and agent_judge: {}", CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["create_job: id {} client {} freelancer {}", 1, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M, CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 3000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 3000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["add_milestone: job {} amount {}", 1, 4000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["deposit: job {} amount {}", 1, 10000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["release_milestone: job {} amount {}", 1, 3000] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["raise_dispute: job {}", 1] +[Diagnostic Event] contract:CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4, topics:[log], data:["resolve_dispute: job {} payee {} payer {}", 1, 4900, 2100] +Writing test snapshot file for test "test::test_resolve_dispute_panics" to "test_snapshots/test/test_resolve_dispute_panics.1.json". +note: test did not panic as expected at contracts/escrow/src/lib.rs:2963:8 + +failures: + test::test_deposit_with_wrong_total_panics_2 + test::test_reentrant_refund_panics + test::test_refund + test::test_refund_reentrant_lock_panics + test::test_release_funds_invalid_index_panics_2 + test::test_release_milestone_reentrant_lock_panics + test::test_resolve_dispute_panics + +test result: FAILED. 53 passed; 7 failed; 0 ignored; 0 measured; 0 filtered out; finished in 18.50s + +error: test failed, to rerun pass `--lib` diff --git a/contracts/escrow/test_snapshots/test/test_add_milestone_limit_panics.1.json b/contracts/escrow/test_snapshots/test/test_add_milestone_limit_panics.1.json index 5b0dd699..bed749f8 100644 --- a/contracts/escrow/test_snapshots/test/test_add_milestone_limit_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_add_milestone_limit_panics.1.json @@ -2203,6 +2203,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -6764,7 +6772,7 @@ "data": { "vec": [ { - "string": "caught panic 'too many milestones' from contract function 'Symbol(obj#4701)'" + "string": "caught panic 'too many milestones' from contract function 'Symbol(obj#4831)'" }, { "u64": 1 diff --git a/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_budget_panics.1.json b/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_budget_panics.1.json index c01383cd..7e92896a 100644 --- a/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_budget_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_budget_panics.1.json @@ -405,6 +405,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -1339,7 +1347,7 @@ "data": { "vec": [ { - "string": "caught panic 'job budget exceeds maximum' from contract function 'Symbol(obj#299)'" + "string": "caught panic 'job budget exceeds maximum' from contract function 'Symbol(obj#305)'" }, { "u64": 1 diff --git a/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_panics.1.json b/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_panics.1.json index 3efd5cf9..00b492c2 100644 --- a/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_add_milestone_over_max_panics.1.json @@ -347,6 +347,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -1163,7 +1171,7 @@ "data": { "vec": [ { - "string": "caught panic 'milestone amount exceeds maximum' from contract function 'Symbol(obj#221)'" + "string": "caught panic 'milestone amount exceeds maximum' from contract function 'Symbol(obj#223)'" }, { "u64": 1 diff --git a/contracts/escrow/test_snapshots/test/test_cancel_brief_in_setup_marks_refunded_without_transfer.1.json b/contracts/escrow/test_snapshots/test/test_cancel_brief_in_setup_marks_refunded_without_transfer.1.json index 049748df..95102c34 100644 --- a/contracts/escrow/test_snapshots/test/test_cancel_brief_in_setup_marks_refunded_without_transfer.1.json +++ b/contracts/escrow/test_snapshots/test/test_cancel_brief_in_setup_marks_refunded_without_transfer.1.json @@ -344,6 +344,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -1143,6 +1151,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_deposit_event_emitted.1.json b/contracts/escrow/test_snapshots/test/test_deposit_event_emitted.1.json index b71a157f..e53ee0db 100644 --- a/contracts/escrow/test_snapshots/test/test_deposit_event_emitted.1.json +++ b/contracts/escrow/test_snapshots/test/test_deposit_event_emitted.1.json @@ -487,6 +487,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -1806,6 +1814,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_deposit_invalid_state_not_setup.1.json b/contracts/escrow/test_snapshots/test/test_deposit_invalid_state_not_setup.1.json index a37c0496..341dcc50 100644 --- a/contracts/escrow/test_snapshots/test/test_deposit_invalid_state_not_setup.1.json +++ b/contracts/escrow/test_snapshots/test/test_deposit_invalid_state_not_setup.1.json @@ -545,6 +545,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_deposit_negative_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_negative_panics.1.json index c1420167..023e6477 100644 --- a/contracts/escrow/test_snapshots/test/test_deposit_negative_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_deposit_negative_panics.1.json @@ -405,6 +405,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_deposit_no_milestones_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_no_milestones_panics.1.json index 3ce0e0d4..ff621a49 100644 --- a/contracts/escrow/test_snapshots/test/test_deposit_no_milestones_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_deposit_no_milestones_panics.1.json @@ -48,28 +48,7 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -171,39 +150,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -243,7 +189,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -258,7 +204,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -323,14 +269,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -349,10 +287,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [] + "u32": 0 } }, { @@ -366,14 +304,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -394,14 +324,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 0 - } - }, { "key": { "symbol": "total_amount" @@ -419,7 +341,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -449,29 +371,24 @@ "key": { "vec": [ { - "symbol": "Config" + "symbol": "Admin" } ] }, "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } + "symbol": "AgentJudge" } ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } } ] @@ -481,7 +398,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -687,7 +604,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ] ] @@ -935,69 +852,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Initialized" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1058,39 +912,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1157,16 +978,24 @@ "v0": { "topics": [ { - "symbol": "fn_return" - }, - { - "symbol": "deposit" + "symbol": "log" } ], "data": { - "error": { - "contract": 4 - } + "vec": [ + { + "string": "caught panic 'no milestones defined' from contract function 'Symbol(deposit)'" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] } } } @@ -1186,12 +1015,12 @@ }, { "error": { - "contract": 4 + "wasm_vm": "invalid_action" } } ], "data": { - "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + "string": "caught error from function" } } } @@ -1211,7 +1040,7 @@ }, { "error": { - "contract": 4 + "wasm_vm": "invalid_action" } } ], @@ -1256,7 +1085,7 @@ }, { "error": { - "contract": 4 + "wasm_vm": "invalid_action" } } ], diff --git a/contracts/escrow/test_snapshots/test/test_deposit_reentrancy_guard_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_reentrancy_guard_panics.1.json index f5e8d4eb..a0e1e84c 100644 --- a/contracts/escrow/test_snapshots/test/test_deposit_reentrancy_guard_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_deposit_reentrancy_guard_panics.1.json @@ -406,6 +406,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_deposit_success_transitions_to_funded.1.json b/contracts/escrow/test_snapshots/test/test_deposit_success_transitions_to_funded.1.json index 681f0b88..3e585eb9 100644 --- a/contracts/escrow/test_snapshots/test/test_deposit_success_transitions_to_funded.1.json +++ b/contracts/escrow/test_snapshots/test/test_deposit_success_transitions_to_funded.1.json @@ -490,6 +490,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -1861,6 +1869,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics.1.json index 3363e95a..5d2a662a 100644 --- a/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics.1.json @@ -48,28 +48,7 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -196,39 +175,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -268,7 +214,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 2032731177588607455 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -283,7 +229,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 2032731177588607455 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -381,14 +327,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -407,38 +345,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - } - ] + "u32": 1 } }, { @@ -452,14 +362,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -482,15 +384,70 @@ }, { "key": { - "symbol": "token_decimals" + "symbol": "total_amount" }, "val": { - "u32": 0 + "i128": { + "hi": 0, + "lo": 0 + } } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ { "key": { - "symbol": "total_amount" + "symbol": "amount" }, "val": { "i128": { @@ -498,6 +455,18 @@ "lo": 500 } } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } } ] } @@ -505,7 +474,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -535,29 +504,24 @@ "key": { "vec": [ { - "symbol": "Config" + "symbol": "Admin" } ] }, "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } + "symbol": "AgentJudge" } ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } } ] @@ -567,7 +531,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -773,7 +737,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ] ] @@ -1021,69 +985,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Initialized" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1144,39 +1045,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1234,39 +1102,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1333,16 +1168,24 @@ "v0": { "topics": [ { - "symbol": "fn_return" - }, - { - "symbol": "deposit" + "symbol": "log" } ], "data": { - "error": { - "contract": 7 - } + "vec": [ + { + "string": "caught panic 'sum of milestones must equal total amount' from contract function 'Symbol(deposit)'" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] } } } @@ -1362,12 +1205,12 @@ }, { "error": { - "contract": 7 + "wasm_vm": "invalid_action" } } ], "data": { - "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + "string": "caught error from function" } } } @@ -1387,7 +1230,7 @@ }, { "error": { - "contract": 7 + "wasm_vm": "invalid_action" } } ], @@ -1432,7 +1275,7 @@ }, { "error": { - "contract": 7 + "wasm_vm": "invalid_action" } } ], diff --git a/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics_2.1.json b/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics_2.1.json new file mode 100644 index 00000000..416c4fca --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_deposit_with_wrong_total_panics_2.1.json @@ -0,0 +1,3283 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_funds", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 2 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_funds", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_funds", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "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": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 94000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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" + }, + 150000 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "Escrow initialized with admin: {} and agent_judge: {}" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "create_job: id {} client {} freelancer {}" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "decimals" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "decimals" + } + ], + "data": { + "u32": 7 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "deposit: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Deposit" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "deposited_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_funds" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "release_funds: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_funds" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_funds" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "release_funds: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_funds" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_funds" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "release_funds: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_funds" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_job" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_job" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_deposit_zero_panics.1.json b/contracts/escrow/test_snapshots/test/test_deposit_zero_panics.1.json index 9d73cce4..9dfb0b90 100644 --- a/contracts/escrow/test_snapshots/test/test_deposit_zero_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_deposit_zero_panics.1.json @@ -405,6 +405,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_dispute_50_50_split.1.json b/contracts/escrow/test_snapshots/test/test_dispute_50_50_split.1.json index dc691903..c996256a 100644 --- a/contracts/escrow/test_snapshots/test/test_dispute_50_50_split.1.json +++ b/contracts/escrow/test_snapshots/test/test_dispute_50_50_split.1.json @@ -48,28 +48,7 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -399,39 +378,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -471,7 +417,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", "key": { "ledger_key_nonce": { - "nonce": 3126073502131104533 + "nonce": 115220454072064130 } }, "durability": "temporary" @@ -486,7 +432,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", "key": { "ledger_key_nonce": { - "nonce": 3126073502131104533 + "nonce": 115220454072064130 } }, "durability": "temporary", @@ -504,7 +450,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -519,7 +465,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -735,7 +681,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 1194852393571756375 } }, "durability": "temporary" @@ -750,7 +696,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 1194852393571756375 } }, "durability": "temporary", @@ -815,14 +761,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 604800 - } - }, { "key": { "symbol": "expires_at" @@ -841,119 +779,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - } - ] + "u32": 4 } }, { @@ -967,14 +796,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -995,14 +816,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" @@ -1020,82 +833,23 @@ }, "ext": "v0" }, - 150000 + 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": "Config" - } - ] - }, - "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, - { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - } - ] - } - } - ] - } - } - } - }, - "ext": "v0" - }, - 150000 - ] - ], - [ - { - "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 0 } ] }, @@ -1108,14 +862,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 0 } ] }, @@ -1129,24 +886,20 @@ "val": { "i128": { "hi": 0, - "lo": 93750 + "lo": 2500 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1155,20 +908,23 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -1181,14 +937,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -1202,24 +961,20 @@ "val": { "i128": { "hi": 0, - "lo": 6250 + "lo": 2500 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Pending" + } + ] } } ] @@ -1228,20 +983,23 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -1254,14 +1012,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -1275,18 +1036,365 @@ "val": { "i128": { "hi": 0, - "lo": 0 + "lo": 2500 } } }, { "key": { - "symbol": "authorized" + "symbol": "status" }, "val": { - "bool": true - } - }, + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2500 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "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" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AgentJudge" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 93750 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6250 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, { "key": { "symbol": "clawback" @@ -1434,7 +1542,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ] ] @@ -1449,90 +1557,17 @@ "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "init_asset" - } - ], - "data": { - "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "init_asset" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "set_admin" - } - ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "set_admin" + "symbol": "fn_call" }, { - "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + "symbol": "init_asset" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" } } } @@ -1551,7 +1586,7 @@ "symbol": "fn_return" }, { - "symbol": "set_admin" + "symbol": "init_asset" } ], "data": "void" @@ -1575,21 +1610,11 @@ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "mint" + "symbol": "set_admin" } ], "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "i128": { - "hi": 0, - "lo": 100000 - } - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } } } @@ -1605,23 +1630,17 @@ "v0": { "topics": [ { - "symbol": "mint" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "symbol": "set_admin" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" }, { "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "i128": { - "hi": 0, - "lo": 100000 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } } } @@ -1640,7 +1659,7 @@ "symbol": "fn_return" }, { - "symbol": "mint" + "symbol": "set_admin" } ], "data": "void" @@ -1661,49 +1680,22 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "initialize" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" + "symbol": "mint" } ], "data": { "vec": [ { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "i128": { + "hi": 0, + "lo": 100000 + } } ] } @@ -1715,123 +1707,29 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "contract", "body": { "v0": { "topics": [ { - "string": "escrow" - }, - { - "string": "Initialized" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" + "symbol": "mint" }, { - "symbol": "initialize" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "symbol": "create_job" + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" + "i128": { + "hi": 0, + "lo": 100000 } - ], - "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] } } } @@ -1841,7 +1739,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { @@ -1850,7 +1748,7 @@ "symbol": "fn_return" }, { - "symbol": "create_job" + "symbol": "mint" } ], "data": "void" @@ -1874,52 +1772,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "add_milestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" + "symbol": "initialize" } ], "data": { "vec": [ { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" }, { - "i128": { - "hi": 0, - "lo": 2500 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] } @@ -1940,7 +1802,7 @@ "symbol": "fn_return" }, { - "symbol": "add_milestone" + "symbol": "initialize" } ], "data": "void" @@ -1964,52 +1826,22 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "add_milestone" + "symbol": "create_job" } ], "data": { "vec": [ { "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ + }, { - "string": "add_milestone: job {} amount {}" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" }, { - "i128": { - "hi": 0, - "lo": 2500 - } + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } ] } @@ -2030,7 +1862,7 @@ "symbol": "fn_return" }, { - "symbol": "add_milestone" + "symbol": "create_job" } ], "data": "void" @@ -2075,39 +1907,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2174,14 +1973,38 @@ "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" } ], "data": { "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, { "u64": 1 }, @@ -2234,7 +2057,7 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "deposit" + "symbol": "add_milestone" } ], "data": { @@ -2245,7 +2068,7 @@ { "i128": { "hi": 0, - "lo": 10000 + "lo": 2500 } } ] @@ -2264,13 +2087,10 @@ "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + "symbol": "fn_return" }, { - "symbol": "decimals" + "symbol": "add_milestone" } ], "data": "void" @@ -2282,20 +2102,33 @@ { "event": { "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "decimals" + "symbol": "deposit" } ], "data": { - "u32": 7 + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] } } } @@ -2394,90 +2227,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "deposit: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 10000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Deposit" - } - ], - "data": { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 10000 - } - } - }, - { - "key": { - "symbol": "deposited_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "job_id" - }, - "val": { - "u64": 1 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2607,90 +2356,18 @@ "event": { "ext": "v0", "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "transfer" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "release_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "ReleaseMilestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "u32": 0 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - }, - { - "u64": 0 - } - ] - } + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" } } }, @@ -2802,66 +2479,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "open_dispute: job {}" - }, - { - "u64": 1 - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "OpenDispute" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2942,14 +2559,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 604800 - } - }, { "key": { "symbol": "expires_at" @@ -2968,119 +2577,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - } - ] + "u32": 4 } }, { @@ -3094,14 +2594,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -3122,14 +2614,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" @@ -3374,45 +2858,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "resolve_dispute: job {} payee {} payer {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3750 - } - }, - { - "i128": { - "hi": 0, - "lo": 3750 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -3493,14 +2938,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 604800 - } - }, { "key": { "symbol": "expires_at" @@ -3519,119 +2956,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - } - ] + "u32": 4 } }, { @@ -3645,14 +2973,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -3673,14 +2993,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" diff --git a/contracts/escrow/test_snapshots/test/test_dispute_deadline_set_on_raise.1.json b/contracts/escrow/test_snapshots/test/test_dispute_deadline_set_on_raise.1.json index 45ca821a..596e348f 100644 --- a/contracts/escrow/test_snapshots/test/test_dispute_deadline_set_on_raise.1.json +++ b/contracts/escrow/test_snapshots/test/test_dispute_deadline_set_on_raise.1.json @@ -542,6 +542,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_dispute_event_emission.1.json b/contracts/escrow/test_snapshots/test/test_dispute_event_emission.1.json index 1b839297..93fb2ad2 100644 --- a/contracts/escrow/test_snapshots/test/test_dispute_event_emission.1.json +++ b/contracts/escrow/test_snapshots/test/test_dispute_event_emission.1.json @@ -542,6 +542,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -1981,6 +1989,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_double_create_job_panics.1.json b/contracts/escrow/test_snapshots/test/test_double_create_job_panics.1.json index 0fdc3412..96e34da5 100644 --- a/contracts/escrow/test_snapshots/test/test_double_create_job_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_double_create_job_panics.1.json @@ -130,14 +130,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -156,10 +148,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [] + "u32": 0 } }, { @@ -173,14 +165,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -201,14 +185,6 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 0 - } - }, { "key": { "symbol": "total_amount" @@ -226,7 +202,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -324,39 +300,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000004", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -426,16 +369,27 @@ "v0": { "topics": [ { - "symbol": "fn_return" - }, - { - "symbol": "create_job" + "symbol": "log" } ], "data": { - "error": { - "contract": 4 - } + "vec": [ + { + "string": "caught panic 'job already exists' from contract function 'Symbol(obj#39)'" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] } } } @@ -455,12 +409,12 @@ }, { "error": { - "contract": 4 + "wasm_vm": "invalid_action" } } ], "data": { - "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + "string": "caught error from function" } } } @@ -480,7 +434,7 @@ }, { "error": { - "contract": 4 + "wasm_vm": "invalid_action" } } ], @@ -528,7 +482,7 @@ }, { "error": { - "contract": 4 + "wasm_vm": "invalid_action" } } ], diff --git a/contracts/escrow/test_snapshots/test/test_double_init.1.json b/contracts/escrow/test_snapshots/test/test_double_init.1.json index a9e3dd9e..80b237c1 100644 --- a/contracts/escrow/test_snapshots/test/test_double_init.1.json +++ b/contracts/escrow/test_snapshots/test/test_double_init.1.json @@ -4,28 +4,7 @@ "nonce": 0 }, "auth": [ - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [] ], "ledger": { @@ -38,39 +17,6 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 801925984706572462 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 801925984706572462 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -98,29 +44,24 @@ "key": { "vec": [ { - "symbol": "Config" + "symbol": "Admin" } ] }, "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } + "symbol": "AgentJudge" } ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } } ] @@ -130,7 +71,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -151,7 +92,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ] ] @@ -190,69 +131,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Initialized" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -316,16 +194,21 @@ "v0": { "topics": [ { - "symbol": "fn_return" - }, - { - "symbol": "initialize" + "symbol": "log" } ], "data": { - "error": { - "contract": 1 - } + "vec": [ + { + "string": "caught panic 'already initialized' from contract function 'Symbol(obj#23)'" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] } } } @@ -345,12 +228,12 @@ }, { "error": { - "contract": 1 + "wasm_vm": "invalid_action" } } ], "data": { - "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + "string": "caught error from function" } } } @@ -370,7 +253,7 @@ }, { "error": { - "contract": 1 + "wasm_vm": "invalid_action" } } ], @@ -412,7 +295,7 @@ }, { "error": { - "contract": 1 + "wasm_vm": "invalid_action" } } ], diff --git a/contracts/escrow/test_snapshots/test/test_double_release_milestone_is_blocked.1.json b/contracts/escrow/test_snapshots/test/test_double_release_milestone_is_blocked.1.json index 4caac09d..3f9763ad 100644 --- a/contracts/escrow/test_snapshots/test/test_double_release_milestone_is_blocked.1.json +++ b/contracts/escrow/test_snapshots/test/test_double_release_milestone_is_blocked.1.json @@ -542,6 +542,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_exhaustive_release_funds_path.1.json b/contracts/escrow/test_snapshots/test/test_exhaustive_release_funds_path.1.json index 7b71015d..54f3b90a 100644 --- a/contracts/escrow/test_snapshots/test/test_exhaustive_release_funds_path.1.json +++ b/contracts/escrow/test_snapshots/test/test_exhaustive_release_funds_path.1.json @@ -48,28 +48,7 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -426,39 +405,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -531,7 +477,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -546,7 +492,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -564,7 +510,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 1301173170172112462 + "nonce": 1194852393571756375 } }, "durability": "temporary" @@ -579,7 +525,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 1301173170172112462 + "nonce": 1194852393571756375 } }, "durability": "temporary", @@ -875,14 +821,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -901,119 +839,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - } - ] + "u32": 4 } }, { @@ -1027,14 +856,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -1055,14 +876,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" @@ -1080,82 +893,23 @@ }, "ext": "v0" }, - 150000 + 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": "Config" - } - ] - }, - "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, - { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - } - ] - } - } - ] - } - } - } - }, - "ext": "v0" - }, - 150000 - ] - ], - [ - { - "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 0 } ] }, @@ -1168,14 +922,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 0 } ] }, @@ -1189,24 +946,20 @@ "val": { "i128": { "hi": 0, - "lo": 90000 + "lo": 2500 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1215,20 +968,23 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -1241,14 +997,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -1262,24 +1021,20 @@ "val": { "i128": { "hi": 0, - "lo": 10000 + "lo": 2500 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1288,20 +1043,23 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -1314,14 +1072,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -1335,24 +1096,95 @@ "val": { "i128": { "hi": 0, - "lo": 0 + "lo": 2500 } } }, { "key": { - "symbol": "authorized" + "symbol": "status" }, "val": { - "bool": true - } - }, - { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { "key": { - "symbol": "clawback" + "symbol": "amount" }, "val": { - "bool": false + "i128": { + "hi": 0, + "lo": 2500 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1361,13 +1193,13 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": "ledger_key_contract_instance", "durability": "persistent" } @@ -1378,46 +1210,15 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { "contract_instance": { - "executable": "stellar_asset", + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, "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": [ @@ -1434,36 +1235,12 @@ "key": { "vec": [ { - "symbol": "AssetInfo" + "symbol": "AgentJudge" } ] }, "val": { - "vec": [ - { - "symbol": "AlphaNum4" - }, - { - "map": [ - { - "key": { - "symbol": "asset_code" - }, - "val": { - "string": "aaa\\0" - } - }, - { - "key": { - "symbol": "issuer" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000005" - } - } - ] - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } } ] @@ -1473,242 +1250,364 @@ }, "ext": "v0" }, - 120960 + 4095 ] ], [ { - "contract_code": { - "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" } }, [ { "last_modified_ledger_seq": 0, "data": { - "contract_code": { + "contract_data": { "ext": "v0", - "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "code": "" + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 90000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } } }, "ext": "v0" }, - 150000 + 518400 ] - ] - ] - }, - "events": [ - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "init_asset" - } - ], - "data": { - "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" - } + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "init_asset" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "set_admin" - } - ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "set_admin" - }, - { - "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - } - ], + }, + [ + { + "last_modified_ledger_seq": 0, "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "set_admin" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "mint" + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } } - ], - "data": { + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "Balance" }, { - "i128": { - "hi": 0, - "lo": 100000 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" } ] - } + }, + "durability": "persistent" } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "mint" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - } - ], + }, + [ + { + "last_modified_ledger_seq": 0, "data": { - "i128": { - "hi": 0, - "lo": 100000 + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "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": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": "ledger_key_contract_instance", + "durability": "persistent" } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "mint" + }, + [ + { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + } + } + ] + } + ] + } + } + ] + } + } } - ], - "data": "void" + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" } - } - }, - "failed_call": false - }, + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ { "event": { "ext": "v0", @@ -1721,84 +1620,14 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" - }, - { - "symbol": "initialize" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "string": "Initialized" + "symbol": "init_asset" } ], "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" } } } @@ -1808,7 +1637,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { @@ -1817,7 +1646,7 @@ "symbol": "fn_return" }, { - "symbol": "initialize" + "symbol": "init_asset" } ], "data": "void" @@ -1838,27 +1667,14 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "create_job" + "symbol": "set_admin" } ], "data": { - "vec": [ - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } } } @@ -1868,30 +1684,23 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "log" + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } } } @@ -1901,7 +1710,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { @@ -1910,7 +1719,7 @@ "symbol": "fn_return" }, { - "symbol": "create_job" + "symbol": "set_admin" } ], "data": "void" @@ -1931,21 +1740,21 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "add_milestone" + "symbol": "mint" } ], "data": { "vec": [ { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { "i128": { "hi": 0, - "lo": 2500 + "lo": 100000 } } ] @@ -1958,30 +1767,29 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "log" + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] + "i128": { + "hi": 0, + "lo": 100000 + } } } } @@ -1991,7 +1799,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { @@ -2000,7 +1808,7 @@ "symbol": "fn_return" }, { - "symbol": "add_milestone" + "symbol": "mint" } ], "data": "void" @@ -2024,19 +1832,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "add_milestone" + "symbol": "initialize" } ], "data": { "vec": [ { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" }, { - "i128": { - "hi": 0, - "lo": 2500 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] } @@ -2054,22 +1859,49 @@ "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" } ], "data": { "vec": [ { - "string": "add_milestone: job {} amount {}" + "u64": 1 }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "i128": { - "hi": 0, - "lo": 2500 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } ] } @@ -2090,7 +1922,7 @@ "symbol": "fn_return" }, { - "symbol": "add_milestone" + "symbol": "create_job" } ], "data": "void" @@ -2135,39 +1967,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2234,14 +2033,38 @@ "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" } ], "data": { "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, { "u64": 1 }, @@ -2294,7 +2117,7 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "deposit" + "symbol": "add_milestone" } ], "data": { @@ -2305,7 +2128,7 @@ { "i128": { "hi": 0, - "lo": 10000 + "lo": 2500 } } ] @@ -2324,13 +2147,10 @@ "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + "symbol": "fn_return" }, { - "symbol": "decimals" + "symbol": "add_milestone" } ], "data": "void" @@ -2342,20 +2162,33 @@ { "event": { "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "decimals" + "symbol": "deposit" } ], "data": { - "u32": 7 + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] } } } @@ -2416,71 +2249,17 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - } - ], - "data": { - "i128": { - "hi": 0, - "lo": 10000 - } - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "transfer" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "string": "deposit: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 10000 - } - } - ] + "i128": { + "hi": 0, + "lo": 10000 + } } } } @@ -2490,49 +2269,19 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "string": "escrow" + "symbol": "fn_return" }, { - "string": "Deposit" + "symbol": "transfer" } ], - "data": { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 10000 - } - } - }, - { - "key": { - "symbol": "deposited_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "job_id" - }, - "val": { - "u64": 1 - } - } - ] - } + "data": "void" } } }, @@ -2739,39 +2488,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "release_funds: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2973,39 +2689,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "release_funds: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -3207,39 +2890,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "release_funds: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -3441,39 +3091,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "release_funds: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -3554,14 +3171,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -3580,119 +3189,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - } - ] + "u32": 4 } }, { @@ -3706,14 +3206,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -3734,14 +3226,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" diff --git a/contracts/escrow/test_snapshots/test/test_expire_dispute_refunds_client_after_deadline.1.json b/contracts/escrow/test_snapshots/test/test_expire_dispute_refunds_client_after_deadline.1.json index f078b9d9..f25ea840 100644 --- a/contracts/escrow/test_snapshots/test/test_expire_dispute_refunds_client_after_deadline.1.json +++ b/contracts/escrow/test_snapshots/test/test_expire_dispute_refunds_client_after_deadline.1.json @@ -596,6 +596,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -2318,6 +2326,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_get_escrow_balance_decreases_on_release.1.json b/contracts/escrow/test_snapshots/test/test_get_escrow_balance_decreases_on_release.1.json new file mode 100644 index 00000000..a9920b57 --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_get_escrow_balance_decreases_on_release.1.json @@ -0,0 +1,2698 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_milestone", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_milestone", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_milestone", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "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" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AgentJudge" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 90000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 8000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_get_multisig_config.1.json b/contracts/escrow/test_snapshots/test/test_get_multisig_config.1.json index df83da1e..84f803a7 100644 --- a/contracts/escrow/test_snapshots/test/test_get_multisig_config.1.json +++ b/contracts/escrow/test_snapshots/test/test_get_multisig_config.1.json @@ -412,6 +412,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_happy_path_lifecycle.1.json b/contracts/escrow/test_snapshots/test/test_happy_path_lifecycle.1.json index e2688cf9..5bb1d9fd 100644 --- a/contracts/escrow/test_snapshots/test/test_happy_path_lifecycle.1.json +++ b/contracts/escrow/test_snapshots/test/test_happy_path_lifecycle.1.json @@ -48,28 +48,7 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -366,39 +345,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -438,7 +384,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -453,7 +399,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -749,14 +695,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -775,92 +713,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - } - ] + "u32": 3 } }, { @@ -874,14 +730,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -902,14 +750,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" @@ -927,82 +767,23 @@ }, "ext": "v0" }, - 150000 + 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": "Config" - } - ] - }, - "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, - { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - } - ] - } - } - ] - } - } - } - }, - "ext": "v0" - }, - 150000 - ] - ], - [ - { - "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 0 } ] }, @@ -1015,14 +796,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 0 } ] }, @@ -1036,24 +820,20 @@ "val": { "i128": { "hi": 0, - "lo": 91000 + "lo": 3000 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1062,20 +842,23 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -1088,14 +871,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -1109,24 +895,20 @@ "val": { "i128": { "hi": 0, - "lo": 9000 + "lo": 3000 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1135,20 +917,23 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -1161,14 +946,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -1182,24 +970,20 @@ "val": { "i128": { "hi": 0, - "lo": 0 + "lo": 3000 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1208,13 +992,289 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "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" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AgentJudge" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 91000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 9000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "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" } @@ -1336,137 +1396,17 @@ "contract_code": { "ext": "v0", "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "code": "" - } - }, - "ext": "v0" - }, - 150000 - ] - ] - ] - }, - "events": [ - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "init_asset" - } - ], - "data": { - "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "init_asset" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "set_admin" - } - ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "set_admin" - }, - { - "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - } - ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "set_admin" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ { "event": { "ext": "v0", @@ -1482,53 +1422,11 @@ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "mint" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "i128": { - "hi": 0, - "lo": 100000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "mint" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + "symbol": "init_asset" } ], "data": { - "i128": { - "hi": 0, - "lo": 100000 - } + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" } } } @@ -1547,7 +1445,7 @@ "symbol": "fn_return" }, { - "symbol": "mint" + "symbol": "init_asset" } ], "data": "void" @@ -1568,51 +1466,14 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "initialize" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" + "symbol": "set_admin" } ], "data": { - "vec": [ - { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } } } @@ -1622,30 +1483,23 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "contract", "body": { "v0": { "topics": [ { - "string": "escrow" + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" }, { - "string": "Initialized" + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } } } @@ -1655,7 +1509,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { @@ -1664,7 +1518,7 @@ "symbol": "fn_return" }, { - "symbol": "initialize" + "symbol": "set_admin" } ], "data": "void" @@ -1685,25 +1539,22 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "create_job" + "symbol": "mint" } ], "data": { "vec": [ - { - "u64": 1 - }, { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + "i128": { + "hi": 0, + "lo": 100000 + } } ] } @@ -1715,30 +1566,29 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "log" + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] + "i128": { + "hi": 0, + "lo": 100000 + } } } } @@ -1748,7 +1598,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { @@ -1757,7 +1607,7 @@ "symbol": "fn_return" }, { - "symbol": "create_job" + "symbol": "mint" } ], "data": "void" @@ -1781,52 +1631,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "add_milestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" + "symbol": "initialize" } ], "data": { "vec": [ { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" }, { - "i128": { - "hi": 0, - "lo": 3000 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] } @@ -1842,51 +1656,15 @@ "type_": "diagnostic", "body": { "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "add_milestone" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" - }, - { - "symbol": "add_milestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" } } }, @@ -1895,28 +1673,34 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" } ], "data": { "vec": [ { - "string": "add_milestone: job {} amount {}" + "u64": 1 }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "i128": { - "hi": 0, - "lo": 3000 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } ] } @@ -1937,7 +1721,7 @@ "symbol": "fn_return" }, { - "symbol": "add_milestone" + "symbol": "create_job" } ], "data": "void" @@ -1991,14 +1775,38 @@ "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" } ], "data": { "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, { "u64": 1 }, @@ -2051,7 +1859,7 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "deposit" + "symbol": "add_milestone" } ], "data": { @@ -2062,7 +1870,7 @@ { "i128": { "hi": 0, - "lo": 9000 + "lo": 3000 } } ] @@ -2081,13 +1889,10 @@ "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + "symbol": "fn_return" }, { - "symbol": "decimals" + "symbol": "add_milestone" } ], "data": "void" @@ -2099,20 +1904,33 @@ { "event": { "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "decimals" + "symbol": "deposit" } ], "data": { - "u32": 7 + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 9000 + } + } + ] } } } @@ -2211,90 +2029,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "deposit: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 9000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Deposit" - } - ], - "data": { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 9000 - } - } - }, - { - "key": { - "symbol": "deposited_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "job_id" - }, - "val": { - "u64": 1 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2411,107 +2145,21 @@ "topics": [ { "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "transfer" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "transfer" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - } - ], - "data": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "transfer" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, { - "symbol": "log" + "symbol": "transfer" } ], "data": { "vec": [ { - "string": "release_milestone: job {} amount {}" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" }, { "i128": { @@ -2529,42 +2177,56 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "contract", "body": { "v0": { "topics": [ { - "string": "escrow" + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" }, { - "string": "ReleaseMilestone" + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "u64": 1 - }, - { - "u32": 0 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - }, - { - "u64": 0 - } - ] + "i128": { + "hi": 0, + "lo": 3000 + } } } } }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -2763,78 +2425,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "release_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "ReleaseMilestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "u32": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -3033,78 +2623,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "release_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "ReleaseMilestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "u32": 2 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -3185,14 +2703,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -3211,92 +2721,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - } - ] + "u32": 3 } }, { @@ -3310,14 +2738,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -3338,14 +2758,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" diff --git a/contracts/escrow/test_snapshots/test/test_multiple_jobs_isolated.1.json b/contracts/escrow/test_snapshots/test/test_multiple_jobs_isolated.1.json new file mode 100644 index 00000000..57f9d0a6 --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_multiple_jobs_isolated.1.json @@ -0,0 +1,3977 @@ +{ + "generators": { + "address": 8, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V", + { + "function": { + "contract_fn": { + "contract_address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "create_job", + "args": [ + { + "u64": 2 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "add_milestone", + "args": [ + { + "u64": 2 + }, + { + "i128": { + "hi": 0, + "lo": 1500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "add_milestone", + "args": [ + { + "u64": 2 + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "deposit", + "args": [ + { + "u64": 2 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "release_milestone", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "function_name": "release_funds", + "args": [ + { + "u64": 2 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "u32": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V", + "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": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "WorkInProgress" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A" + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2500 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "WorkInProgress" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A" + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 2 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 2 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1500 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 2 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 2 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2500 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AgentJudge" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 90000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 96000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2500 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 7500 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000007" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "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": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000007" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CDS3FDGQ4JA2V3F26Y4BMWWJEC5TT26RJBN7KIQKUMVO2MAOCMDTSZ7A" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "i128": { + "hi": 0, + "lo": 1500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "u64": 2 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "u32": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "u32": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "u32": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1500 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "release_funds" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "u32": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPP4V" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 2500 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_funds" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "u64": 2 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_escrow_balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1500 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "u32": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1500 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "u32": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000008", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_milestone" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2500 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "e5b28cd0e241aaecbaf638165ac920bb39ebd1485bf5220aa32aed300e130739", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 2500 + } + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_open_dispute_by_rando_panics.1.json b/contracts/escrow/test_snapshots/test/test_open_dispute_by_rando_panics.1.json index 974d50cd..c3c08301 100644 --- a/contracts/escrow/test_snapshots/test/test_open_dispute_by_rando_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_open_dispute_by_rando_panics.1.json @@ -487,6 +487,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_open_dispute_on_completed_panics.1.json b/contracts/escrow/test_snapshots/test/test_open_dispute_on_completed_panics.1.json index 176c7f51..adb49061 100644 --- a/contracts/escrow/test_snapshots/test/test_open_dispute_on_completed_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_open_dispute_on_completed_panics.1.json @@ -542,6 +542,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_blocks_release_funds.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_blocks_release_funds.1.json index e9395dda..909638ad 100644 --- a/contracts/escrow/test_snapshots/test/test_raise_dispute_blocks_release_funds.1.json +++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_blocks_release_funds.1.json @@ -714,6 +714,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -2730,6 +2738,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_client_locks_funds.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_client_locks_funds.1.json index 2b2c7bbf..9fc30456 100644 --- a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_client_locks_funds.1.json +++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_client_locks_funds.1.json @@ -48,28 +48,7 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -323,7 +302,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1033654523790656264 + "nonce": 5541220902715666415 } }, "durability": "temporary" @@ -338,7 +317,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1033654523790656264 + "nonce": 5541220902715666415 } }, "durability": "temporary", @@ -353,10 +332,10 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -368,10 +347,10 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -482,39 +461,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "key": { - "ledger_key_nonce": { - "nonce": 5806905060045992000 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "key": { - "ledger_key_nonce": { - "nonce": 5806905060045992000 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -634,14 +580,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 604800 - } - }, { "key": { "symbol": "expires_at" @@ -660,92 +598,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - } - ] + "u32": 3 } }, { @@ -759,14 +615,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -787,14 +635,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" @@ -812,14 +652,26 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ { "contract_data": { "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "key": "ledger_key_contract_instance", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, "durability": "persistent" } }, @@ -830,64 +682,68 @@ "contract_data": { "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "key": "ledger_key_contract_instance", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, "durability": "persistent", "val": { - "contract_instance": { - "executable": { - "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Config" - } - ] - }, - "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, - { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - } - ] + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 } } - ] - } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] } } }, "ext": "v0" }, - 150000 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -900,14 +756,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -921,24 +780,20 @@ "val": { "i128": { "hi": 0, - "lo": 91000 + "lo": 3000 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Pending" + } + ] } } ] @@ -947,20 +802,23 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -973,14 +831,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -994,24 +855,20 @@ "val": { "i128": { "hi": 0, - "lo": 9000 + "lo": 3000 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Pending" + } + ] } } ] @@ -1020,13 +877,13 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": "ledger_key_contract_instance", "durability": "persistent" } @@ -1037,16 +894,219 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": "ledger_key_contract_instance", "durability": "persistent", "val": { "contract_instance": { - "executable": "stellar_asset", + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, "storage": [ { "key": { - "symbol": "METADATA" + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AgentJudge" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 91000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 9000 + } + } + }, + { + "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": [ @@ -1153,7 +1213,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ] ] @@ -1401,69 +1461,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Initialized" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1524,219 +1521,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "create_job" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" - }, - { - "symbol": "add_milestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "add_milestone" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" - }, - { - "symbol": "add_milestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1749,7 +1533,7 @@ "symbol": "fn_return" }, { - "symbol": "add_milestone" + "symbol": "create_job" } ], "data": "void" @@ -1803,14 +1587,38 @@ "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" } ], "data": { "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, { "u64": 1 }, @@ -1863,7 +1671,7 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "deposit" + "symbol": "add_milestone" } ], "data": { @@ -1874,7 +1682,7 @@ { "i128": { "hi": 0, - "lo": 9000 + "lo": 3000 } } ] @@ -1893,13 +1701,10 @@ "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + "symbol": "fn_return" }, { - "symbol": "decimals" + "symbol": "add_milestone" } ], "data": "void" @@ -1911,20 +1716,33 @@ { "event": { "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "decimals" + "symbol": "deposit" } ], "data": { - "u32": 7 + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 9000 + } + } + ] } } } @@ -2023,90 +1841,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "deposit: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 9000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Deposit" - } - ], - "data": { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 9000 - } - } - }, - { - "key": { - "symbol": "deposited_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "job_id" - }, - "val": { - "u64": 1 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2161,33 +1895,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "raise_dispute: job {}" - }, - { - "u64": 1 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2204,21 +1911,46 @@ } ], "data": { - "vec": [ + "map": [ { - "u64": 1 + "key": { + "symbol": "initiator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } }, { - "u32": 0 + "key": { + "symbol": "milestones_released" + }, + "val": { + "u32": 0 + } }, { - "u32": 3 + "key": { + "symbol": "milestones_total" + }, + "val": { + "u32": 3 + } }, { - "u64": 0 + "key": { + "symbol": "raised_at" + }, + "val": { + "u64": 0 + } } ] } @@ -2307,14 +2039,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 604800 - } - }, { "key": { "symbol": "expires_at" @@ -2333,92 +2057,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - } - ] + "u32": 3 } }, { @@ -2432,14 +2074,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -2460,14 +2094,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_freelancer_locks_funds.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_freelancer_locks_funds.1.json index 465ee60f..6a2afdad 100644 --- a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_freelancer_locks_funds.1.json +++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_freelancer_locks_funds.1.json @@ -600,6 +600,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -2156,6 +2164,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_third_party_panics.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_third_party_panics.1.json index bc48bbfa..59310789 100644 --- a/contracts/escrow/test_snapshots/test/test_raise_dispute_by_third_party_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_by_third_party_panics.1.json @@ -487,6 +487,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_raise_dispute_on_completed_job_panics.1.json b/contracts/escrow/test_snapshots/test/test_raise_dispute_on_completed_job_panics.1.json index 02394618..f0879f39 100644 --- a/contracts/escrow/test_snapshots/test/test_raise_dispute_on_completed_job_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_raise_dispute_on_completed_job_panics.1.json @@ -542,6 +542,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_reentrancy_protection_panics_on_recursive_release.1.json b/contracts/escrow/test_snapshots/test/test_reentrancy_protection_panics_on_recursive_release.1.json new file mode 100644 index 00000000..4808f20d --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_reentrancy_protection_panics_on_recursive_release.1.json @@ -0,0 +1,2231 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_milestone", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_milestone", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "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" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AgentJudge" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 90000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_job" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_job" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_reentrancy_protection_release_funds_blocked.1.json b/contracts/escrow/test_snapshots/test/test_reentrancy_protection_release_funds_blocked.1.json new file mode 100644 index 00000000..fbcd56f1 --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_reentrancy_protection_release_funds_blocked.1.json @@ -0,0 +1,2237 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_milestone", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_funds", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + } + }, + "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" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AgentJudge" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 90000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_funds" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_funds" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_job" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_job" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_reentrant_refund_panics.1.json b/contracts/escrow/test_snapshots/test/test_reentrant_refund_panics.1.json index 5091a195..2631a7f3 100644 --- a/contracts/escrow/test_snapshots/test/test_reentrant_refund_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_reentrant_refund_panics.1.json @@ -488,6 +488,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_reentrant_release_funds_panics.1.json b/contracts/escrow/test_snapshots/test/test_reentrant_release_funds_panics.1.json index 11e51220..ca90d88a 100644 --- a/contracts/escrow/test_snapshots/test/test_reentrant_release_funds_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_reentrant_release_funds_panics.1.json @@ -488,6 +488,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_reentrant_release_milestone_panics.1.json b/contracts/escrow/test_snapshots/test/test_reentrant_release_milestone_panics.1.json index 2d015063..e4a83e4e 100644 --- a/contracts/escrow/test_snapshots/test/test_reentrant_release_milestone_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_reentrant_release_milestone_panics.1.json @@ -488,6 +488,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_refund.1.json b/contracts/escrow/test_snapshots/test/test_refund.1.json index d29e0184..c4e66ec6 100644 --- a/contracts/escrow/test_snapshots/test/test_refund.1.json +++ b/contracts/escrow/test_snapshots/test/test_refund.1.json @@ -48,28 +48,7 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -198,7 +177,6 @@ ] ], [], - [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -227,7 +205,7 @@ "ledger": { "protocol_version": 21, "sequence_number": 0, - "timestamp": 2592001, + "timestamp": 0, "network_id": "0000000000000000000000000000000000000000000000000000000000000000", "base_reserve": 0, "min_persistent_entry_ttl": 4096, @@ -301,7 +279,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1033654523790656264 + "nonce": 5541220902715666415 } }, "durability": "temporary" @@ -316,7 +294,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1033654523790656264 + "nonce": 5541220902715666415 } }, "durability": "temporary", @@ -331,10 +309,10 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -346,10 +324,10 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -460,39 +438,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "key": { - "ledger_key_nonce": { - "nonce": 6277191135259896685 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "key": { - "ledger_key_nonce": { - "nonce": 6277191135259896685 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -581,94 +526,62 @@ }, { "key": { - "symbol": "dispute_deadline" + "symbol": "expires_at" }, "val": { - "u64": 0 + "u64": 2592000 } }, { "key": { - "symbol": "expires_at" + "symbol": "freelancer" }, "val": { - "u64": 2592000 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, { "key": { - "symbol": "freelancer" + "symbol": "milestone_count" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "u32": 2 + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } } }, { "key": { - "symbol": "milestones" + "symbol": "status" }, "val": { "vec": [ { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] + "symbol": "Refunded" } ] } }, { "key": { - "symbol": "released_amount" + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "total_amount" }, "val": { "i128": { @@ -676,13 +589,68 @@ "lo": 5000 } } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ { "key": { - "symbol": "requires_multisig" + "symbol": "amount" }, "val": { - "bool": false + "i128": { + "hi": 0, + "lo": 2500 + } } }, { @@ -692,36 +660,84 @@ "val": { "vec": [ { - "symbol": "Refunded" + "symbol": "Pending" } ] } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Milestone" }, { - "key": { - "symbol": "token" - }, - "val": { - "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" - } + "u64": 1 }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ { "key": { - "symbol": "token_decimals" + "symbol": "amount" }, "val": { - "u32": 7 + "i128": { + "hi": 0, + "lo": 2500 + } } }, { "key": { - "symbol": "total_amount" + "symbol": "status" }, "val": { - "i128": { - "hi": 0, - "lo": 5000 - } + "vec": [ + { + "symbol": "Pending" + } + ] } } ] @@ -730,7 +746,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -760,29 +776,24 @@ "key": { "vec": [ { - "symbol": "Config" + "symbol": "Admin" } ] }, "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } + "symbol": "AgentJudge" } ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } } ] @@ -792,7 +803,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -1071,7 +1082,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ] ] @@ -1328,73 +1339,10 @@ "v0": { "topics": [ { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Initialized" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "initialize" + "symbol": "fn_return" + }, + { + "symbol": "initialize" } ], "data": "void" @@ -1442,39 +1390,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1532,39 +1447,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1622,39 +1504,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1712,53 +1561,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "decimals" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "decimals" - } - ], - "data": { - "u32": 7 - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1851,90 +1653,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "deposit: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 5000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Deposit" - } - ], - "data": { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 5000 - } - } - }, - { - "key": { - "symbol": "deposited_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "job_id" - }, - "val": { - "u64": 1 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2008,55 +1726,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" - }, - { - "symbol": "get_expiry" - } - ], - "data": { - "u64": 1 - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "get_expiry" - } - ], - "data": { - "u64": 2592000 - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2182,78 +1851,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "refund: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 5000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Refunded" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "i128": { - "hi": 0, - "lo": 5000 - } - }, - { - "u64": 2592001 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2334,14 +1931,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -2360,65 +1949,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - } - ] + "u32": 2 } }, { @@ -2432,14 +1966,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -2460,14 +1986,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" diff --git a/contracts/escrow/test_snapshots/test/test_refund_by_non_client_panics.1.json b/contracts/escrow/test_snapshots/test/test_refund_by_non_client_panics.1.json index e7a1d3e3..ee892b26 100644 --- a/contracts/escrow/test_snapshots/test/test_refund_by_non_client_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_refund_by_non_client_panics.1.json @@ -487,6 +487,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_refund_reentrant_lock_panics.1.json b/contracts/escrow/test_snapshots/test/test_refund_reentrant_lock_panics.1.json new file mode 100644 index 00000000..66da6acc --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_refund_reentrant_lock_panics.1.json @@ -0,0 +1,1931 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Funded" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "JobLock" + }, + { + "u64": 1 + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "JobLock" + }, + { + "u64": 1 + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 15 + ] + ], + [ + { + "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": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 90000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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" + }, + 150000 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "Escrow initialized with admin: {} and agent_judge: {}" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "create_job: id {} client {} freelancer {}" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "decimals" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "decimals" + } + ], + "data": { + "u32": 7 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "deposit: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Deposit" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "deposited_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "refund" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "refund" + } + ], + "data": { + "error": { + "contract": 23 + } + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 23 + } + } + ], + "data": { + "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 23 + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "refund" + }, + { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 23 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics.1.json index 60a89b4d..047ba501 100644 --- a/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics.1.json @@ -487,6 +487,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics_2.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics_2.1.json new file mode 100644 index 00000000..b3a468a8 --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_release_funds_invalid_index_panics_2.1.json @@ -0,0 +1,1903 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Funded" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "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": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 95000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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" + }, + 150000 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "Escrow initialized with admin: {} and agent_judge: {}" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "create_job: id {} client {} freelancer {}" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "decimals" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "decimals" + } + ], + "data": { + "u32": 7 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "deposit: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Deposit" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "key": { + "symbol": "deposited_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "resolve_dispute" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "resolve_dispute" + } + ], + "data": { + "error": { + "contract": 6 + } + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 6 + } + } + ], + "data": { + "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 6 + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "resolve_dispute" + }, + { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 6 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_out_of_order.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_out_of_order.1.json new file mode 100644 index 00000000..416c4fca --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_release_funds_out_of_order.1.json @@ -0,0 +1,3283 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_funds", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 2 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_funds", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_funds", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "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": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 94000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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" + }, + 150000 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "Escrow initialized with admin: {} and agent_judge: {}" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "create_job: id {} client {} freelancer {}" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "decimals" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "decimals" + } + ], + "data": { + "u32": 7 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "deposit: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 6000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Deposit" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "deposited_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_funds" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "release_funds: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_funds" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_funds" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "release_funds: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_funds" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_funds" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "release_funds: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_funds" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_job" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_job" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Completed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 6000 + } + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_reentrant_lock_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_reentrant_lock_panics.1.json new file mode 100644 index 00000000..890f4bad --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_release_funds_reentrant_lock_panics.1.json @@ -0,0 +1,1945 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Funded" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "JobLock" + }, + { + "u64": 1 + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "JobLock" + }, + { + "u64": 1 + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 15 + ] + ], + [ + { + "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": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 90000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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" + }, + 150000 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "Escrow initialized with admin: {} and agent_judge: {}" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "create_job: id {} client {} freelancer {}" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "decimals" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "decimals" + } + ], + "data": { + "u32": 7 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "deposit: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Deposit" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "deposited_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_funds" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'reentrant job operation: ReentrantCall' from contract function 'Symbol(obj#485)'" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "release_funds" + }, + { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 0 + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_release_funds_twice_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_funds_twice_panics.1.json index d39dda53..096541a1 100644 --- a/contracts/escrow/test_snapshots/test/test_release_funds_twice_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_release_funds_twice_panics.1.json @@ -545,6 +545,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_no_pending_milestones.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_no_pending_milestones.1.json index 4caac09d..3f9763ad 100644 --- a/contracts/escrow/test_snapshots/test/test_release_milestone_no_pending_milestones.1.json +++ b/contracts/escrow/test_snapshots/test/test_release_milestone_no_pending_milestones.1.json @@ -542,6 +542,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_overflow_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_overflow_panics.1.json index 4caac09d..3f9763ad 100644 --- a/contracts/escrow/test_snapshots/test/test_release_milestone_overflow_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_release_milestone_overflow_panics.1.json @@ -542,6 +542,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_reentrancy_guard_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_reentrancy_guard_panics.1.json index fed3fff3..5969560d 100644 --- a/contracts/escrow/test_snapshots/test/test_release_milestone_reentrancy_guard_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_release_milestone_reentrancy_guard_panics.1.json @@ -488,6 +488,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_reentrant_lock_panics.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_reentrant_lock_panics.1.json new file mode 100644 index 00000000..6f5da665 --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_release_milestone_reentrant_lock_panics.1.json @@ -0,0 +1,1931 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Funded" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "JobLock" + }, + { + "u64": 1 + } + ] + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "JobLock" + }, + { + "u64": 1 + } + ] + }, + "durability": "temporary", + "val": { + "bool": true + } + } + }, + "ext": "v0" + }, + 15 + ] + ], + [ + { + "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": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 90000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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" + }, + 150000 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "Escrow initialized with admin: {} and agent_judge: {}" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "create_job: id {} client {} freelancer {}" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "decimals" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "decimals" + } + ], + "data": { + "u32": 7 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "deposit: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Deposit" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "deposited_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "error": { + "contract": 23 + } + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 23 + } + } + ], + "data": { + "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 23 + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "release_milestone" + }, + { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 23 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_sequential_success.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_sequential_success.1.json index 25f0d8e1..bd974d0e 100644 --- a/contracts/escrow/test_snapshots/test/test_release_milestone_sequential_success.1.json +++ b/contracts/escrow/test_snapshots/test/test_release_milestone_sequential_success.1.json @@ -773,6 +773,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -2617,6 +2625,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -3125,6 +3141,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -3633,6 +3657,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_release_milestone_unauthorized_freelancer.1.json b/contracts/escrow/test_snapshots/test/test_release_milestone_unauthorized_freelancer.1.json index e3a21008..37f5a5b3 100644 --- a/contracts/escrow/test_snapshots/test/test_release_milestone_unauthorized_freelancer.1.json +++ b/contracts/escrow/test_snapshots/test/test_release_milestone_unauthorized_freelancer.1.json @@ -487,6 +487,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_released_amount_matches_transferred_on_sequential_release.1.json b/contracts/escrow/test_snapshots/test/test_released_amount_matches_transferred_on_sequential_release.1.json index 730b3442..2b0ec3d7 100644 --- a/contracts/escrow/test_snapshots/test/test_released_amount_matches_transferred_on_sequential_release.1.json +++ b/contracts/escrow/test_snapshots/test/test_released_amount_matches_transferred_on_sequential_release.1.json @@ -773,6 +773,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -2617,6 +2625,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -3125,6 +3141,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -3633,6 +3657,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_resolve_after_deadline_fails.1.json b/contracts/escrow/test_snapshots/test/test_resolve_after_deadline_fails.1.json index 4cecc2e2..0b2dc9f7 100644 --- a/contracts/escrow/test_snapshots/test/test_resolve_after_deadline_fails.1.json +++ b/contracts/escrow/test_snapshots/test/test_resolve_after_deadline_fails.1.json @@ -542,6 +542,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_resolve_before_deadline_succeeds.1.json b/contracts/escrow/test_snapshots/test/test_resolve_before_deadline_succeeds.1.json index 939a0390..d391208a 100644 --- a/contracts/escrow/test_snapshots/test/test_resolve_before_deadline_succeeds.1.json +++ b/contracts/escrow/test_snapshots/test/test_resolve_before_deadline_succeeds.1.json @@ -606,6 +606,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -2312,6 +2320,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_payout_to_freelancer.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_payout_to_freelancer.1.json index d406785e..3713cb34 100644 --- a/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_payout_to_freelancer.1.json +++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_payout_to_freelancer.1.json @@ -607,6 +607,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -2313,6 +2321,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_refund_to_client.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_refund_to_client.1.json index eb3039a8..da8e9d89 100644 --- a/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_refund_to_client.1.json +++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_full_refund_to_client.1.json @@ -608,6 +608,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" @@ -2241,6 +2249,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_invalid_state_panics.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_invalid_state_panics.1.json new file mode 100644 index 00000000..b3a468a8 --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_invalid_state_panics.1.json @@ -0,0 +1,1903 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Funded" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "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": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 95000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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" + }, + 150000 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "Escrow initialized with admin: {} and agent_judge: {}" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "create_job: id {} client {} freelancer {}" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "decimals" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "decimals" + } + ], + "data": { + "u32": 7 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "deposit: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 5000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Deposit" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + }, + { + "key": { + "symbol": "deposited_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "resolve_dispute" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "resolve_dispute" + } + ], + "data": { + "error": { + "contract": 6 + } + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 6 + } + } + ], + "data": { + "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 6 + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "resolve_dispute" + }, + { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + }, + { + "i128": { + "hi": 0, + "lo": 2500 + } + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "contract": 6 + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_panics.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_panics.1.json new file mode 100644 index 00000000..ca3a44e3 --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_panics.1.json @@ -0,0 +1,3608 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_milestone", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "raise_dispute", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "resolve_dispute", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4900 + } + }, + { + "i128": { + "hi": 0, + "lo": 2100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 604800 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Resolved" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "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": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 92100 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 7900 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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" + }, + 150000 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "Escrow initialized with admin: {} and agent_judge: {}" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "create_job: id {} client {} freelancer {}" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "decimals" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "decimals" + } + ], + "data": { + "u32": 7 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "deposit: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Deposit" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "deposited_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "release_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "ReleaseMilestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "u32": 0 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "raise_dispute" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "raise_dispute: job {}" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "DisputeRaised" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 1 + }, + { + "u32": 3 + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "raise_dispute" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_job" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_job" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 604800 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Disputed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "resolve_dispute" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4900 + } + }, + { + "i128": { + "hi": 0, + "lo": 2100 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 4900 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 4900 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 2100 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 2100 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "resolve_dispute: job {} payee {} payer {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4900 + } + }, + { + "i128": { + "hi": 0, + "lo": 2100 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "resolve_dispute" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_job" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_job" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 604800 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Resolved" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 7900 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 92100 + } + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_resolve_dispute_success.1.json b/contracts/escrow/test_snapshots/test/test_resolve_dispute_success.1.json new file mode 100644 index 00000000..ca3a44e3 --- /dev/null +++ b/contracts/escrow/test_snapshots/test/test_resolve_dispute_success.1.json @@ -0,0 +1,3608 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "create_job", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "add_milestone", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "deposit", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "function_name": "transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "release_milestone", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "raise_dispute", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "function_name": "resolve_dispute", + "args": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4900 + } + }, + { + "i128": { + "hi": 0, + "lo": 2100 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "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": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "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": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "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": "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "vec": [ + { + "symbol": "Job" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 604800 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Resolved" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "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": "Config" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 150000 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 92100 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 7900 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "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": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "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" + }, + 150000 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 100000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 100000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "Escrow initialized with admin: {} and agent_judge: {}" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "create_job: id {} client {} freelancer {}" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_job" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "add_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "deposit" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "decimals" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "decimals" + } + ], + "data": { + "u32": 7 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "deposit: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Deposit" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "deposited_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "job_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "deposit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "release_milestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "release_milestone: job {} amount {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "ReleaseMilestone" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "u32": 0 + }, + { + "i128": { + "hi": 0, + "lo": 3000 + } + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "release_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "raise_dispute" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "raise_dispute: job {}" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "DisputeRaised" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u32": 1 + }, + { + "u32": 3 + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "raise_dispute" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_job" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_job" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 604800 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Disputed" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "resolve_dispute" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4900 + } + }, + { + "i128": { + "hi": 0, + "lo": 2100 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 4900 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 4900 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "transfer" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 2100 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 2100 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "resolve_dispute: job {} payee {} payer {}" + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 4900 + } + }, + { + "i128": { + "hi": 0, + "lo": 2100 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "resolve_dispute" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_job" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_job" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "client" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "dispute_deadline" + }, + "val": { + "u64": 604800 + } + }, + { + "key": { + "symbol": "expires_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "freelancer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "milestones" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 4000 + } + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "requires_multisig" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Resolved" + } + ] + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + } + }, + { + "key": { + "symbol": "token_decimals" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 7900 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, + { + "symbol": "balance" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "balance" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 92100 + } + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow/test_snapshots/test/test_token_decimals_stored_on_deposit.1.json b/contracts/escrow/test_snapshots/test/test_token_decimals_stored_on_deposit.1.json index a3e95034..036fca24 100644 --- a/contracts/escrow/test_snapshots/test/test_token_decimals_stored_on_deposit.1.json +++ b/contracts/escrow/test_snapshots/test/test_token_decimals_stored_on_deposit.1.json @@ -487,6 +487,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json b/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json index c7d0397c..50d15040 100644 --- a/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json +++ b/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json @@ -48,28 +48,7 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -276,7 +255,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1033654523790656264 + "nonce": 5541220902715666415 } }, "durability": "temporary" @@ -291,7 +270,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1033654523790656264 + "nonce": 5541220902715666415 } }, "durability": "temporary", @@ -306,10 +285,10 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -321,10 +300,10 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 5541220902715666415 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -435,39 +414,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "key": { - "ledger_key_nonce": { - "nonce": 8370022561469687789 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "key": { - "ledger_key_nonce": { - "nonce": 8370022561469687789 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -521,14 +467,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -547,65 +485,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 500 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Pending" - } - ] - } - } - ] - } - ] + "u32": 2 } }, { @@ -619,14 +502,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -649,22 +524,164 @@ }, { "key": { - "symbol": "token_decimals" + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 0 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "status" }, "val": { - "u32": 7 + "vec": [ + { + "symbol": "Pending" + } + ] } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 + }, + { + "u32": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u64": 1 }, + { + "u32": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ { "key": { - "symbol": "total_amount" + "symbol": "amount" }, "val": { "i128": { "hi": 0, - "lo": 1000 + "lo": 500 } } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } } ] } @@ -672,7 +689,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -702,29 +719,24 @@ "key": { "vec": [ { - "symbol": "Config" + "symbol": "Admin" } ] }, "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } + "symbol": "AgentJudge" } ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } } ] @@ -734,7 +746,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ], [ @@ -1013,7 +1025,7 @@ }, "ext": "v0" }, - 150000 + 4095 ] ] ] @@ -1270,73 +1282,10 @@ "v0": { "topics": [ { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Initialized" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "initialize" + "symbol": "fn_return" + }, + { + "symbol": "initialize" } ], "data": "void" @@ -1384,39 +1333,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1474,39 +1390,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1564,39 +1447,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 500 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1654,53 +1504,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0" - }, - { - "symbol": "decimals" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "04cadb4a570fd2e4652e814101509912cce6c9a2325d6eec8d7100caf859f3e0", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "decimals" - } - ], - "data": { - "u32": 7 - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1793,90 +1596,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "deposit: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 1000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Deposit" - } - ], - "data": { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 1000 - } - } - }, - { - "key": { - "symbol": "deposited_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "job_id" - }, - "val": { - "u64": 1 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -1940,16 +1659,21 @@ "v0": { "topics": [ { - "symbol": "fn_return" - }, - { - "symbol": "release_milestone" + "symbol": "log" } ], "data": { - "error": { - "contract": 3 - } + "vec": [ + { + "string": "caught panic 'only client can release' from contract function 'Symbol(obj#439)'" + }, + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] } } } @@ -1969,12 +1693,12 @@ }, { "error": { - "contract": 3 + "wasm_vm": "invalid_action" } } ], "data": { - "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" + "string": "caught error from function" } } } @@ -1994,7 +1718,7 @@ }, { "error": { - "contract": 3 + "wasm_vm": "invalid_action" } } ], @@ -2036,7 +1760,7 @@ }, { "error": { - "contract": 3 + "wasm_vm": "invalid_action" } } ], diff --git a/contracts/escrow/test_snapshots/test/test_unauthorized_release_funds_by_freelancer_panics.1.json b/contracts/escrow/test_snapshots/test/test_unauthorized_release_funds_by_freelancer_panics.1.json index 91eafa24..7f41d1a6 100644 --- a/contracts/escrow/test_snapshots/test/test_unauthorized_release_funds_by_freelancer_panics.1.json +++ b/contracts/escrow/test_snapshots/test/test_unauthorized_release_funds_by_freelancer_panics.1.json @@ -487,6 +487,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "funded_ledger_seq" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "milestones" diff --git a/contracts/escrow/test_snapshots/test/test_variable_milestone_amounts.1.json b/contracts/escrow/test_snapshots/test/test_variable_milestone_amounts.1.json index de7b545c..51dc9cda 100644 --- a/contracts/escrow/test_snapshots/test/test_variable_milestone_amounts.1.json +++ b/contracts/escrow/test_snapshots/test/test_variable_milestone_amounts.1.json @@ -48,28 +48,7 @@ } ] ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], + [], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", @@ -366,39 +345,6 @@ 6311999 ] ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], [ { "contract_data": { @@ -438,7 +384,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -453,7 +399,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -749,14 +695,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -775,92 +713,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 5000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - } - ] + "u32": 3 } }, { @@ -874,14 +730,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -902,14 +750,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount" @@ -927,82 +767,23 @@ }, "ext": "v0" }, - 150000 + 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": "Config" - } - ] - }, - "val": { - "map": [ - { - "key": { - "symbol": "admin" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, - { - "key": { - "symbol": "agent_judge" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - } - ] - } - } - ] - } - } - } - }, - "ext": "v0" - }, - 150000 - ] - ], - [ - { - "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 0 } ] }, @@ -1015,14 +796,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 + }, + { + "u32": 0 } ] }, @@ -1036,24 +820,20 @@ "val": { "i128": { "hi": 0, - "lo": 90000 + "lo": 2000 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1062,20 +842,23 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -1088,14 +871,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "u64": 1 + }, + { + "u32": 1 } ] }, @@ -1109,24 +895,20 @@ "val": { "i128": { "hi": 0, - "lo": 10000 + "lo": 3000 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1135,20 +917,23 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -1161,14 +946,17 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Milestone" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "u64": 1 + }, + { + "u32": 2 } ] }, @@ -1182,24 +970,20 @@ "val": { "i128": { "hi": 0, - "lo": 0 + "lo": 5000 } } }, { "key": { - "symbol": "authorized" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "clawback" + "symbol": "status" }, "val": { - "bool": false + "vec": [ + { + "symbol": "Released" + } + ] } } ] @@ -1208,13 +992,289 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "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" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AgentJudge" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 90000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 10000 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "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" } @@ -1332,141 +1392,21 @@ [ { "last_modified_ledger_seq": 0, - "data": { - "contract_code": { - "ext": "v0", - "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "code": "" - } - }, - "ext": "v0" - }, - 150000 - ] - ] - ] - }, - "events": [ - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "init_asset" - } - ], - "data": { - "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "init_asset" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "set_admin" - } - ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "set_admin" - }, - { - "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - } - ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "set_admin" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ { "event": { "ext": "v0", @@ -1482,53 +1422,11 @@ "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "mint" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "i128": { - "hi": 0, - "lo": 100000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "mint" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" + "symbol": "init_asset" } ], "data": { - "i128": { - "hi": 0, - "lo": 100000 - } + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000005" } } } @@ -1547,7 +1445,7 @@ "symbol": "fn_return" }, { - "symbol": "mint" + "symbol": "init_asset" } ], "data": "void" @@ -1568,51 +1466,14 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "initialize" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" + "symbol": "set_admin" } ], "data": { - "vec": [ - { - "string": "Escrow initialized with admin: {} and agent_judge: {}" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } } } @@ -1622,30 +1483,23 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "contract", "body": { "v0": { "topics": [ { - "string": "escrow" + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" }, { - "string": "Initialized" + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "u64": 0 - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } } } @@ -1655,7 +1509,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { @@ -1664,7 +1518,7 @@ "symbol": "fn_return" }, { - "symbol": "initialize" + "symbol": "set_admin" } ], "data": "void" @@ -1685,25 +1539,22 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" }, { - "symbol": "create_job" + "symbol": "mint" } ], "data": { "vec": [ - { - "u64": 1 - }, { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" + "i128": { + "hi": 0, + "lo": 100000 + } } ] } @@ -1715,30 +1566,29 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "log" + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "string": "create_job: id {} client {} freelancer {}" - }, - { - "u64": 1 - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] + "i128": { + "hi": 0, + "lo": 100000 + } } } } @@ -1748,7 +1598,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "diagnostic", "body": { "v0": { @@ -1757,7 +1607,7 @@ "symbol": "fn_return" }, { - "symbol": "create_job" + "symbol": "mint" } ], "data": "void" @@ -1781,52 +1631,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "add_milestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 2000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" + "symbol": "initialize" } ], "data": { "vec": [ { - "string": "add_milestone: job {} amount {}" - }, - { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" }, { - "i128": { - "hi": 0, - "lo": 2000 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] } @@ -1846,47 +1660,11 @@ { "symbol": "fn_return" }, - { - "symbol": "add_milestone" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" - }, - { - "symbol": "add_milestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } + { + "symbol": "initialize" + } + ], + "data": "void" } } }, @@ -1895,28 +1673,34 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_job" } ], "data": { "vec": [ { - "string": "add_milestone: job {} amount {}" + "u64": 1 }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "i128": { - "hi": 0, - "lo": 3000 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } ] } @@ -1937,7 +1721,7 @@ "symbol": "fn_return" }, { - "symbol": "add_milestone" + "symbol": "create_job" } ], "data": "void" @@ -1972,7 +1756,7 @@ { "i128": { "hi": 0, - "lo": 5000 + "lo": 2000 } } ] @@ -1991,21 +1775,45 @@ "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_return" + }, + { + "symbol": "add_milestone" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "add_milestone" } ], "data": { "vec": [ - { - "string": "add_milestone: job {} amount {}" - }, { "u64": 1 }, { "i128": { "hi": 0, - "lo": 5000 + "lo": 3000 } } ] @@ -2051,7 +1859,7 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "deposit" + "symbol": "add_milestone" } ], "data": { @@ -2062,7 +1870,7 @@ { "i128": { "hi": 0, - "lo": 10000 + "lo": 5000 } } ] @@ -2081,13 +1889,10 @@ "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + "symbol": "fn_return" }, { - "symbol": "decimals" + "symbol": "add_milestone" } ], "data": "void" @@ -2099,20 +1904,33 @@ { "event": { "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "decimals" + "symbol": "deposit" } ], "data": { - "u32": 7 + "vec": [ + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 10000 + } + } + ] } } } @@ -2211,90 +2029,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "deposit: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 10000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "Deposit" - } - ], - "data": { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 10000 - } - } - }, - { - "key": { - "symbol": "deposited_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "job_id" - }, - "val": { - "u64": 1 - } - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -2411,107 +2145,21 @@ "topics": [ { "symbol": "fn_call" - }, - { - "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" - }, - { - "symbol": "transfer" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "i128": { - "hi": 0, - "lo": 2000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "symbol": "transfer" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" - } - ], - "data": { - "i128": { - "hi": 0, - "lo": 2000 - } - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "transfer" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ + }, + { + "bytes": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73" + }, { - "symbol": "log" + "symbol": "transfer" } ], "data": { "vec": [ { - "string": "release_milestone: job {} amount {}" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" }, { "i128": { @@ -2529,42 +2177,56 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", "type_": "contract", "body": { "v0": { "topics": [ { - "string": "escrow" + "symbol": "transfer" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" }, { - "string": "ReleaseMilestone" + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV" } ], "data": { - "vec": [ - { - "u64": 1 - }, - { - "u32": 0 - }, - { - "i128": { - "hi": 0, - "lo": 2000 - } - }, - { - "u64": 0 - } - ] + "i128": { + "hi": 0, + "lo": 2000 + } } } } }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -2834,78 +2496,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "release_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "ReleaseMilestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "u32": 1 - }, - { - "i128": { - "hi": 0, - "lo": 3000 - } - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -3104,78 +2694,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "log" - } - ], - "data": { - "vec": [ - { - "string": "release_milestone: job {} amount {}" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 5000 - } - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "escrow" - }, - { - "string": "ReleaseMilestone" - } - ], - "data": { - "vec": [ - { - "u64": 1 - }, - { - "u32": 2 - }, - { - "i128": { - "hi": 0, - "lo": 5000 - } - }, - { - "u64": 0 - } - ] - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -3308,14 +2826,6 @@ "u64": 0 } }, - { - "key": { - "symbol": "dispute_deadline" - }, - "val": { - "u64": 0 - } - }, { "key": { "symbol": "expires_at" @@ -3334,92 +2844,10 @@ }, { "key": { - "symbol": "milestones" + "symbol": "milestone_count" }, "val": { - "vec": [ - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 2000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 3000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - }, - { - "map": [ - { - "key": { - "symbol": "amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 5000 - } - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Released" - } - ] - } - } - ] - } - ] + "u32": 3 } }, { @@ -3433,14 +2861,6 @@ } } }, - { - "key": { - "symbol": "requires_multisig" - }, - "val": { - "bool": false - } - }, { "key": { "symbol": "status" @@ -3461,14 +2881,6 @@ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG" } }, - { - "key": { - "symbol": "token_decimals" - }, - "val": { - "u32": 7 - } - }, { "key": { "symbol": "total_amount"