diff --git a/contracts/escrow/src/lib.rs b/contracts/escrow/src/lib.rs index bcf985c8..11dfcbcd 100644 --- a/contracts/escrow/src/lib.rs +++ b/contracts/escrow/src/lib.rs @@ -1,6 +1,6 @@ #![no_std] -use soroban_sdk::{contract, contractimpl, contracttype, token, Address, Env, Vec}; +use soroban_sdk::{contract, contracterror, contractimpl, contracttype, token, Address, Env, Vec}; #[contracttype] #[derive(Clone, Debug, PartialEq)] @@ -49,6 +49,34 @@ pub enum DataKey { AgentJudge, } +#[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, +} + +#[contracterror] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum EscrowError { + AlreadyInitialized = 1, + NotInitialized = 2, + Unauthorized = 3, + InvalidInput = 4, + JobNotFound = 5, + InvalidState = 6, + AmountMismatch = 7, +} + #[contracttype] #[derive(Clone)] pub struct DisputeRaisedEvent { @@ -59,32 +87,74 @@ pub struct DisputeRaisedEvent { pub raised_at: u64, } +#[contracttype] +#[derive(Clone)] +pub struct DepositEvent { + pub job_id: u64, + pub amount: i128, + pub deposited_at: u64, +} + #[contract] pub struct EscrowContract; #[contractimpl] impl EscrowContract { - pub fn initialize(env: Env, admin: Address, agent_judge: Address) { + pub fn initialize(env: Env, admin: Address, agent_judge: Address) -> Result<(), EscrowError> { + // Prevent double initialization if env.storage().instance().has(&DataKey::Admin) { - panic!("already initialized"); + return Err(EscrowError::AlreadyInitialized); } + + // 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); + + // Emit an initialization event for off-chain consumers and logging + let event = EscrowInitializedEvent { + admin: admin.clone(), + agent_judge: agent_judge.clone(), + initialized_at: env.ledger().timestamp(), + }; + env.events().publish(("escrow", "Initialized"), event); + + Ok(()) } /// Admin can update the Agent Judge address. - pub fn set_agent_judge(env: Env, new_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 .storage() .instance() .get(&DataKey::Admin) - .expect("not initialized"); + .ok_or(EscrowError::NotInitialized)?; + // This will panic with Soroban auth error if the signer isn't present; keep that behavior admin.require_auth(); + + if admin == new_agent_judge { + return Err(EscrowError::InvalidInput); + } + env.storage() .instance() .set(&DataKey::AgentJudge, &new_agent_judge); + + // Emit an event for off-chain logging and debugging + let evt = AgentJudgeUpdatedEvent { + old_agent: admin.clone(), + new_agent: new_agent_judge.clone(), + updated_at: env.ledger().timestamp(), + }; + env.events().publish(("escrow", "AgentJudgeUpdated"), evt); + + Ok(()) } /// Client creates a job entry in Setup phase. @@ -133,32 +203,56 @@ impl EscrowContract { } /// Client deposits total amount and transitions job to Funded. - pub fn deposit(env: Env, job_id: u64, amount: i128) { + pub fn deposit(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)?; + + // Caller must be client job.client.require_auth(); - assert!( - job.status == EscrowStatus::Setup, - "already funded or invalid state" - ); - assert!(amount > 0, "amount must be > 0"); - assert!(!job.milestones.is_empty(), "no milestones defined"); + + // Only allow deposit in Setup state + if job.status != EscrowStatus::Setup { + return Err(EscrowError::InvalidState); + } + + if amount <= 0 { + return Err(EscrowError::InvalidInput); + } + + if job.milestones.is_empty() { + return Err(EscrowError::InvalidInput); + } let mut total_milestones_amount = 0i128; for m in job.milestones.iter() { - total_milestones_amount += m.amount; + total_milestones_amount = total_milestones_amount.saturating_add(m.amount); + } + + if total_milestones_amount != amount { + return Err(EscrowError::AmountMismatch); } - assert!( - total_milestones_amount == amount, - "sum of milestones must equal total amount" - ); + // Transfer tokens from client to contract let token_client = token::Client::new(&env, &job.token); token_client.transfer(&job.client, &env.current_contract_address(), &amount); job.total_amount = amount; job.status = EscrowStatus::Funded; env.storage().persistent().set(&key, &job); + + // Emit deposit event for off-chain logging + let evt = DepositEvent { + job_id, + amount, + deposited_at: env.ledger().timestamp(), + }; + env.events().publish(("escrow", "Deposit"), evt); + + Ok(()) } /// Client approves a milestone -- releases next pending milestone to freelancer. @@ -520,7 +614,8 @@ mod test { } #[test] - #[should_panic(expected = "already initialized")] + // AlreadyInitialized surfaces as host error code #1 + #[should_panic(expected = "Error(Contract, #1)")] fn test_double_init() { let env = Env::default(); env.mock_all_auths(); @@ -638,7 +733,8 @@ mod test { } #[test] - #[should_panic(expected = "sum of milestones must equal total amount")] + // Amount mismatch 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(); @@ -657,11 +753,14 @@ mod test { cc.initialize(&admin, &agent_judge); cc.create_job(&1u64, &client, &freelancer, &token_addr); cc.add_milestone(&1u64, &500i128); - cc.deposit(&1u64, &1000i128); // Should panic as 500 != 1000 + // Should Err as 500 != 1000; the Soroban test client surfaces contract + // errors as host panics, so call directly and let the test expect a panic. + cc.deposit(&1u64, &1000i128); } #[test] - #[should_panic(expected = "no milestones defined")] + // No milestones -> InvalidInput surfaces as host error code #4 + #[should_panic(expected = "Error(Contract, #4)")] fn test_deposit_no_milestones_panics() { let env = Env::default(); env.mock_all_auths(); 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 78713650..9bc1f3a9 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 @@ -852,6 +852,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -978,24 +1026,16 @@ "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_return" + }, + { + "symbol": "deposit" } ], "data": { - "vec": [ - { - "string": "caught panic 'no milestones defined' from contract function 'Symbol(deposit)'" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 1000 - } - } - ] + "error": { + "contract": 4 + } } } } @@ -1015,12 +1055,12 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 4 } } ], "data": { - "string": "caught error from function" + "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" } } } @@ -1040,7 +1080,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 4 } } ], @@ -1085,7 +1125,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 4 } } ], 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 6a7cb177..c371d786 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 @@ -938,6 +938,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -1121,24 +1169,16 @@ "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_return" + }, + { + "symbol": "deposit" } ], "data": { - "vec": [ - { - "string": "caught panic 'sum of milestones must equal total amount' from contract function 'Symbol(deposit)'" - }, - { - "u64": 1 - }, - { - "i128": { - "hi": 0, - "lo": 1000 - } - } - ] + "error": { + "contract": 7 + } } } } @@ -1158,12 +1198,12 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 7 } } ], "data": { - "string": "caught error from function" + "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" } } } @@ -1183,7 +1223,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 7 } } ], @@ -1228,7 +1268,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 7 } } ], 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 0760ff74..48184796 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 @@ -1599,6 +1599,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -2036,6 +2084,57 @@ }, "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", 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 80b237c1..491edfd0 100644 --- a/contracts/escrow/test_snapshots/test/test_double_init.1.json +++ b/contracts/escrow/test_snapshots/test/test_double_init.1.json @@ -131,6 +131,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000003", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -194,21 +242,16 @@ "v0": { "topics": [ { - "symbol": "log" + "symbol": "fn_return" + }, + { + "symbol": "initialize" } ], "data": { - "vec": [ - { - "string": "caught panic 'already initialized' from contract function 'Symbol(obj#23)'" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] + "error": { + "contract": 1 + } } } } @@ -228,12 +271,12 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 1 } } ], "data": { - "string": "caught error from function" + "string": "escalating Ok(ScErrorType::Contract) frame-exit to Err" } } } @@ -253,7 +296,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 1 } } ], @@ -295,7 +338,7 @@ }, { "error": { - "wasm_vm": "invalid_action" + "contract": 1 } } ], 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 44c62946..868d4ece 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 @@ -1659,6 +1659,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -2096,6 +2144,57 @@ }, "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", 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 3b726ff1..c9fc5cad 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 @@ -1506,6 +1506,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -1886,6 +1934,57 @@ }, "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", 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 1c78d0bc..a521dc44 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 @@ -1318,6 +1318,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -1698,6 +1746,57 @@ }, "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", diff --git a/contracts/escrow/test_snapshots/test/test_refund.1.json b/contracts/escrow/test_snapshots/test/test_refund.1.json index 1e496892..b5ae0d2d 100644 --- a/contracts/escrow/test_snapshots/test/test_refund.1.json +++ b/contracts/escrow/test_snapshots/test/test_refund.1.json @@ -1235,6 +1235,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -1558,6 +1606,57 @@ }, "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", 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 d031baef..1e69ebcf 100644 --- a/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json +++ b/contracts/escrow/test_snapshots/test/test_unauthorized_release.1.json @@ -1178,6 +1178,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -1501,6 +1549,57 @@ }, "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", @@ -1570,7 +1669,7 @@ "data": { "vec": [ { - "string": "caught panic 'only client can release' from contract function 'Symbol(obj#447)'" + "string": "caught panic 'only client can release' from contract function 'Symbol(obj#473)'" }, { "u64": 1 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 b431dcb3..b836e5f4 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 @@ -1506,6 +1506,54 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "escrow" + }, + { + "string": "Initialized" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "admin" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "agent_judge" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "initialized_at" + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -1886,6 +1934,57 @@ }, "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",