use std::thread;
use std::time::Duration;
use electrum_client::bitcoin::Txid;
use electrum_client::ElectrumApi;
use crate::ElectrsD;
impl ElectrsD {
#[cfg(not(feature = "electrs_0_8_10"))]
pub fn wait_height(&self, height: usize) {
for _ in 0..600 {
match self.client.block_header_raw(height) {
Ok(_) => break,
Err(_) => thread::sleep(Duration::from_millis(100)),
}
}
}
pub fn wait_tx(&self, txid: &Txid) {
'main_loop: for _ in 0..600 {
match self.client.transaction_get(txid) {
Ok(tx) => {
let txid = tx.compute_txid();
if let Some(output) = tx.output.first() {
let history =
self.client.script_get_history(&output.script_pubkey).unwrap();
for el in history {
if el.tx_hash == txid {
return;
}
}
continue 'main_loop;
}
return;
}
Err(_) => thread::sleep(Duration::from_millis(100)),
}
}
}
}
#[cfg(test)]
mod test {
use electrum_client::bitcoin::Amount;
use electrum_client::ElectrumApi;
use crate::test::setup_nodes;
#[cfg(not(feature = "electrs_0_8_10"))]
#[test]
fn test_wait_height() {
let (_, bitcoind, electrsd) = setup_nodes();
let header = electrsd.client.block_headers_subscribe().unwrap();
assert_eq!(header.height, 1);
let address = bitcoind.client.new_address().unwrap();
bitcoind.client.generate_to_address(100, &address).unwrap();
electrsd.wait_height(101);
let header = electrsd.client.block_headers_subscribe().unwrap();
assert_eq!(header.height, 101);
}
#[test]
fn test_wait_tx() {
let (_, bitcoind, electrsd) = setup_nodes();
let header = electrsd.client.block_headers_subscribe().unwrap();
assert_eq!(header.height, 1);
let generate_address = bitcoind.client.new_address().unwrap();
bitcoind.client.generate_to_address(100, &generate_address).unwrap();
let address = bitcoind.client.new_address().unwrap();
let txid = bitcoind
.client
.send_to_address(&address, Amount::from_sat(10000))
.unwrap()
.txid()
.unwrap();
electrsd.wait_tx(&txid);
let history = electrsd.client.script_get_history(&address.script_pubkey()).unwrap();
assert_eq!(history.len(), 1);
}
}