From 24f444b9f7089a1045edcbac95efe77216a9a368 Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Thu, 1 Apr 2021 16:38:33 +1100 Subject: [PATCH] Race sending transfer proof against cancel timelock Sending the transfer proof might never resolve because Bob doesn't come back online. In that case, we need to make sure we bail out as soon as the timelock expires. --- swap/src/protocol/alice/swap.rs | 35 ++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/swap/src/protocol/alice/swap.rs b/swap/src/protocol/alice/swap.rs index c7acbc66..2f2b1c86 100644 --- a/swap/src/protocol/alice/swap.rs +++ b/swap/src/protocol/alice/swap.rs @@ -116,29 +116,32 @@ async fn next_state( state3, }, }, - AliceState::XmrLocked { monero_wallet_restore_blockheight, transfer_proof, state3, - } => match state3.expired_timelocks(bitcoin_wallet).await? { - ExpiredTimelocks::None => { - event_loop_handle - .send_transfer_proof(transfer_proof.clone()) - .await?; + } => { + let tx_lock_status = bitcoin_wallet.subscribe_to(state3.tx_lock.clone()).await; - XmrLockTransferProofSent { - monero_wallet_restore_blockheight, - transfer_proof, - state3, + tokio::select! { + result = event_loop_handle.send_transfer_proof(transfer_proof.clone()) => { + result?; + + XmrLockTransferProofSent { + monero_wallet_restore_blockheight, + transfer_proof, + state3, + } + }, + _ = tx_lock_status.wait_until_confirmed_with(state3.cancel_timelock) => { + AliceState::CancelTimelockExpired { + monero_wallet_restore_blockheight, + transfer_proof, + state3, + } } } - _ => AliceState::CancelTimelockExpired { - monero_wallet_restore_blockheight, - transfer_proof, - state3, - }, - }, + } AliceState::XmrLockTransferProofSent { monero_wallet_restore_blockheight, transfer_proof,