Alice aborts if any timelock expired before locking XMR

Once we resume unfinished swaps upon startup we have to ensure that
it is safe for Alice to act.
If Bob has locked BTC it is only make sense for Alice to lock up the
XMR as long as no timelock has expired. Hence we abort if the BTC is
locked, but any timelock expired already.
This commit is contained in:
Daniel Karzel 2021-03-25 11:16:34 +11:00 committed by Thomas Eizinger
parent 607b3d2fdc
commit dfd69c9c80
No known key found for this signature in database
GPG Key ID: 651AC83A6C6C8B96
2 changed files with 31 additions and 25 deletions

View File

@ -88,36 +88,42 @@ async fn next_state(
} }
} }
} }
AliceState::BtcLocked { state3 } => { AliceState::BtcLocked { state3 } => match state3
// Record the current monero wallet block height so we don't have to scan from .expired_timelocks(bitcoin_wallet)
// block 0 for scenarios where we create a refund wallet. .await?
let monero_wallet_restore_blockheight = monero_wallet.block_height().await?; {
ExpiredTimelocks::None => {
// Record the current monero wallet block height so we don't have to scan from
// block 0 for scenarios where we create a refund wallet.
let monero_wallet_restore_blockheight = monero_wallet.block_height().await?;
let transfer_proof = monero_wallet let transfer_proof = monero_wallet
.transfer(state3.lock_xmr_transfer_request()) .transfer(state3.lock_xmr_transfer_request())
.await?; .await?;
monero_wallet monero_wallet
.watch_for_transfer(state3.lock_xmr_watch_request(transfer_proof.clone(), 1)) .watch_for_transfer(state3.lock_xmr_watch_request(transfer_proof.clone(), 1))
.await?; .await?;
// TODO: Waiting for XMR confirmations should be done in a separate // TODO: Waiting for XMR confirmations should be done in a separate
// state! We have to record that Alice has already sent the transaction. // state! We have to record that Alice has already sent the transaction.
// Otherwise Alice might publish the lock tx twice! // Otherwise Alice might publish the lock tx twice!
event_loop_handle event_loop_handle
.send_transfer_proof(transfer_proof.clone()) .send_transfer_proof(transfer_proof.clone())
.await?; .await?;
monero_wallet monero_wallet
.watch_for_transfer(state3.lock_xmr_watch_request(transfer_proof, 10)) .watch_for_transfer(state3.lock_xmr_watch_request(transfer_proof, 10))
.await?; .await?;
AliceState::XmrLocked { AliceState::XmrLocked {
state3, state3,
monero_wallet_restore_blockheight, monero_wallet_restore_blockheight,
}
} }
} _ => AliceState::SafelyAborted,
},
AliceState::XmrLocked { AliceState::XmrLocked {
state3, state3,
monero_wallet_restore_blockheight, monero_wallet_restore_blockheight,

View File

@ -835,7 +835,7 @@ pub struct FastCancelConfig;
impl GetConfig for FastCancelConfig { impl GetConfig for FastCancelConfig {
fn get_config() -> Config { fn get_config() -> Config {
Config { Config {
bitcoin_cancel_timelock: CancelTimelock::new(1), bitcoin_cancel_timelock: CancelTimelock::new(10),
..env::Regtest::get_config() ..env::Regtest::get_config()
} }
} }
@ -846,7 +846,7 @@ pub struct FastPunishConfig;
impl GetConfig for FastPunishConfig { impl GetConfig for FastPunishConfig {
fn get_config() -> Config { fn get_config() -> Config {
Config { Config {
bitcoin_cancel_timelock: CancelTimelock::new(1), bitcoin_cancel_timelock: CancelTimelock::new(10),
bitcoin_punish_timelock: PunishTimelock::new(1), bitcoin_punish_timelock: PunishTimelock::new(1),
..env::Regtest::get_config() ..env::Regtest::get_config()
} }