Coverage Report

Created: 2024-10-10 10:38

/home/darosior/projects/bdk/crates/wallet/tests/common.rs
Line
Count
Source (jump to first uncovered line)
1
#![allow(unused)]
2
use bdk_chain::{tx_graph, BlockId, ConfirmationBlockTime, ConfirmationTime, TxGraph};
3
use bdk_wallet::{CreateParams, KeychainKind, LocalOutput, Update, Wallet};
4
use bitcoin::{
5
    hashes::Hash, transaction, Address, Amount, BlockHash, FeeRate, Network, OutPoint, Transaction,
6
    TxIn, TxOut, Txid,
7
};
8
use std::str::FromStr;
9
10
/// Return a fake wallet that appears to be funded for testing.
11
///
12
/// The funded wallet contains a tx with a 76_000 sats input and two outputs, one spending 25_000
13
/// to a foreign address and one returning 50_000 back to the wallet. The remaining 1000
14
/// sats are the transaction fee.
15
131
pub fn get_funded_wallet_with_change(descriptor: &str, change: &str) -> (Wallet, bitcoin::Txid) {
16
131
    let mut wallet = Wallet::create(descriptor.to_string(), change.to_string())
17
131
        .network(Network::Regtest)
18
131
        .create_wallet_no_persist()
19
131
        .expect("descriptors must be valid");
20
131
21
131
    let receive_address = wallet.peek_address(KeychainKind::External, 0).address;
22
131
    let sendto_address = Address::from_str("bcrt1q3qtze4ys45tgdvguj66zrk4fu6hq3a3v9pfly5")
23
131
        .expect("address")
24
131
        .require_network(Network::Regtest)
25
131
        .unwrap();
26
131
27
131
    let tx0 = Transaction {
28
131
        version: transaction::Version::ONE,
29
131
        lock_time: bitcoin::absolute::LockTime::ZERO,
30
131
        input: vec![TxIn {
31
131
            previous_output: OutPoint {
32
131
                txid: Txid::all_zeros(),
33
131
                vout: 0,
34
131
            },
35
131
            script_sig: Default::default(),
36
131
            sequence: Default::default(),
37
131
            witness: Default::default(),
38
131
        }],
39
131
        output: vec![TxOut {
40
131
            value: Amount::from_sat(76_000),
41
131
            script_pubkey: receive_address.script_pubkey(),
42
131
        }],
43
131
    };
44
131
45
131
    let tx1 = Transaction {
46
131
        version: transaction::Version::ONE,
47
131
        lock_time: bitcoin::absolute::LockTime::ZERO,
48
131
        input: vec![TxIn {
49
131
            previous_output: OutPoint {
50
131
                txid: tx0.compute_txid(),
51
131
                vout: 0,
52
131
            },
53
131
            script_sig: Default::default(),
54
131
            sequence: Default::default(),
55
131
            witness: Default::default(),
56
131
        }],
57
131
        output: vec![
58
131
            TxOut {
59
131
                value: Amount::from_sat(50_000),
60
131
                script_pubkey: receive_address.script_pubkey(),
61
131
            },
62
131
            TxOut {
63
131
                value: Amount::from_sat(25_000),
64
131
                script_pubkey: sendto_address.script_pubkey(),
65
131
            },
66
131
        ],
67
131
    };
68
131
69
131
    wallet
70
131
        .insert_checkpoint(BlockId {
71
131
            height: 42,
72
131
            hash: BlockHash::all_zeros(),
73
131
        })
74
131
        .unwrap();
75
131
    wallet
76
131
        .insert_checkpoint(BlockId {
77
131
            height: 1_000,
78
131
            hash: BlockHash::all_zeros(),
79
131
        })
80
131
        .unwrap();
81
131
    wallet
82
131
        .insert_checkpoint(BlockId {
83
131
            height: 2_000,
84
131
            hash: BlockHash::all_zeros(),
85
131
        })
86
131
        .unwrap();
87
131
88
131
    wallet.insert_tx(tx0.clone());
89
131
    insert_anchor_from_conf(
90
131
        &mut wallet,
91
131
        tx0.compute_txid(),
92
131
        ConfirmationTime::Confirmed {
93
131
            height: 1_000,
94
131
            time: 100,
95
131
        },
96
131
    );
97
131
98
131
    wallet.insert_tx(tx1.clone());
99
131
    insert_anchor_from_conf(
100
131
        &mut wallet,
101
131
        tx1.compute_txid(),
102
131
        ConfirmationTime::Confirmed {
103
131
            height: 2_000,
104
131
            time: 200,
105
131
        },
106
131
    );
107
131
108
131
    (wallet, tx1.compute_txid())
109
131
}
Unexecuted instantiation: common::get_funded_wallet_with_change
psbt::common::get_funded_wallet_with_change
Line
Count
Source
15
9
pub fn get_funded_wallet_with_change(descriptor: &str, change: &str) -> (Wallet, bitcoin::Txid) {
16
9
    let mut wallet = Wallet::create(descriptor.to_string(), change.to_string())
17
9
        .network(Network::Regtest)
18
9
        .create_wallet_no_persist()
19
9
        .expect("descriptors must be valid");
20
9
21
9
    let receive_address = wallet.peek_address(KeychainKind::External, 0).address;
22
9
    let sendto_address = Address::from_str("bcrt1q3qtze4ys45tgdvguj66zrk4fu6hq3a3v9pfly5")
23
9
        .expect("address")
24
9
        .require_network(Network::Regtest)
25
9
        .unwrap();
26
9
27
9
    let tx0 = Transaction {
28
9
        version: transaction::Version::ONE,
29
9
        lock_time: bitcoin::absolute::LockTime::ZERO,
30
9
        input: vec![TxIn {
31
9
            previous_output: OutPoint {
32
9
                txid: Txid::all_zeros(),
33
9
                vout: 0,
34
9
            },
35
9
            script_sig: Default::default(),
36
9
            sequence: Default::default(),
37
9
            witness: Default::default(),
38
9
        }],
39
9
        output: vec![TxOut {
40
9
            value: Amount::from_sat(76_000),
41
9
            script_pubkey: receive_address.script_pubkey(),
42
9
        }],
43
9
    };
44
9
45
9
    let tx1 = Transaction {
46
9
        version: transaction::Version::ONE,
47
9
        lock_time: bitcoin::absolute::LockTime::ZERO,
48
9
        input: vec![TxIn {
49
9
            previous_output: OutPoint {
50
9
                txid: tx0.compute_txid(),
51
9
                vout: 0,
52
9
            },
53
9
            script_sig: Default::default(),
54
9
            sequence: Default::default(),
55
9
            witness: Default::default(),
56
9
        }],
57
9
        output: vec![
58
9
            TxOut {
59
9
                value: Amount::from_sat(50_000),
60
9
                script_pubkey: receive_address.script_pubkey(),
61
9
            },
62
9
            TxOut {
63
9
                value: Amount::from_sat(25_000),
64
9
                script_pubkey: sendto_address.script_pubkey(),
65
9
            },
66
9
        ],
67
9
    };
68
9
69
9
    wallet
70
9
        .insert_checkpoint(BlockId {
71
9
            height: 42,
72
9
            hash: BlockHash::all_zeros(),
73
9
        })
74
9
        .unwrap();
75
9
    wallet
76
9
        .insert_checkpoint(BlockId {
77
9
            height: 1_000,
78
9
            hash: BlockHash::all_zeros(),
79
9
        })
80
9
        .unwrap();
81
9
    wallet
82
9
        .insert_checkpoint(BlockId {
83
9
            height: 2_000,
84
9
            hash: BlockHash::all_zeros(),
85
9
        })
86
9
        .unwrap();
87
9
88
9
    wallet.insert_tx(tx0.clone());
89
9
    insert_anchor_from_conf(
90
9
        &mut wallet,
91
9
        tx0.compute_txid(),
92
9
        ConfirmationTime::Confirmed {
93
9
            height: 1_000,
94
9
            time: 100,
95
9
        },
96
9
    );
97
9
98
9
    wallet.insert_tx(tx1.clone());
99
9
    insert_anchor_from_conf(
100
9
        &mut wallet,
101
9
        tx1.compute_txid(),
102
9
        ConfirmationTime::Confirmed {
103
9
            height: 2_000,
104
9
            time: 200,
105
9
        },
106
9
    );
107
9
108
9
    (wallet, tx1.compute_txid())
109
9
}
wallet::common::get_funded_wallet_with_change
Line
Count
Source
15
122
pub fn get_funded_wallet_with_change(descriptor: &str, change: &str) -> (Wallet, bitcoin::Txid) {
16
122
    let mut wallet = Wallet::create(descriptor.to_string(), change.to_string())
17
122
        .network(Network::Regtest)
18
122
        .create_wallet_no_persist()
19
122
        .expect("descriptors must be valid");
20
122
21
122
    let receive_address = wallet.peek_address(KeychainKind::External, 0).address;
22
122
    let sendto_address = Address::from_str("bcrt1q3qtze4ys45tgdvguj66zrk4fu6hq3a3v9pfly5")
23
122
        .expect("address")
24
122
        .require_network(Network::Regtest)
25
122
        .unwrap();
26
122
27
122
    let tx0 = Transaction {
28
122
        version: transaction::Version::ONE,
29
122
        lock_time: bitcoin::absolute::LockTime::ZERO,
30
122
        input: vec![TxIn {
31
122
            previous_output: OutPoint {
32
122
                txid: Txid::all_zeros(),
33
122
                vout: 0,
34
122
            },
35
122
            script_sig: Default::default(),
36
122
            sequence: Default::default(),
37
122
            witness: Default::default(),
38
122
        }],
39
122
        output: vec![TxOut {
40
122
            value: Amount::from_sat(76_000),
41
122
            script_pubkey: receive_address.script_pubkey(),
42
122
        }],
43
122
    };
44
122
45
122
    let tx1 = Transaction {
46
122
        version: transaction::Version::ONE,
47
122
        lock_time: bitcoin::absolute::LockTime::ZERO,
48
122
        input: vec![TxIn {
49
122
            previous_output: OutPoint {
50
122
                txid: tx0.compute_txid(),
51
122
                vout: 0,
52
122
            },
53
122
            script_sig: Default::default(),
54
122
            sequence: Default::default(),
55
122
            witness: Default::default(),
56
122
        }],
57
122
        output: vec![
58
122
            TxOut {
59
122
                value: Amount::from_sat(50_000),
60
122
                script_pubkey: receive_address.script_pubkey(),
61
122
            },
62
122
            TxOut {
63
122
                value: Amount::from_sat(25_000),
64
122
                script_pubkey: sendto_address.script_pubkey(),
65
122
            },
66
122
        ],
67
122
    };
68
122
69
122
    wallet
70
122
        .insert_checkpoint(BlockId {
71
122
            height: 42,
72
122
            hash: BlockHash::all_zeros(),
73
122
        })
74
122
        .unwrap();
75
122
    wallet
76
122
        .insert_checkpoint(BlockId {
77
122
            height: 1_000,
78
122
            hash: BlockHash::all_zeros(),
79
122
        })
80
122
        .unwrap();
81
122
    wallet
82
122
        .insert_checkpoint(BlockId {
83
122
            height: 2_000,
84
122
            hash: BlockHash::all_zeros(),
85
122
        })
86
122
        .unwrap();
87
122
88
122
    wallet.insert_tx(tx0.clone());
89
122
    insert_anchor_from_conf(
90
122
        &mut wallet,
91
122
        tx0.compute_txid(),
92
122
        ConfirmationTime::Confirmed {
93
122
            height: 1_000,
94
122
            time: 100,
95
122
        },
96
122
    );
97
122
98
122
    wallet.insert_tx(tx1.clone());
99
122
    insert_anchor_from_conf(
100
122
        &mut wallet,
101
122
        tx1.compute_txid(),
102
122
        ConfirmationTime::Confirmed {
103
122
            height: 2_000,
104
122
            time: 200,
105
122
        },
106
122
    );
107
122
108
122
    (wallet, tx1.compute_txid())
109
122
}
110
111
/// Return a fake wallet that appears to be funded for testing.
112
///
113
/// The funded wallet contains a tx with a 76_000 sats input and two outputs, one spending 25_000
114
/// to a foreign address and one returning 50_000 back to the wallet. The remaining 1000
115
/// sats are the transaction fee.
116
///
117
/// Note: the change descriptor will have script type `p2wpkh`. If passing some other script type
118
/// as argument, make sure you're ok with getting a wallet where the keychains have potentially
119
/// different script types. Otherwise, use `get_funded_wallet_with_change`.
120
62
pub fn get_funded_wallet(descriptor: &str) -> (Wallet, bitcoin::Txid) {
121
62
    let change = get_test_wpkh_change();
122
62
    get_funded_wallet_with_change(descriptor, change)
123
62
}
Unexecuted instantiation: common::get_funded_wallet
psbt::common::get_funded_wallet
Line
Count
Source
120
7
pub fn get_funded_wallet(descriptor: &str) -> (Wallet, bitcoin::Txid) {
121
7
    let change = get_test_wpkh_change();
122
7
    get_funded_wallet_with_change(descriptor, change)
123
7
}
wallet::common::get_funded_wallet
Line
Count
Source
120
55
pub fn get_funded_wallet(descriptor: &str) -> (Wallet, bitcoin::Txid) {
121
55
    let change = get_test_wpkh_change();
122
55
    get_funded_wallet_with_change(descriptor, change)
123
55
}
124
125
62
pub fn get_funded_wallet_wpkh() -> (Wallet, bitcoin::Txid) {
126
62
    get_funded_wallet_with_change(get_test_wpkh(), get_test_wpkh_change())
127
62
}
Unexecuted instantiation: common::get_funded_wallet_wpkh
Unexecuted instantiation: psbt::common::get_funded_wallet_wpkh
wallet::common::get_funded_wallet_wpkh
Line
Count
Source
125
62
pub fn get_funded_wallet_wpkh() -> (Wallet, bitcoin::Txid) {
126
62
    get_funded_wallet_with_change(get_test_wpkh(), get_test_wpkh_change())
127
62
}
128
129
75
pub fn get_test_wpkh() -> &'static str {
130
75
    "wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)"
131
75
}
Unexecuted instantiation: common::get_test_wpkh
psbt::common::get_test_wpkh
Line
Count
Source
129
4
pub fn get_test_wpkh() -> &'static str {
130
4
    "wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)"
131
4
}
wallet::common::get_test_wpkh
Line
Count
Source
129
71
pub fn get_test_wpkh() -> &'static str {
130
71
    "wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)"
131
71
}
132
133
2
pub fn get_test_wpkh_with_change_desc() -> (&'static str, &'static str) {
134
2
    (
135
2
        "wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)",
136
2
        get_test_wpkh_change(),
137
2
    )
138
2
}
Unexecuted instantiation: common::get_test_wpkh_with_change_desc
Unexecuted instantiation: psbt::common::get_test_wpkh_with_change_desc
wallet::common::get_test_wpkh_with_change_desc
Line
Count
Source
133
2
pub fn get_test_wpkh_with_change_desc() -> (&'static str, &'static str) {
134
2
    (
135
2
        "wpkh(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW)",
136
2
        get_test_wpkh_change(),
137
2
    )
138
2
}
139
140
126
fn get_test_wpkh_change() -> &'static str {
141
126
    "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/1/0)"
142
126
}
Unexecuted instantiation: common::get_test_wpkh_change
psbt::common::get_test_wpkh_change
Line
Count
Source
140
7
fn get_test_wpkh_change() -> &'static str {
141
7
    "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/1/0)"
142
7
}
wallet::common::get_test_wpkh_change
Line
Count
Source
140
119
fn get_test_wpkh_change() -> &'static str {
141
119
    "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/1/0)"
142
119
}
143
144
4
pub fn get_test_single_sig_csv() -> &'static str {
145
4
    // and(pk(Alice),older(6))
146
4
    "wsh(and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),older(6)))"
147
4
}
Unexecuted instantiation: common::get_test_single_sig_csv
Unexecuted instantiation: psbt::common::get_test_single_sig_csv
wallet::common::get_test_single_sig_csv
Line
Count
Source
144
4
pub fn get_test_single_sig_csv() -> &'static str {
145
4
    // and(pk(Alice),older(6))
146
4
    "wsh(and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),older(6)))"
147
4
}
148
149
2
pub fn get_test_a_or_b_plus_csv() -> &'static str {
150
2
    // or(pk(Alice),and(pk(Bob),older(144)))
151
2
    "wsh(or_d(pk(cRjo6jqfVNP33HhSS76UhXETZsGTZYx8FMFvR9kpbtCSV1PmdZdu),and_v(v:pk(cMnkdebixpXMPfkcNEjjGin7s94hiehAH4mLbYkZoh9KSiNNmqC8),older(144))))"
152
2
}
Unexecuted instantiation: common::get_test_a_or_b_plus_csv
Unexecuted instantiation: psbt::common::get_test_a_or_b_plus_csv
wallet::common::get_test_a_or_b_plus_csv
Line
Count
Source
149
2
pub fn get_test_a_or_b_plus_csv() -> &'static str {
150
2
    // or(pk(Alice),and(pk(Bob),older(144)))
151
2
    "wsh(or_d(pk(cRjo6jqfVNP33HhSS76UhXETZsGTZYx8FMFvR9kpbtCSV1PmdZdu),and_v(v:pk(cMnkdebixpXMPfkcNEjjGin7s94hiehAH4mLbYkZoh9KSiNNmqC8),older(144))))"
152
2
}
153
154
5
pub fn get_test_single_sig_cltv() -> &'static str {
155
5
    // and(pk(Alice),after(100000))
156
5
    "wsh(and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),after(100000)))"
157
5
}
Unexecuted instantiation: common::get_test_single_sig_cltv
Unexecuted instantiation: psbt::common::get_test_single_sig_cltv
wallet::common::get_test_single_sig_cltv
Line
Count
Source
154
5
pub fn get_test_single_sig_cltv() -> &'static str {
155
5
    // and(pk(Alice),after(100000))
156
5
    "wsh(and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),after(100000)))"
157
5
}
158
159
7
pub fn get_test_tr_single_sig() -> &'static str {
160
7
    "tr(cNJmN3fH9DDbDt131fQNkVakkpzawJBSeybCUNmP1BovpmGQ45xG)"
161
7
}
Unexecuted instantiation: common::get_test_tr_single_sig
Unexecuted instantiation: psbt::common::get_test_tr_single_sig
wallet::common::get_test_tr_single_sig
Line
Count
Source
159
7
pub fn get_test_tr_single_sig() -> &'static str {
160
7
    "tr(cNJmN3fH9DDbDt131fQNkVakkpzawJBSeybCUNmP1BovpmGQ45xG)"
161
7
}
162
163
3
pub fn get_test_tr_with_taptree() -> &'static str {
164
3
    "tr(b511bd5771e47ee27558b1765e87b541668304ec567721c7b880edc0a010da55,{pk(cPZzKuNmpuUjD1e8jUU4PVzy2b5LngbSip8mBsxf4e7rSFZVb4Uh),pk(8aee2b8120a5f157f1223f72b5e62b825831a27a9fdf427db7cc697494d4a642)})"
165
3
}
Unexecuted instantiation: common::get_test_tr_with_taptree
Unexecuted instantiation: psbt::common::get_test_tr_with_taptree
wallet::common::get_test_tr_with_taptree
Line
Count
Source
163
3
pub fn get_test_tr_with_taptree() -> &'static str {
164
3
    "tr(b511bd5771e47ee27558b1765e87b541668304ec567721c7b880edc0a010da55,{pk(cPZzKuNmpuUjD1e8jUU4PVzy2b5LngbSip8mBsxf4e7rSFZVb4Uh),pk(8aee2b8120a5f157f1223f72b5e62b825831a27a9fdf427db7cc697494d4a642)})"
165
3
}
166
167
5
pub fn get_test_tr_with_taptree_both_priv() -> &'static str {
168
5
    "tr(b511bd5771e47ee27558b1765e87b541668304ec567721c7b880edc0a010da55,{pk(cPZzKuNmpuUjD1e8jUU4PVzy2b5LngbSip8mBsxf4e7rSFZVb4Uh),pk(cNaQCDwmmh4dS9LzCgVtyy1e1xjCJ21GUDHe9K98nzb689JvinGV)})"
169
5
}
Unexecuted instantiation: common::get_test_tr_with_taptree_both_priv
Unexecuted instantiation: psbt::common::get_test_tr_with_taptree_both_priv
wallet::common::get_test_tr_with_taptree_both_priv
Line
Count
Source
167
5
pub fn get_test_tr_with_taptree_both_priv() -> &'static str {
168
5
    "tr(b511bd5771e47ee27558b1765e87b541668304ec567721c7b880edc0a010da55,{pk(cPZzKuNmpuUjD1e8jUU4PVzy2b5LngbSip8mBsxf4e7rSFZVb4Uh),pk(cNaQCDwmmh4dS9LzCgVtyy1e1xjCJ21GUDHe9K98nzb689JvinGV)})"
169
5
}
170
171
1
pub fn get_test_tr_repeated_key() -> &'static str {
172
1
    "tr(b511bd5771e47ee27558b1765e87b541668304ec567721c7b880edc0a010da55,{and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),after(100)),and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),after(200))})"
173
1
}
Unexecuted instantiation: common::get_test_tr_repeated_key
Unexecuted instantiation: psbt::common::get_test_tr_repeated_key
wallet::common::get_test_tr_repeated_key
Line
Count
Source
171
1
pub fn get_test_tr_repeated_key() -> &'static str {
172
1
    "tr(b511bd5771e47ee27558b1765e87b541668304ec567721c7b880edc0a010da55,{and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),after(100)),and_v(v:pk(cVpPVruEDdmutPzisEsYvtST1usBR3ntr8pXSyt6D2YYqXRyPcFW),after(200))})"
173
1
}
174
175
6
pub fn get_test_tr_single_sig_xprv() -> &'static str {
176
6
    "tr(tprv8ZgxMBicQKsPdDArR4xSAECuVxeX1jwwSXR4ApKbkYgZiziDc4LdBy2WvJeGDfUSE4UT4hHhbgEwbdq8ajjUHiKDegkwrNU6V55CxcxonVN/*)"
177
6
}
Unexecuted instantiation: common::get_test_tr_single_sig_xprv
Unexecuted instantiation: psbt::common::get_test_tr_single_sig_xprv
wallet::common::get_test_tr_single_sig_xprv
Line
Count
Source
175
6
pub fn get_test_tr_single_sig_xprv() -> &'static str {
176
6
    "tr(tprv8ZgxMBicQKsPdDArR4xSAECuVxeX1jwwSXR4ApKbkYgZiziDc4LdBy2WvJeGDfUSE4UT4hHhbgEwbdq8ajjUHiKDegkwrNU6V55CxcxonVN/*)"
177
6
}
178
179
6
pub fn get_test_tr_single_sig_xprv_with_change_desc() -> (&'static str, &'static str) {
180
6
    ("tr(tprv8ZgxMBicQKsPdDArR4xSAECuVxeX1jwwSXR4ApKbkYgZiziDc4LdBy2WvJeGDfUSE4UT4hHhbgEwbdq8ajjUHiKDegkwrNU6V55CxcxonVN/0/*)",
181
6
    "tr(tprv8ZgxMBicQKsPdDArR4xSAECuVxeX1jwwSXR4ApKbkYgZiziDc4LdBy2WvJeGDfUSE4UT4hHhbgEwbdq8ajjUHiKDegkwrNU6V55CxcxonVN/1/*)")
182
6
}
Unexecuted instantiation: common::get_test_tr_single_sig_xprv_with_change_desc
Unexecuted instantiation: psbt::common::get_test_tr_single_sig_xprv_with_change_desc
wallet::common::get_test_tr_single_sig_xprv_with_change_desc
Line
Count
Source
179
6
pub fn get_test_tr_single_sig_xprv_with_change_desc() -> (&'static str, &'static str) {
180
6
    ("tr(tprv8ZgxMBicQKsPdDArR4xSAECuVxeX1jwwSXR4ApKbkYgZiziDc4LdBy2WvJeGDfUSE4UT4hHhbgEwbdq8ajjUHiKDegkwrNU6V55CxcxonVN/0/*)",
181
6
    "tr(tprv8ZgxMBicQKsPdDArR4xSAECuVxeX1jwwSXR4ApKbkYgZiziDc4LdBy2WvJeGDfUSE4UT4hHhbgEwbdq8ajjUHiKDegkwrNU6V55CxcxonVN/1/*)")
182
6
}
183
184
1
pub fn get_test_tr_with_taptree_xprv() -> &'static str {
185
1
    "tr(cNJmN3fH9DDbDt131fQNkVakkpzawJBSeybCUNmP1BovpmGQ45xG,{pk(tprv8ZgxMBicQKsPdDArR4xSAECuVxeX1jwwSXR4ApKbkYgZiziDc4LdBy2WvJeGDfUSE4UT4hHhbgEwbdq8ajjUHiKDegkwrNU6V55CxcxonVN/*),pk(8aee2b8120a5f157f1223f72b5e62b825831a27a9fdf427db7cc697494d4a642)})"
186
1
}
Unexecuted instantiation: common::get_test_tr_with_taptree_xprv
Unexecuted instantiation: psbt::common::get_test_tr_with_taptree_xprv
wallet::common::get_test_tr_with_taptree_xprv
Line
Count
Source
184
1
pub fn get_test_tr_with_taptree_xprv() -> &'static str {
185
1
    "tr(cNJmN3fH9DDbDt131fQNkVakkpzawJBSeybCUNmP1BovpmGQ45xG,{pk(tprv8ZgxMBicQKsPdDArR4xSAECuVxeX1jwwSXR4ApKbkYgZiziDc4LdBy2WvJeGDfUSE4UT4hHhbgEwbdq8ajjUHiKDegkwrNU6V55CxcxonVN/*),pk(8aee2b8120a5f157f1223f72b5e62b825831a27a9fdf427db7cc697494d4a642)})"
186
1
}
187
188
1
pub fn get_test_tr_dup_keys() -> &'static str {
189
1
    "tr(cNJmN3fH9DDbDt131fQNkVakkpzawJBSeybCUNmP1BovpmGQ45xG,{pk(8aee2b8120a5f157f1223f72b5e62b825831a27a9fdf427db7cc697494d4a642),pk(8aee2b8120a5f157f1223f72b5e62b825831a27a9fdf427db7cc697494d4a642)})"
190
1
}
Unexecuted instantiation: common::get_test_tr_dup_keys
Unexecuted instantiation: psbt::common::get_test_tr_dup_keys
wallet::common::get_test_tr_dup_keys
Line
Count
Source
188
1
pub fn get_test_tr_dup_keys() -> &'static str {
189
1
    "tr(cNJmN3fH9DDbDt131fQNkVakkpzawJBSeybCUNmP1BovpmGQ45xG,{pk(8aee2b8120a5f157f1223f72b5e62b825831a27a9fdf427db7cc697494d4a642),pk(8aee2b8120a5f157f1223f72b5e62b825831a27a9fdf427db7cc697494d4a642)})"
190
1
}
191
192
/// Construct a new [`FeeRate`] from the given raw `sat_vb` feerate. This is
193
/// useful in cases where we want to create a feerate from a `f64`, as the
194
/// traditional [`FeeRate::from_sat_per_vb`] method will only accept an integer.
195
///
196
/// **Note** this 'quick and dirty' conversion should only be used when the input
197
/// parameter has units of `satoshis/vbyte` **AND** is not expected to overflow,
198
/// or else the resulting value will be inaccurate.
199
0
pub fn feerate_unchecked(sat_vb: f64) -> FeeRate {
200
0
    // 1 sat_vb / 4wu_vb * 1000kwu_wu = 250 sat_kwu
201
0
    let sat_kwu = (sat_vb * 250.0).ceil() as u64;
202
0
    FeeRate::from_sat_per_kwu(sat_kwu)
203
0
}
Unexecuted instantiation: common::feerate_unchecked
Unexecuted instantiation: psbt::common::feerate_unchecked
Unexecuted instantiation: wallet::common::feerate_unchecked
204
205
/// Simulates confirming a tx with `txid` at the specified `position` by inserting an anchor
206
/// at the lowest height in local chain that is greater or equal to `position`'s height,
207
/// assuming the confirmation time matches `ConfirmationTime::Confirmed`.
208
273
pub fn insert_anchor_from_conf(wallet: &mut Wallet, txid: Txid, position: ConfirmationTime) {
209
273
    if let ConfirmationTime::Confirmed { height, time } = position {
210
273
        // anchor tx to checkpoint with lowest height that is >= position's height
211
273
        let anchor = wallet
212
273
            .local_chain()
213
273
            .range(height..)
214
273
            .last()
215
273
            .map(|anchor_cp| ConfirmationBlockTime {
216
273
                block_id: anchor_cp.block_id(),
217
273
                confirmation_time: time,
218
273
            })
Unexecuted instantiation: common::insert_anchor_from_conf::{closure#0}
psbt::common::insert_anchor_from_conf::{closure#0}
Line
Count
Source
215
18
            .map(|anchor_cp| ConfirmationBlockTime {
216
18
                block_id: anchor_cp.block_id(),
217
18
                confirmation_time: time,
218
18
            })
wallet::common::insert_anchor_from_conf::{closure#0}
Line
Count
Source
215
255
            .map(|anchor_cp| ConfirmationBlockTime {
216
255
                block_id: anchor_cp.block_id(),
217
255
                confirmation_time: time,
218
255
            })
219
273
            .expect("confirmation height cannot be greater than tip");
220
273
221
273
        wallet
222
273
            .apply_update(Update {
223
273
                tx_update: tx_graph::TxUpdate {
224
273
                    anchors: [(anchor, txid)].into(),
225
273
                    ..Default::default()
226
273
                },
227
273
                ..Default::default()
228
273
            })
229
273
            .unwrap();
230
273
    }
0
231
273
}
Unexecuted instantiation: common::insert_anchor_from_conf
psbt::common::insert_anchor_from_conf
Line
Count
Source
208
18
pub fn insert_anchor_from_conf(wallet: &mut Wallet, txid: Txid, position: ConfirmationTime) {
209
18
    if let ConfirmationTime::Confirmed { height, time } = position {
210
18
        // anchor tx to checkpoint with lowest height that is >= position's height
211
18
        let anchor = wallet
212
18
            .local_chain()
213
18
            .range(height..)
214
18
            .last()
215
18
            .map(|anchor_cp| ConfirmationBlockTime {
216
                block_id: anchor_cp.block_id(),
217
                confirmation_time: time,
218
18
            })
219
18
            .expect("confirmation height cannot be greater than tip");
220
18
221
18
        wallet
222
18
            .apply_update(Update {
223
18
                tx_update: tx_graph::TxUpdate {
224
18
                    anchors: [(anchor, txid)].into(),
225
18
                    ..Default::default()
226
18
                },
227
18
                ..Default::default()
228
18
            })
229
18
            .unwrap();
230
18
    }
0
231
18
}
wallet::common::insert_anchor_from_conf
Line
Count
Source
208
255
pub fn insert_anchor_from_conf(wallet: &mut Wallet, txid: Txid, position: ConfirmationTime) {
209
255
    if let ConfirmationTime::Confirmed { height, time } = position {
210
255
        // anchor tx to checkpoint with lowest height that is >= position's height
211
255
        let anchor = wallet
212
255
            .local_chain()
213
255
            .range(height..)
214
255
            .last()
215
255
            .map(|anchor_cp| ConfirmationBlockTime {
216
                block_id: anchor_cp.block_id(),
217
                confirmation_time: time,
218
255
            })
219
255
            .expect("confirmation height cannot be greater than tip");
220
255
221
255
        wallet
222
255
            .apply_update(Update {
223
255
                tx_update: tx_graph::TxUpdate {
224
255
                    anchors: [(anchor, txid)].into(),
225
255
                    ..Default::default()
226
255
                },
227
255
                ..Default::default()
228
255
            })
229
255
            .unwrap();
230
255
    }
0
231
255
}