diff --git a/contracts/waveflow-escrow/src/contract.rs b/contracts/waveflow-escrow/src/contract.rs index 69c164c..6b91d51 100644 --- a/contracts/waveflow-escrow/src/contract.rs +++ b/contracts/waveflow-escrow/src/contract.rs @@ -2,7 +2,7 @@ use crate::errors::ContractError; use crate::events::{ ContributorRegisteredEvent, FundedEvent, MergeRecordedEvent, ProgramCreatedEvent, - ProgramPausedEvent, ProgramResumedEvent, + ProgramPausedEvent, ProgramResumedEvent, RatioUpdatedEvent, }; use crate::storage::{ is_pr_processed, mark_pr_processed, next_program_id, read_admin, read_contributor, @@ -263,6 +263,15 @@ impl WaveFlowEscrow { } program.reward_per_point = reward_per_point; write_program(&env, program_id, &program); + + env.events().publish( + (symbol_short!("ratio_upd"),), + RatioUpdatedEvent { + program_id, + reward_per_point, + }, + ); + Ok(()) } diff --git a/contracts/waveflow-escrow/src/events.rs b/contracts/waveflow-escrow/src/events.rs index df0965b..6fca0dc 100644 --- a/contracts/waveflow-escrow/src/events.rs +++ b/contracts/waveflow-escrow/src/events.rs @@ -36,6 +36,13 @@ pub struct MergeRecordedEvent { pub payout_amount: i128, } +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct RatioUpdatedEvent { + pub program_id: u64, + pub reward_per_point: i128, +} + #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] pub struct ProgramPausedEvent { diff --git a/contracts/waveflow-escrow/src/test.rs b/contracts/waveflow-escrow/src/test.rs index eb7123b..c953402 100644 --- a/contracts/waveflow-escrow/src/test.rs +++ b/contracts/waveflow-escrow/src/test.rs @@ -151,3 +151,85 @@ fn insufficient_escrow_rejects_payout() { let err = client.try_record_merge(&gateway, &program_id, &username, &1, &1); assert!(err.is_err()); } + +#[test] +fn set_ratio_updates_reward_per_point() { + let env = Env::default(); + let (contract_id, _, maintainer, _, _) = setup(&env); + let client = WaveFlowEscrowClient::new(&env, &contract_id); + + let repo = Symbol::new(&env, "org/repo"); + let program_id = client.create_program(&maintainer, &repo, &10, &None); + + client.set_ratio(&program_id, &maintainer, &50); + let program = client.get_program(&program_id); + assert_eq!(program.reward_per_point, 50); +} + +#[test] +fn set_ratio_rejects_zero() { + let env = Env::default(); + let (contract_id, _, maintainer, _, _) = setup(&env); + let client = WaveFlowEscrowClient::new(&env, &contract_id); + + let repo = Symbol::new(&env, "org/repo"); + let program_id = client.create_program(&maintainer, &repo, &10, &None); + + let err = client.try_set_ratio(&program_id, &maintainer, &0); + assert!(err.is_err()); +} + +#[test] +fn set_ratio_rejects_negative() { + let env = Env::default(); + let (contract_id, _, maintainer, _, _) = setup(&env); + let client = WaveFlowEscrowClient::new(&env, &contract_id); + + let repo = Symbol::new(&env, "org/repo"); + let program_id = client.create_program(&maintainer, &repo, &10, &None); + + let err = client.try_set_ratio(&program_id, &maintainer, &-1); + assert!(err.is_err()); +} + +#[test] +fn set_ratio_rejects_non_maintainer() { + let env = Env::default(); + let (contract_id, _, maintainer, contributor_wallet, _) = setup(&env); + let client = WaveFlowEscrowClient::new(&env, &contract_id); + + let repo = Symbol::new(&env, "org/repo"); + let program_id = client.create_program(&maintainer, &repo, &10, &None); + + let err = client.try_set_ratio(&program_id, &contributor_wallet, &100); + assert!(err.is_err()); +} + +#[test] +fn withdraw_remaining_fails_when_active() { + let env = Env::default(); + let (contract_id, _, maintainer, _, _) = setup(&env); + let client = WaveFlowEscrowClient::new(&env, &contract_id); + + let repo = Symbol::new(&env, "org/repo"); + let program_id = client.create_program(&maintainer, &repo, &10, &None); + client.fund(&program_id, &maintainer, &500); + + let err = client.try_withdraw_remaining(&program_id, &maintainer); + assert!(err.is_err()); +} + +#[test] +fn withdraw_remaining_rejects_non_maintainer() { + let env = Env::default(); + let (contract_id, _, maintainer, contributor_wallet, _) = setup(&env); + let client = WaveFlowEscrowClient::new(&env, &contract_id); + + let repo = Symbol::new(&env, "org/repo"); + let program_id = client.create_program(&maintainer, &repo, &10, &None); + client.fund(&program_id, &maintainer, &500); + client.pause(&program_id, &maintainer); + + let err = client.try_withdraw_remaining(&program_id, &contributor_wallet); + assert!(err.is_err()); +}