|
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