|
1 | 1 | mod common; |
2 | | -use std::{thread::sleep, time::Duration}; |
3 | 2 |
|
4 | 3 | use crate::common::{ |
5 | | - expect_channel_pending_event, expect_channel_ready_event, generate_blocks_and_wait, |
6 | | - premine_and_distribute_funds, setup_two_nodes, wait_for_tx, |
| 4 | + generate_blocks_and_wait, premine_and_distribute_funds, setup_two_payjoin_nodes, wait_for_tx, |
7 | 5 | }; |
8 | 6 | use bitcoin::Amount; |
9 | | -use bitcoincore_rpc::{Client as BitcoindClient, RpcApi}; |
10 | 7 | use common::setup_bitcoind_and_electrsd; |
11 | | -use ldk_node::Event; |
12 | | - |
13 | | -#[test] |
14 | | -fn send_receive_with_channel_opening_payjoin_transaction() { |
15 | | - let (bitcoind, electrsd) = setup_bitcoind_and_electrsd(); |
16 | | - let (node_a, node_b) = setup_two_nodes(&electrsd, false, true); |
17 | | - let addr_b = node_b.onchain_payment().new_address().unwrap(); |
18 | | - let premine_amount_sat = 100_000_00; |
19 | | - premine_and_distribute_funds( |
20 | | - &bitcoind.client, |
21 | | - &electrsd.client, |
22 | | - vec![addr_b], |
23 | | - Amount::from_sat(premine_amount_sat), |
24 | | - ); |
25 | | - node_a.sync_wallets().unwrap(); |
26 | | - node_b.sync_wallets().unwrap(); |
27 | | - assert_eq!(node_a.list_balances().spendable_onchain_balance_sats, 0); |
28 | | - assert_eq!(node_b.list_balances().spendable_onchain_balance_sats, premine_amount_sat); |
29 | | - assert_eq!(node_a.next_event(), None); |
30 | | - assert_eq!(node_a.list_channels().len(), 0); |
31 | | - assert_eq!(node_b.next_event(), None); |
32 | | - assert_eq!(node_b.list_channels().len(), 0); |
33 | | - let funding_amount_sat = 80_000; |
34 | | - let node_b_listening_address = node_b.listening_addresses().unwrap().get(0).unwrap().clone(); |
35 | | - let payjoin_uri = node_a |
36 | | - .request_payjoin_transaction_with_channel_opening( |
37 | | - funding_amount_sat, |
38 | | - None, |
39 | | - false, |
40 | | - node_b.node_id(), |
41 | | - node_b_listening_address, |
42 | | - ) |
43 | | - .unwrap(); |
44 | | - assert!(node_b |
45 | | - .send_payjoin_transaction( |
46 | | - payjoin::Uri::try_from(payjoin_uri.to_string()).unwrap().assume_checked() |
47 | | - ) |
48 | | - .is_ok()); |
49 | | - expect_channel_pending_event!(node_a, node_b.node_id()); |
50 | | - expect_channel_pending_event!(node_b, node_a.node_id()); |
51 | | - let channels = node_a.list_channels(); |
52 | | - let channel = channels.get(0).unwrap(); |
53 | | - wait_for_tx(&electrsd.client, channel.funding_txo.unwrap().txid); |
54 | | - sleep(Duration::from_secs(1)); |
55 | | - generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 6); |
56 | | - node_a.sync_wallets().unwrap(); |
57 | | - node_b.sync_wallets().unwrap(); |
58 | | - expect_channel_ready_event!(node_a, node_b.node_id()); |
59 | | - expect_channel_ready_event!(node_b, node_a.node_id()); |
60 | | - let channels = node_a.list_channels(); |
61 | | - let channel = channels.get(0).unwrap(); |
62 | | - assert_eq!(channel.channel_value_sats, funding_amount_sat); |
63 | | - assert_eq!(channel.confirmations.unwrap(), 6); |
64 | | - assert!(channel.is_channel_ready); |
65 | | - assert!(channel.is_usable); |
66 | | - |
67 | | - assert_eq!(node_a.list_peers().get(0).unwrap().is_connected, true); |
68 | | - assert_eq!(node_a.list_peers().get(0).unwrap().is_persisted, true); |
69 | | - assert_eq!(node_a.list_peers().get(0).unwrap().node_id, node_b.node_id()); |
70 | | - |
71 | | - let invoice_amount_1_msat = 2500_000; |
72 | | - let invoice = node_b.bolt11_payment().receive(invoice_amount_1_msat, "test", 1000).unwrap(); |
73 | | - assert!(node_a.bolt11_payment().send(&invoice).is_ok()); |
74 | | -} |
75 | 8 |
|
76 | 9 | #[test] |
77 | 10 | fn send_receive_regular_payjoin_transaction() { |
78 | 11 | let (bitcoind, electrsd) = setup_bitcoind_and_electrsd(); |
79 | | - let (node_a, node_b) = setup_two_nodes(&electrsd, false, true); |
80 | | - let addr_b = node_b.onchain_payment().new_address().unwrap(); |
| 12 | + let (node_a_pj_receiver, node_b_pj_sender) = setup_two_payjoin_nodes(&electrsd, false); |
| 13 | + let addr_b = node_b_pj_sender.onchain_payment().new_address().unwrap(); |
81 | 14 | let premine_amount_sat = 100_000_00; |
82 | 15 | premine_and_distribute_funds( |
83 | 16 | &bitcoind.client, |
84 | 17 | &electrsd.client, |
85 | 18 | vec![addr_b], |
86 | 19 | Amount::from_sat(premine_amount_sat), |
87 | 20 | ); |
88 | | - node_a.sync_wallets().unwrap(); |
89 | | - node_b.sync_wallets().unwrap(); |
90 | | - assert_eq!(node_b.list_balances().spendable_onchain_balance_sats, premine_amount_sat); |
91 | | - assert_eq!(node_a.list_balances().spendable_onchain_balance_sats, 0); |
92 | | - assert_eq!(node_a.next_event(), None); |
93 | | - assert_eq!(node_a.list_channels().len(), 0); |
94 | | - let payjoin_uri = node_a.request_payjoin_transaction(80_000).unwrap(); |
95 | | - assert!(node_b |
96 | | - .send_payjoin_transaction( |
97 | | - payjoin::Uri::try_from(payjoin_uri.to_string()).unwrap().assume_checked() |
98 | | - ) |
99 | | - .is_ok()); |
100 | | - sleep(Duration::from_secs(3)); |
101 | | - generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 6); |
102 | | - node_a.sync_wallets().unwrap(); |
103 | | - node_b.sync_wallets().unwrap(); |
104 | | - let node_a_balance = node_a.list_balances(); |
105 | | - let node_b_balance = node_b.list_balances(); |
106 | | - assert_eq!(node_a_balance.total_onchain_balance_sats, 80000); |
107 | | - assert!(node_b_balance.total_onchain_balance_sats < premine_amount_sat - 80000); |
108 | | -} |
109 | | - |
110 | | -mod payjoin_v1 { |
111 | | - use bitcoin::address::NetworkChecked; |
112 | | - use bitcoin::base64; |
113 | | - use bitcoin::Txid; |
114 | | - use bitcoincore_rpc::Client as BitcoindClient; |
115 | | - use bitcoincore_rpc::RpcApi; |
116 | | - use std::collections::HashMap; |
117 | | - use std::str::FromStr; |
118 | | - |
119 | | - use bitcoincore_rpc::bitcoin::psbt::Psbt; |
120 | | - |
121 | | - pub fn send( |
122 | | - sender_wallet: &BitcoindClient, payjoin_uri: payjoin::Uri<'static, NetworkChecked>, |
123 | | - ) -> Txid { |
124 | | - let amount_to_send = payjoin_uri.amount.unwrap(); |
125 | | - let receiver_address = payjoin_uri.address.clone(); |
126 | | - let mut outputs = HashMap::with_capacity(1); |
127 | | - outputs.insert(receiver_address.to_string(), amount_to_send); |
128 | | - let options = bitcoincore_rpc::json::WalletCreateFundedPsbtOptions { |
129 | | - lock_unspent: Some(false), |
130 | | - fee_rate: Some(bitcoincore_rpc::bitcoin::Amount::from_sat(10000)), |
131 | | - ..Default::default() |
132 | | - }; |
133 | | - let sender_psbt = sender_wallet |
134 | | - .wallet_create_funded_psbt( |
135 | | - &[], // inputs |
136 | | - &outputs, |
137 | | - None, // locktime |
138 | | - Some(options), |
139 | | - None, |
140 | | - ) |
141 | | - .unwrap(); |
142 | | - let psbt = |
143 | | - sender_wallet.wallet_process_psbt(&sender_psbt.psbt, None, None, None).unwrap().psbt; |
144 | | - let psbt = Psbt::from_str(&psbt).unwrap(); |
145 | | - let (req, ctx) = |
146 | | - payjoin::send::RequestBuilder::from_psbt_and_uri(psbt.clone(), payjoin_uri) |
147 | | - .unwrap() |
148 | | - .build_with_additional_fee( |
149 | | - bitcoincore_rpc::bitcoin::Amount::from_sat(1), |
150 | | - None, |
151 | | - bitcoincore_rpc::bitcoin::FeeRate::MIN, |
152 | | - true, |
153 | | - ) |
154 | | - .unwrap() |
155 | | - .extract_v1() |
156 | | - .unwrap(); |
157 | | - let url_http = req.url.as_str().replace("https", "http"); |
158 | | - let res = reqwest::blocking::Client::new(); |
159 | | - let res = res |
160 | | - .post(&url_http) |
161 | | - .body(req.body.clone()) |
162 | | - .header("content-type", "text/plain") |
163 | | - .send() |
164 | | - .unwrap(); |
165 | | - let res = res.text().unwrap(); |
166 | | - let psbt = ctx.process_response(&mut res.as_bytes()).unwrap(); |
167 | | - let psbt = sender_wallet |
168 | | - .wallet_process_psbt(&base64::encode(psbt.serialize()), None, None, None) |
169 | | - .unwrap() |
170 | | - .psbt; |
171 | | - let tx = sender_wallet.finalize_psbt(&psbt, Some(true)).unwrap().hex.unwrap(); |
172 | | - let txid = sender_wallet.send_raw_transaction(&tx).unwrap(); |
173 | | - txid |
174 | | - } |
175 | | -} |
176 | | - |
177 | | -#[test] |
178 | | -fn receive_payjoin_version_1() { |
179 | | - let (bitcoind, electrsd) = setup_bitcoind_and_electrsd(); |
180 | | - let payjoin_sender_wallet: BitcoindClient = bitcoind.create_wallet("payjoin_sender").unwrap(); |
181 | | - let (node_a, _) = setup_two_nodes(&electrsd, false, true); |
182 | | - let addr_sender = payjoin_sender_wallet.get_new_address(None, None).unwrap().assume_checked(); |
183 | | - let premine_amount_sat = 100_000_00; |
184 | | - premine_and_distribute_funds( |
185 | | - &bitcoind.client, |
186 | | - &electrsd.client, |
187 | | - vec![addr_sender], |
188 | | - Amount::from_sat(premine_amount_sat), |
189 | | - ); |
190 | | - node_a.sync_wallets().unwrap(); |
191 | | - assert_eq!(node_a.list_balances().spendable_onchain_balance_sats, 0); |
192 | | - assert_eq!( |
193 | | - payjoin_sender_wallet.get_balances().unwrap().mine.trusted.to_sat(), |
194 | | - premine_amount_sat |
195 | | - ); |
196 | | - assert_eq!(node_a.next_event(), None); |
197 | | - assert_eq!(node_a.list_channels().len(), 0); |
198 | | - let pj_uri = node_a.request_payjoin_transaction(80_000).unwrap(); |
199 | | - payjoin_v1::send( |
200 | | - &payjoin_sender_wallet, |
201 | | - payjoin::Uri::try_from(pj_uri.to_string()).unwrap().assume_checked(), |
| 21 | + node_a_pj_receiver.sync_wallets().unwrap(); |
| 22 | + node_b_pj_sender.sync_wallets().unwrap(); |
| 23 | + assert_eq!(node_b_pj_sender.list_balances().spendable_onchain_balance_sats, premine_amount_sat); |
| 24 | + assert_eq!(node_a_pj_receiver.list_balances().spendable_onchain_balance_sats, 0); |
| 25 | + assert_eq!(node_a_pj_receiver.next_event(), None); |
| 26 | + assert_eq!(node_a_pj_receiver.list_channels().len(), 0); |
| 27 | + let payjoin_uri = node_a_pj_receiver.request_payjoin_transaction(80_000).unwrap(); |
| 28 | + let txid = node_b_pj_sender.send_payjoin_transaction( |
| 29 | + payjoin::Uri::try_from(payjoin_uri.to_string()).unwrap().assume_checked(), |
202 | 30 | ); |
203 | | - sleep(Duration::from_secs(3)); |
| 31 | + dbg!(&txid); |
| 32 | + wait_for_tx(&electrsd.client, txid.unwrap().unwrap()); |
204 | 33 | generate_blocks_and_wait(&bitcoind.client, &electrsd.client, 6); |
205 | | - node_a.sync_wallets().unwrap(); |
206 | | - let node_a_balance = node_a.list_balances(); |
| 34 | + node_a_pj_receiver.sync_wallets().unwrap(); |
| 35 | + node_b_pj_sender.sync_wallets().unwrap(); |
| 36 | + let node_a_balance = node_a_pj_receiver.list_balances(); |
| 37 | + let node_b_balance = node_b_pj_sender.list_balances(); |
207 | 38 | assert_eq!(node_a_balance.total_onchain_balance_sats, 80000); |
| 39 | + assert!(node_b_balance.total_onchain_balance_sats < premine_amount_sat - 80000); |
208 | 40 | } |
209 | | - |
210 | | -// test validation of payjoin transaction fails |
211 | | -// test counterparty doesnt return fundingsigned |
0 commit comments