mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2024-12-18 04:14:32 -05:00
Check expiry before emitting first action
This commit is contained in:
parent
df4ffb65c9
commit
f0ecc62748
@ -55,7 +55,7 @@ use async_trait::async_trait;
|
||||
use ecdsa_fun::{adaptor::Adaptor, nonce::Deterministic};
|
||||
use futures::{
|
||||
future::{select, Either},
|
||||
FutureExt,
|
||||
Future, FutureExt,
|
||||
};
|
||||
use genawaiter::sync::{Gen, GenBoxed};
|
||||
use sha2::Sha256;
|
||||
@ -121,24 +121,33 @@ where
|
||||
InsufficientXMR(monero::InsufficientFunds),
|
||||
}
|
||||
|
||||
async fn poll_until_bitcoin_time<B>(bitcoin_client: &B, timestamp: u32)
|
||||
where
|
||||
B: MedianTime,
|
||||
{
|
||||
async fn poll_until(condition_future: impl Future<Output = bool> + Clone) {
|
||||
loop {
|
||||
if bitcoin_client.median_time().await >= timestamp {
|
||||
if condition_future.clone().await {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn bitcoin_time_is_gte<B>(bitcoin_client: &B, timestamp: u32) -> bool
|
||||
where
|
||||
B: MedianTime,
|
||||
{
|
||||
bitcoin_client.median_time().await >= timestamp
|
||||
}
|
||||
|
||||
Gen::new_boxed(|co| async move {
|
||||
let swap_result: Result<(), SwapFailed> = async {
|
||||
let btc_has_expired = bitcoin_time_is_gte(bitcoin_ledger, refund_timelock).shared();
|
||||
|
||||
if btc_has_expired.clone().await {
|
||||
return Err(SwapFailed::TimelockReached);
|
||||
}
|
||||
|
||||
co.yield_(Action::LockBitcoin(tx_lock.clone())).await;
|
||||
|
||||
let poll_until_expiry =
|
||||
poll_until_bitcoin_time(bitcoin_ledger, refund_timelock).shared();
|
||||
futures::pin_mut!(poll_until_expiry);
|
||||
let poll_until_btc_has_expired = poll_until(btc_has_expired).shared();
|
||||
futures::pin_mut!(poll_until_btc_has_expired);
|
||||
|
||||
// the source of this could be the database, this layer doesn't care
|
||||
let transfer_proof = network.receive_transfer_proof();
|
||||
@ -156,7 +165,7 @@ where
|
||||
xmr,
|
||||
monero::MIN_CONFIRMATIONS,
|
||||
),
|
||||
poll_until_expiry.clone(),
|
||||
poll_until_btc_has_expired.clone(),
|
||||
)
|
||||
.await
|
||||
{
|
||||
@ -173,7 +182,7 @@ where
|
||||
|
||||
let tx_redeem_published = match select(
|
||||
bitcoin_ledger.watch_for_raw_transaction(tx_redeem.txid()),
|
||||
poll_until_expiry,
|
||||
poll_until_btc_has_expired,
|
||||
)
|
||||
.await
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user