@ -34,7 +34,9 @@ use tracing::error;
pub mod message ;
use crate ::{
bitcoin ::{ BlockHeight , GetRawTransaction , Network , TransactionBlockHeight } ,
bitcoin ::{
current_epoch , wait_for_t1 , BlockHeight , GetRawTransaction , Network , TransactionBlockHeight ,
} ,
monero ::{ CreateWalletForOutput , WatchForTransfer } ,
} ;
use ::bitcoin ::{ Transaction , Txid } ;
@ -621,9 +623,50 @@ impl State3 {
} )
}
pub async fn wait_for_t1 < W > ( & self , bitcoin_wallet : & W ) -> Result < ( ) >
where
W : WatchForRawTransaction + TransactionBlockHeight + BlockHeight ,
{
wait_for_t1 ( bitcoin_wallet , self . refund_timelock , self . tx_lock . txid ( ) ) . await
}
pub fn t1_expired ( & self ) -> State4 {
State4 {
A : self . A ,
b : self . b . clone ( ) ,
s_b : self . s_b ,
S_a_monero : self . S_a_monero ,
S_a_bitcoin : self . S_a_bitcoin ,
v : self . v ,
btc : self . btc ,
xmr : self . xmr ,
refund_timelock : self . refund_timelock ,
punish_timelock : self . punish_timelock ,
refund_address : self . refund_address . clone ( ) ,
redeem_address : self . redeem_address . clone ( ) ,
punish_address : self . punish_address . clone ( ) ,
tx_lock : self . tx_lock . clone ( ) ,
tx_cancel_sig_a : self . tx_cancel_sig_a . clone ( ) ,
tx_refund_encsig : self . tx_refund_encsig . clone ( ) ,
}
}
pub fn tx_lock_id ( & self ) -> bitcoin ::Txid {
self . tx_lock . txid ( )
}
pub async fn current_epoch < W > ( & self , bitcoin_wallet : & W ) -> Result < Epoch >
where
W : WatchForRawTransaction + TransactionBlockHeight + BlockHeight ,
{
current_epoch (
bitcoin_wallet ,
self . refund_timelock ,
self . punish_timelock ,
self . tx_lock . txid ( ) ,
)
. await
}
}
#[ derive(Debug, Clone, Deserialize, Serialize, PartialEq) ]
@ -748,31 +791,20 @@ impl State4 {
where
W : WatchForRawTransaction + TransactionBlockHeight + BlockHeight ,
{
let tx_id = self . tx_lock . txid ( ) ;
let tx_lock_height = bitcoin_wallet . transaction_block_height ( tx_id ) . await ;
let t1_timeout =
poll_until_block_height_is_gte ( bitcoin_wallet , tx_lock_height + self . refund_timelock ) ;
t1_timeout . await ;
Ok ( ( ) )
wait_for_t1 ( bitcoin_wallet , self . refund_timelock , self . tx_lock . txid ( ) ) . await
}
pub async fn current_epoch < W > ( & self , bitcoin_wallet : & W ) -> Result < Epoch >
where
W : WatchForRawTransaction + TransactionBlockHeight + BlockHeight ,
{
let current_block_height = bitcoin_wallet . block_height ( ) . await ;
let t0 = bitcoin_wallet
. transaction_block_height ( self . tx_lock . txid ( ) )
. await ;
let t1 = t0 + self . refund_timelock ;
let t2 = t1 + self . punish_timelock ;
match ( current_block_height < t1 , current_block_height < t2 ) {
( true , _ ) = > Ok ( Epoch ::T0 ) ,
( false , true ) = > Ok ( Epoch ::T1 ) ,
( false , false ) = > Ok ( Epoch ::T2 ) ,
}
current_epoch (
bitcoin_wallet ,
self . refund_timelock ,
self . punish_timelock ,
self . tx_lock . txid ( ) ,
)
. await
}
pub async fn refund_btc < W : bitcoin ::BroadcastSignedTransaction > (