Wait for refund if insufficient Monero is locked up

This commit is contained in:
Daniel Karzel 2021-02-16 16:00:27 +11:00 committed by Thomas Eizinger
parent 7a9569ffd4
commit babd1d7b60
No known key found for this signature in database
GPG Key ID: 651AC83A6C6C8B96
2 changed files with 19 additions and 7 deletions

View File

@ -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<State4>
) -> Result<Result<State4, InsufficientFunds>>
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<W>(&self, bitcoin_wallet: &W) -> Result<()>

View File

@ -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();