diff --git a/SECURITY.md b/SECURITY.md index f32923dc..99da6c73 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -128,6 +128,8 @@ The vault performs USDC transfers to configurable counterpart addresses on every - [ ] Minimum deposit requirements enforced - [ ] Maximum deduction limits enforced - [x] Revenue pool transfers validated +- [x] Settlement developer address required when routing to specific developer. +- [x] Settlement developer address must be None when routing to global pool. - [ ] Batch operations respect individual limits ### Revenue Pool Security Assumptions diff --git a/contracts/settlement/src/lib.rs b/contracts/settlement/src/lib.rs index cf5b502f..aba49005 100644 --- a/contracts/settlement/src/lib.rs +++ b/contracts/settlement/src/lib.rs @@ -121,6 +121,9 @@ impl CalloraSettlement { } let inst = env.storage().instance(); if to_pool { + if developer.is_some() { + panic!("developer address must be None when to_pool=true"); + } let mut global_pool = Self::get_global_pool(env.clone()); global_pool.total_balance = global_pool .total_balance diff --git a/contracts/settlement/src/test.rs b/contracts/settlement/src/test.rs index 7b2f91e0..75c213de 100644 --- a/contracts/settlement/src/test.rs +++ b/contracts/settlement/src/test.rs @@ -590,6 +590,21 @@ mod settlement_tests { client.receive_payment(&vault, &100i128, &false, &None); } + #[test] + #[should_panic(expected = "developer address must be None when to_pool=true")] + fn test_receive_payment_pool_true_with_developer() { + let env = Env::default(); + env.mock_all_auths(); + let admin = Address::generate(&env); + let vault = Address::generate(&env); + let developer = Address::generate(&env); + let addr = env.register(CalloraSettlement, ()); + let client = CalloraSettlementClient::new(&env, &addr); + client.init(&admin, &vault); + + client.receive_payment(&vault, &100i128, &true, &Some(developer)); + } + #[test] fn test_receive_payment_authorization_matrix() { enum CallerRole {