bitcoin_test_data/
electrum.rs

1const 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    /// it's caller responsability to have already subsribed and receive an update
119    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}