From f5ccbef2e754f32ee0da032c2f47a333fdc222a3 Mon Sep 17 00:00:00 2001 From: silentgeckoaudit3801 Date: Thu, 23 Jul 2026 14:45:03 -0600 Subject: [PATCH 1/3] feat: add emergency withdraw event --- contracts/lending_pool/src/events.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/lending_pool/src/events.rs b/contracts/lending_pool/src/events.rs index 4c4219af..7326e7a5 100644 --- a/contracts/lending_pool/src/events.rs +++ b/contracts/lending_pool/src/events.rs @@ -11,6 +11,11 @@ pub fn withdraw(env: &Env, provider: Address, token: Address, amount: i128, shar env.events().publish(topics, (amount, shares_burned)); } +pub fn emergency_withdraw(env: &Env, provider: Address, token: Address, shares_burned: i128) { + let topics = (Symbol::new(env, "EmergencyWithdraw"), provider, token); + env.events().publish(topics, shares_burned); +} + #[allow(dead_code)] pub fn yield_distributed(env: &Env, token: Address, amount: i128) { if amount > 0 { From 24767e9739653e43b05242ddb5472e4d6db29948 Mon Sep 17 00:00:00 2001 From: silentgeckoaudit3801 Date: Thu, 23 Jul 2026 14:45:04 -0600 Subject: [PATCH 2/3] feat: emit emergency withdraw event --- contracts/lending_pool/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contracts/lending_pool/src/lib.rs b/contracts/lending_pool/src/lib.rs index 7c1660e6..12b8570f 100644 --- a/contracts/lending_pool/src/lib.rs +++ b/contracts/lending_pool/src/lib.rs @@ -620,7 +620,9 @@ impl LendingPool { shares: i128, ) -> Result<(), PoolError> { provider.require_auth(); - Self::redeem_shares(&env, &provider, &token, shares) + Self::redeem_shares(&env, &provider, &token, shares)?; + events::emergency_withdraw(&env, provider, token, shares); + Ok(()) } // ── Cooldown views ──────────────────────────────────────────────────── From 94f6fc7bf08e9486a51c3172dc5f897b94ba2a0b Mon Sep 17 00:00:00 2001 From: silentgeckoaudit3801 Date: Thu, 23 Jul 2026 14:45:05 -0600 Subject: [PATCH 3/3] test: cover emergency withdraw event --- contracts/lending_pool/src/test.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/contracts/lending_pool/src/test.rs b/contracts/lending_pool/src/test.rs index 59c595ec..0dd2aa2f 100644 --- a/contracts/lending_pool/src/test.rs +++ b/contracts/lending_pool/src/test.rs @@ -396,6 +396,35 @@ fn test_emergency_withdraw_bypasses_pause_and_cooldown() { assert_eq!(token_client.balance(&pool_id), 0); } +#[test] +fn test_emergency_withdraw_emits_distinct_event() { + let env = Env::default(); + env.mock_all_auths(); + + let token_admin = Address::generate(&env); + let (token_id, stellar_asset_client, _token_client) = create_token_contract(&env, &token_admin); + + let pool_id = env.register(LendingPool, ()); + let pool_client = LendingPoolClient::new(&env, &pool_id); + pool_client.initialize(&token_admin); + pool_client.set_withdrawal_cooldown(&100); + + let provider = Address::generate(&env); + stellar_asset_client.mint(&provider, &5_000); + pool_client.deposit(&provider, &token_id, &1_500); + + pool_client.pause(); + pool_client.emergency_withdraw(&provider, &token_id, &500); + + let events = env.events().all(); + let has_emergency_event = events.iter().any(|event| { + let first_topic = event.1.get(0).unwrap(); + soroban_sdk::Symbol::from_val(&env, &first_topic) + == soroban_sdk::Symbol::new(&env, "EmergencyWithdraw") + }); + + assert!(has_emergency_event); +} // ── Deposit / Withdraw invariants ───────────────────────────────────────────── #[test]