From f1fabcf8e3168057c55a8279a1378b871c8b1e0f Mon Sep 17 00:00:00 2001 From: binarybaron <86064887+binarybaron@users.noreply.github.com> Date: Wed, 13 Nov 2024 15:33:27 +0100 Subject: [PATCH] fix(asb): Accept cooperative redeem request in both AliceState::BtcPunishable and AliceState::BtcPunished (#156) Alice will accept a cooperative redeem request in both `AliceState::BtcPunishable` and `AliceState::BtcPunished` states. This allows Bob to request a cooperative redeem even if `tx_punish` has not been confirmed yet. --- swap/src/asb/event_loop.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/swap/src/asb/event_loop.rs b/swap/src/asb/event_loop.rs index 117d68ee..efee8b4c 100644 --- a/swap/src/asb/event_loop.rs +++ b/swap/src/asb/event_loop.rs @@ -327,6 +327,7 @@ where let swap_peer = self.db.get_peer_id(swap_id).await; let swap_state = self.db.get_state(swap_id).await; + // If we do not find the swap in the database, or we do not have a peer-id for it, reject let (swap_peer, swap_state) = match (swap_peer, swap_state) { (Ok(peer), Ok(state)) => (peer, state), _ => { @@ -343,6 +344,7 @@ where } }; + // If the peer is not the one associated with the swap, reject if swap_peer != peer { tracing::warn!( swap_id = %swap_id, @@ -357,7 +359,10 @@ where continue; } - let State::Alice (AliceState::BtcPunished { state3 }) = swap_state else { + // If we are in either of these states, the punish timelock has expired + // Bob cannot refund the Bitcoin anymore. We can publish tx_punish to redeem the Bitcoin. + // Therefore it is safe to reveal s_a to let him redeem the Monero + let State::Alice (AliceState::BtcPunished { state3 } | AliceState::BtcPunishable { state3, .. }) = swap_state else { tracing::warn!( swap_id = %swap_id, reason = "swap is in invalid state",