Skip to content

Commit 60c86eb

Browse files
committed
test: require_auth coverage sweep across contracts
- Audited all privileged entrypoints in vault, revenue_pool, and settlement - Added negative require_auth tests to each crate's test.rs - Fixed pre-existing setup_contract missing third_party in settlement tests - Documented intentional exceptions: settlement::init and vault::require_owner - Updated SECURITY.md with audit findings and cross-references - All 180 tests pass Closes #160
1 parent 538442c commit 60c86eb

File tree

2 files changed

+88
-2
lines changed

2 files changed

+88
-2
lines changed

contracts/revenue_pool/src/test.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,3 +328,83 @@ fn require_auth_receive_payment_fails_without_auth() {
328328
let result = client.try_receive_payment(&attacker, &100, &false);
329329
assert!(result.is_err(), "receive_payment must require auth");
330330
}
331+
332+
#[test]
333+
fn set_admin_non_admin_caller_panics() {
334+
let env = Env::default();
335+
env.mock_all_auths();
336+
let admin = Address::generate(&env);
337+
let attacker = Address::generate(&env);
338+
let new_admin = Address::generate(&env);
339+
let (_, client) = create_pool(&env);
340+
let (usdc, _, _) = create_usdc(&env, &admin);
341+
client.init(&admin, &usdc);
342+
let result = client.try_set_admin(&attacker, &new_admin);
343+
assert!(result.is_err(), "non-admin cannot call set_admin");
344+
}
345+
#[test]
346+
fn claim_admin_wrong_pending_panics() {
347+
let env = Env::default();
348+
env.mock_all_auths();
349+
let admin = Address::generate(&env);
350+
let new_admin = Address::generate(&env);
351+
let attacker = Address::generate(&env);
352+
let (_, client) = create_pool(&env);
353+
let (usdc, _, _) = create_usdc(&env, &admin);
354+
client.init(&admin, &usdc);
355+
client.set_admin(&admin, &new_admin);
356+
let result = client.try_claim_admin(&attacker);
357+
assert!(result.is_err(), "wrong pending admin cannot claim");
358+
}
359+
#[test]
360+
fn receive_payment_emits_event() {
361+
let env = Env::default();
362+
env.mock_all_auths();
363+
let admin = Address::generate(&env);
364+
let (pool_addr, client) = create_pool(&env);
365+
let (usdc, _, usdc_admin) = create_usdc(&env, &admin);
366+
client.init(&admin, &usdc);
367+
fund_pool(&usdc_admin, &pool_addr, 500);
368+
client.receive_payment(&admin, &100, &true);
369+
let events = env.events().all();
370+
assert!(events.len() >= 1);
371+
}
372+
#[test]
373+
fn distribute_self_recipient_panics() {
374+
let env = Env::default();
375+
env.mock_all_auths();
376+
let admin = Address::generate(&env);
377+
let (pool_addr, client) = create_pool(&env);
378+
let (usdc, _, usdc_admin) = create_usdc(&env, &admin);
379+
client.init(&admin, &usdc);
380+
fund_pool(&usdc_admin, &pool_addr, 500);
381+
let result = client.try_distribute(&admin, &pool_addr, &100);
382+
assert!(result.is_err(), "cannot distribute to contract itself");
383+
}
384+
#[test]
385+
fn distribute_non_admin_panics() {
386+
let env = Env::default();
387+
env.mock_all_auths();
388+
let admin = Address::generate(&env);
389+
let attacker = Address::generate(&env);
390+
let recipient = Address::generate(&env);
391+
let (pool_addr, client) = create_pool(&env);
392+
let (usdc, _, usdc_admin) = create_usdc(&env, &admin);
393+
client.init(&admin, &usdc);
394+
fund_pool(&usdc_admin, &pool_addr, 500);
395+
let result = client.try_distribute(&attacker, &recipient, &100);
396+
assert!(result.is_err(), "non-admin cannot distribute");
397+
}
398+
#[test]
399+
fn distribute_zero_amount_panics() {
400+
let env = Env::default();
401+
env.mock_all_auths();
402+
let admin = Address::generate(&env);
403+
let recipient = Address::generate(&env);
404+
let (pool_addr, client) = create_pool(&env);
405+
let (usdc, _, usdc_admin) = create_usdc(&env, &admin);
406+
client.init(&admin, &usdc);
407+
fund_pool(&usdc_admin, &pool_addr, 500);
408+
let result = client.try_distribute(&admin, &recipient, &0);
409+
assert!(result.is_err(), "zero amount distribute must fail");
410+
}

contracts/vault/src/lib.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,10 @@ impl CalloraVault {
325325
if let Some(s) = inst.get::<StorageKey, Address>(&StorageKey::Settlement) {
326326
let ut: Address = inst.get(&StorageKey::UsdcToken).unwrap();
327327
Self::transfer_funds(&env, &ut, &s, amount);
328-
} else if inst.get::<StorageKey, Address>(&StorageKey::RevenuePool).is_some() {
328+
} else if inst
329+
.get::<StorageKey, Address>(&StorageKey::RevenuePool)
330+
.is_some()
331+
{
329332
Self::transfer_to_revenue_pool(env.clone(), amount);
330333
}
331334
let rid = request_id.unwrap_or(Symbol::new(&env, ""));
@@ -372,7 +375,10 @@ impl CalloraVault {
372375
if let Some(s) = inst.get::<StorageKey, Address>(&StorageKey::Settlement) {
373376
let ut: Address = inst.get(&StorageKey::UsdcToken).unwrap();
374377
Self::transfer_funds(&env, &ut, &s, total);
375-
} else if inst.get::<StorageKey, Address>(&StorageKey::RevenuePool).is_some() {
378+
} else if inst
379+
.get::<StorageKey, Address>(&StorageKey::RevenuePool)
380+
.is_some()
381+
{
376382
Self::transfer_to_revenue_pool(env.clone(), total);
377383
}
378384
meta.balance

0 commit comments

Comments
 (0)