mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2024-12-24 23:19:34 -05:00
Only generate refund action after Bitcoin lock
This commit is contained in:
parent
c1f6adc8ed
commit
9f1bf72c7b
@ -118,7 +118,12 @@ where
|
|||||||
B: MedianTime + bitcoin::WatchForRawTransaction + Send + Sync,
|
B: MedianTime + bitcoin::WatchForRawTransaction + Send + Sync,
|
||||||
{
|
{
|
||||||
enum SwapFailed {
|
enum SwapFailed {
|
||||||
TimelockReached,
|
BeforeBtcLock,
|
||||||
|
AfterBtcLock(Reason),
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Reason {
|
||||||
|
BtcExpired,
|
||||||
InsufficientXMR(monero::InsufficientFunds),
|
InsufficientXMR(monero::InsufficientFunds),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +147,7 @@ where
|
|||||||
let btc_has_expired = bitcoin_time_is_gte(bitcoin_ledger, refund_timelock).shared();
|
let btc_has_expired = bitcoin_time_is_gte(bitcoin_ledger, refund_timelock).shared();
|
||||||
|
|
||||||
if btc_has_expired.clone().await {
|
if btc_has_expired.clone().await {
|
||||||
return Err(SwapFailed::TimelockReached);
|
return Err(SwapFailed::BeforeBtcLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
co.yield_(Action::LockBitcoin(tx_lock.clone())).await;
|
co.yield_(Action::LockBitcoin(tx_lock.clone())).await;
|
||||||
@ -150,8 +155,6 @@ where
|
|||||||
let poll_until_btc_has_expired = poll_until(btc_has_expired).shared();
|
let poll_until_btc_has_expired = poll_until(btc_has_expired).shared();
|
||||||
futures::pin_mut!(poll_until_btc_has_expired);
|
futures::pin_mut!(poll_until_btc_has_expired);
|
||||||
|
|
||||||
// the source of this could be the database, this layer doesn't care
|
|
||||||
|
|
||||||
let transfer_proof = match select(
|
let transfer_proof = match select(
|
||||||
network.receive_transfer_proof(),
|
network.receive_transfer_proof(),
|
||||||
poll_until_btc_has_expired.clone(),
|
poll_until_btc_has_expired.clone(),
|
||||||
@ -159,7 +162,7 @@ where
|
|||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Either::Left((proof, _)) => proof,
|
Either::Left((proof, _)) => proof,
|
||||||
Either::Right(_) => return Err(SwapFailed::TimelockReached),
|
Either::Right(_) => return Err(SwapFailed::AfterBtcLock(Reason::BtcExpired)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let S_b_monero = monero::PublicKey::from_private_key(&monero::PrivateKey::from_scalar(
|
let S_b_monero = monero::PublicKey::from_private_key(&monero::PrivateKey::from_scalar(
|
||||||
@ -179,8 +182,10 @@ where
|
|||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Either::Left((Err(e), _)) => return Err(SwapFailed::InsufficientXMR(e)),
|
Either::Left((Err(e), _)) => {
|
||||||
Either::Right(_) => return Err(SwapFailed::TimelockReached),
|
return Err(SwapFailed::AfterBtcLock(Reason::InsufficientXMR(e)))
|
||||||
|
}
|
||||||
|
Either::Right(_) => return Err(SwapFailed::AfterBtcLock(Reason::BtcExpired)),
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,7 +202,7 @@ where
|
|||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Either::Left((tx, _)) => tx,
|
Either::Left((tx, _)) => tx,
|
||||||
Either::Right(_) => return Err(SwapFailed::TimelockReached),
|
Either::Right(_) => return Err(SwapFailed::AfterBtcLock(Reason::BtcExpired)),
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE: If any of this fails, Bob will never be able to take the monero.
|
// NOTE: If any of this fails, Bob will never be able to take the monero.
|
||||||
@ -226,7 +231,7 @@ where
|
|||||||
}
|
}
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
if swap_result.is_err() {
|
if let Err(SwapFailed::AfterBtcLock(_)) = swap_result {
|
||||||
let tx_cancel =
|
let tx_cancel =
|
||||||
bitcoin::TxCancel::new(&tx_lock, refund_timelock, A.clone(), b.public());
|
bitcoin::TxCancel::new(&tx_lock, refund_timelock, A.clone(), b.public());
|
||||||
let tx_refund = bitcoin::TxRefund::new(&tx_cancel, &refund_address);
|
let tx_refund = bitcoin::TxRefund::new(&tx_cancel, &refund_address);
|
||||||
|
Loading…
Reference in New Issue
Block a user