mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2024-10-01 01:45:40 -04:00
Merge #200
200: Wait for refund if insufficient Monero is locked up r=da-kami a=da-kami In a scenario where Alice does not lock up sufficient funds Bob should properly transition to refunds. At the moment the CLI just panics. I noticed this when Alice accidentally had a different amount set than Bob. In the future this should not happen, because Alice provides the amount for Bob. However, in case Alice is malicious Bob should still transition correctly. Co-authored-by: Daniel Karzel <daniel@comit.network>
This commit is contained in:
commit
b3f49cf83e
@ -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<()>
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user