From 6daa57bab2e7b1eda910b0945b5d59220fe62381 Mon Sep 17 00:00:00 2001 From: Elliot Clement Date: Sun, 31 May 2026 23:08:59 +0000 Subject: [PATCH] fix: terminal transition --- contracts/escrow/src/lib.rs | 10 ++++++++ contracts/escrow/src/tests.rs | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/contracts/escrow/src/lib.rs b/contracts/escrow/src/lib.rs index 325efe4..9f79ec4 100644 --- a/contracts/escrow/src/lib.rs +++ b/contracts/escrow/src/lib.rs @@ -643,6 +643,16 @@ impl EscrowContract { Ok(depositors * m.stake_amount) } + /// Return the ledger interval between match creation and terminal completion/cancellation. + pub fn get_match_duration(env: Env, match_id: u64) -> Result, Error> { + let m: Match = env + .storage() + .persistent() + .get(&DataKey::Match(match_id)) + .ok_or(Error::MatchNotFound)?; + Ok(m.completed_ledger.map(|completed| completed.saturating_sub(m.created_ledger))) + } + /// Return all matches that are in Active state (fully funded). pub fn get_live_matches(env: Env) -> Result, Error> { let mut live_matches = soroban_sdk::vec![&env]; diff --git a/contracts/escrow/src/tests.rs b/contracts/escrow/src/tests.rs index a060b26..bfbc0d0 100644 --- a/contracts/escrow/src/tests.rs +++ b/contracts/escrow/src/tests.rs @@ -1654,6 +1654,53 @@ fn test_cancel_match_sets_completed_ledger() { assert!(completed >= ledger_before && completed <= ledger_after); } +#[test] +fn test_get_match_duration_after_cancelled_match() { + let (env, contract_id, _oracle, player1, player2, token, _admin) = setup(); + let client = EscrowContractClient::new(&env, &contract_id); + + let id = client.create_match( + &player1, + &player2, + &100, + &token, + &String::from_str(&env, "duration_cancel_test"), + &Platform::Lichess, + ); + + client.cancel_match(&id, &player1); + let duration = client.get_match_duration(&id).unwrap(); + let m = client.get_match(&id); + + assert_eq!(duration, Some(m.completed_ledger.unwrap().saturating_sub(m.created_ledger))); + assert!(duration.is_some()); +} + +#[test] +fn test_get_match_duration_after_completion() { + let (env, contract_id, oracle, player1, player2, token, _admin) = setup(); + let client = EscrowContractClient::new(&env, &contract_id); + + let id = client.create_match( + &player1, + &player2, + &100, + &token, + &String::from_str(&env, "duration_complete_test"), + &Platform::Lichess, + ); + + client.deposit(&id, &player1); + client.deposit(&id, &player2); + client.submit_result(&id, &Winner::Player1, &oracle); + + let duration = client.get_match_duration(&id).unwrap(); + let m = client.get_match(&id); + + assert_eq!(duration, Some(m.completed_ledger.unwrap().saturating_sub(m.created_ledger))); + assert!(duration.is_some()); +} + #[test] fn test_expire_match_sets_completed_ledger() { let (env, contract_id, _oracle, player1, player2, token, _admin) = setup();