From c4ed7b912b91f24ae9bb6d57a48fb1218996c808 Mon Sep 17 00:00:00 2001 From: Zac Lou <97340247+ZacLou@users.noreply.github.com> Date: Fri, 28 Aug 2026 07:45:18 +0800 Subject: [PATCH 1/3] feat: add RatioUpdatedEvent (part of #12) --- contracts/waveflow-escrow/src/events.rs | 7 +++++++ 1 file changed, 7 insertions(+) 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 { From 3dd47f1245b5cbef3653340f870f7e39f2b96fc8 Mon Sep 17 00:00:00 2001 From: Zac Lou <97340247+ZacLou@users.noreply.github.com> Date: Fri, 28 Aug 2026 07:45:21 +0800 Subject: [PATCH 2/3] feat: emit RatioUpdatedEvent in set_ratio (#12) --- contracts/waveflow-escrow/src/contract.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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(()) } From 12e5c632ad0f602c9363c313ee43b84b38c2c03b Mon Sep 17 00:00:00 2001 From: Zac Lou <97340247+ZacLou@users.noreply.github.com> Date: Fri, 28 Aug 2026 07:45:23 +0800 Subject: [PATCH 3/3] test: add set_ratio and withdraw_remaining tests (#11) --- contracts/waveflow-escrow/src/test.rs | 82 +++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) 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()); +}