From babd1d7b609454b2f403903d5e9b76dfb2222dfb Mon Sep 17 00:00:00 2001 From: Daniel Karzel Date: Tue, 16 Feb 2021 16:00:27 +1100 Subject: [PATCH] Wait for refund if insufficient Monero is locked up --- swap/src/protocol/bob/state.rs | 15 +++++++++------ swap/src/protocol/bob/swap.rs | 11 ++++++++++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/swap/src/protocol/bob/state.rs b/swap/src/protocol/bob/state.rs index aa32b5e4..83780a9b 100644 --- a/swap/src/protocol/bob/state.rs +++ b/swap/src/protocol/bob/state.rs @@ -7,7 +7,7 @@ use crate::{ }, execution_params::ExecutionParams, monero, - monero::{monero_private_key, TransferProof}, + monero::{monero_private_key, InsufficientFunds, TransferProof}, protocol::{ alice::{Message1, Message3}, bob::{EncryptedSignature, Message0, Message2, Message4}, @@ -310,7 +310,7 @@ impl State3 { xmr_wallet: &W, transfer_proof: TransferProof, monero_wallet_restore_blockheight: u32, - ) -> Result + ) -> Result> where W: monero::WatchForTransfer, { @@ -319,7 +319,7 @@ impl State3 { )); let S = self.S_a_monero + S_b_monero; - xmr_wallet + if let Err(e) = xmr_wallet .watch_for_transfer( S, self.v.public(), @@ -327,9 +327,12 @@ impl State3 { self.xmr, self.min_monero_confirmations, ) - .await?; + .await + { + return Ok(Err(e)); + } - Ok(State4 { + Ok(Ok(State4 { A: self.A, b: self.b, s_b: self.s_b, @@ -343,7 +346,7 @@ impl State3 { tx_cancel_sig_a: self.tx_cancel_sig_a, tx_refund_encsig: self.tx_refund_encsig, monero_wallet_restore_blockheight, - }) + })) } pub async fn wait_for_cancel_timelock_to_expire(&self, bitcoin_wallet: &W) -> Result<()> diff --git a/swap/src/protocol/bob/swap.rs b/swap/src/protocol/bob/swap.rs index d645e83e..72686335 100644 --- a/swap/src/protocol/bob/swap.rs +++ b/swap/src/protocol/bob/swap.rs @@ -4,6 +4,7 @@ use crate::{ database::{Database, Swap}, execution_params::ExecutionParams, monero, + monero::InsufficientFunds, protocol::bob::{self, event_loop::EventLoopHandle, state::*, QuoteRequest}, }; use anyhow::{bail, Result}; @@ -186,7 +187,15 @@ async fn run_until_internal( select! { state4 = xmr_lock_watcher => { - BobState::XmrLocked(state4?) + match state4? { + Ok(state4) => BobState::XmrLocked(state4), + Err(InsufficientFunds {..}) => { + info!("The other party has locked insufficient Monero funds! Waiting for refund..."); + state.wait_for_cancel_timelock_to_expire(bitcoin_wallet.as_ref()).await?; + let state4 = state.state4(); + BobState::CancelTimelockExpired(state4) + }, + } }, _ = cancel_timelock_expires => { let state4 = state.state4();