bitcoin_test_data/
electrum.rs1const SCRIPT_STATUS: &str = include_str!("../test_data/electrum_script_status.json");
2
3pub fn script_status() -> &'static str {
4 SCRIPT_STATUS
5}
6
7#[cfg(test)]
8mod tests {
9
10 use electrsd::{
11 bitcoind::{self, bitcoincore_rpc::RpcApi, BitcoinD, P2P},
12 electrum_client::{
13 bitcoin::{hashes::hex::ToHex, Address, Amount},
14 ElectrumApi,
15 },
16 ElectrsD,
17 };
18 use serde::{Deserialize, Serialize};
19
20 use crate::tests::TestData;
21
22 #[derive(Serialize, Deserialize)]
23 pub struct Tx {
24 txid: String,
25 height: i32,
26 }
27
28 #[ignore]
29 #[test]
30 fn create_test_vectors() {
31 let exe = bitcoind::downloaded_exe_path().unwrap();
32 let mut conf = bitcoind::Conf::default();
33 conf.p2p = P2P::Yes;
34 let bitcoind = BitcoinD::with_conf(&exe, &conf).unwrap();
35
36 let exe = electrsd::downloaded_exe_path().unwrap();
37 let electrsd = ElectrsD::new(&exe, &bitcoind).unwrap();
38 let mut result = vec![];
39
40 let address = bitcoind.client.get_new_address(None, None).unwrap();
41 let address_accumulate = bitcoind.client.get_new_address(None, None).unwrap();
42
43 for addr in [&address, &address_accumulate] {
44 electrsd
45 .client
46 .script_subscribe(&addr.script_pubkey())
47 .unwrap();
48 }
49
50 let _ = bitcoind.client.generate_to_address(1, &address).unwrap();
51 let _ = bitcoind
52 .client
53 .generate_to_address(100, &address_accumulate)
54 .unwrap();
55
56 electrsd.wait_height(102);
57
58 let (script_history, status) = ask_history_and_status(&electrsd, &address);
59 let test_data1 = make_test_data(script_history, status);
60 result.push(test_data1);
61
62 let txid = send_sat(&bitcoind, &address);
63 electrsd.wait_tx(&txid);
64
65 let (script_history, status) = ask_history_and_status(&electrsd, &address);
66 let test_data2 = make_test_data(script_history, status);
67 result.push(test_data2);
68
69 let _blocks = bitcoind
70 .client
71 .generate_to_address(1, &address_accumulate)
72 .unwrap();
73
74 electrsd.wait_height(103);
75
76 let (script_history, status) = ask_history_and_status(&electrsd, &address);
77 let test_data3 = make_test_data(script_history, status);
78 result.push(test_data3);
79
80 println!("{}", serde_json::to_string_pretty(&result).unwrap());
81 }
82
83 fn send_sat(
84 bitcoind: &BitcoinD,
85 address: &Address,
86 ) -> electrsd::electrum_client::bitcoin::Txid {
87 bitcoind
88 .client
89 .send_to_address(
90 &address,
91 Amount::from_sat(10000),
92 None,
93 None,
94 None,
95 None,
96 None,
97 None,
98 )
99 .unwrap()
100 }
101
102 fn make_test_data(
103 script_history: Vec<electrsd::electrum_client::GetHistoryRes>,
104 status: Option<electrsd::electrum_client::Hex32Bytes>,
105 ) -> TestData<Vec<Tx>, String> {
106 TestData {
107 input: script_history
108 .iter()
109 .map(|h| Tx {
110 txid: h.tx_hash.to_string(),
111 height: h.height,
112 })
113 .collect::<Vec<_>>(),
114 expected: status.unwrap().to_hex(),
115 }
116 }
117
118 fn ask_history_and_status(
120 electrsd: &ElectrsD,
121 address: &Address,
122 ) -> (
123 Vec<electrsd::electrum_client::GetHistoryRes>,
124 Option<electrsd::electrum_client::Hex32Bytes>,
125 ) {
126 let script_history = electrsd
127 .client
128 .script_get_history(&address.script_pubkey())
129 .unwrap();
130 dbg!(&script_history);
131 let status = electrsd
132 .client
133 .script_pop(&address.script_pubkey())
134 .unwrap();
135 (script_history, status)
136 }
137}