diff --git a/contracts/escrow_contract/lib.rs b/contracts/escrow_contract/lib.rs index acb1fdd..4be39df 100644 --- a/contracts/escrow_contract/lib.rs +++ b/contracts/escrow_contract/lib.rs @@ -87,6 +87,32 @@ pub struct FeeUpdated { pub new_fee: u32, } +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum EscrowState { + Pending, + Released, + Refunded, + Paused, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct EscrowRecord { + pub sender: Address, + pub driver: Address, + pub token: Address, + pub amount: i128, + pub status: EscrowState, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum DisputeFavour { + Sender, + Driver, +} + #[contract] pub struct EscrowContract; @@ -322,7 +348,7 @@ impl EscrowContract { &record.sender, &record.amount, ); - record.status = EscrowStatus::Refunded; + record.status = EscrowState::Refunded; save_escrow(&env, delivery_id, &record); env.events().publish( (events::escrow_refunded(&env), delivery_id), @@ -396,10 +422,12 @@ impl EscrowContract { ); record.status = EscrowStatus::Refunded; } + save_escrow(&env, delivery_id, &record); + env.events().publish( (events::dispute_resolved(&env), delivery_id), - (release_to_driver, caller), + (favour, admin), ); } @@ -415,5 +443,29 @@ impl EscrowContract { } } +fn load_escrow(env: &Env, delivery_id: u64) -> EscrowRecord { + env.storage() + .persistent() + .get(&DataKey::Escrow(delivery_id)) + .expect("Escrow not found") +} + +fn save_escrow(env: &Env, delivery_id: u64, record: &EscrowRecord) { + let key = DataKey::Escrow(delivery_id); + env.storage().persistent().set(&key, record); + env.storage().persistent().extend_ttl( + &key, + constants::ESCROW_TTL_THRESHOLD, + constants::ESCROW_TTL_EXTEND_TO, + ); +} + +fn require_admin(env: &Env, caller: &Address) { + let admin: Address = env.storage().instance().get(&DataKey::Admin).unwrap(); + if *caller != admin { + panic!("Unauthorized"); + } +} + #[cfg(test)] mod test; diff --git a/contracts/escrow_contract/test.rs b/contracts/escrow_contract/test.rs index 32bd28c..f20189b 100644 --- a/contracts/escrow_contract/test.rs +++ b/contracts/escrow_contract/test.rs @@ -2,7 +2,7 @@ use super::*; use soroban_sdk::{ testutils::Address as _, token::{Client as TokenClient, StellarAssetClient}, - Address, Env, + Address, Env, IntoVal, }; fn setup_env() -> (Env, Address) {