@@ -32,7 +32,7 @@ mod integration {
32
32
#[ test]
33
33
fn v1_to_v1 ( ) -> Result < ( ) , BoxError > {
34
34
init_tracing ( ) ;
35
- let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( ) ?;
35
+ let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( None , None ) ?;
36
36
37
37
// Receiver creates the payjoin URI
38
38
let pj_receiver_address = receiver. get_new_address ( None , None ) ?. assume_checked ( ) ;
@@ -79,6 +79,48 @@ mod integration {
79
79
) ;
80
80
Ok ( ( ) )
81
81
}
82
+
83
+ #[ test]
84
+ fn disallow_mixed_input_scripts ( ) -> Result < ( ) , BoxError > {
85
+ init_tracing ( ) ;
86
+ let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver (
87
+ Some ( AddressType :: Bech32 ) ,
88
+ Some ( AddressType :: P2shSegwit ) ,
89
+ ) ?;
90
+
91
+ // Receiver creates the payjoin URI
92
+ let pj_receiver_address = receiver. get_new_address ( None , None ) ?. assume_checked ( ) ;
93
+ let pj_uri = PjUriBuilder :: new ( pj_receiver_address, EXAMPLE_URL . to_owned ( ) )
94
+ . amount ( Amount :: ONE_BTC )
95
+ . build ( ) ;
96
+
97
+ // **********************
98
+ // Inside the Sender:
99
+ // Sender create a funded PSBT (not broadcasted) to address with amount given in the pj_uri
100
+ let uri = Uri :: from_str ( & pj_uri. to_string ( ) )
101
+ . unwrap ( )
102
+ . assume_checked ( )
103
+ . check_pj_supported ( )
104
+ . unwrap ( ) ;
105
+ let psbt = build_original_psbt ( & sender, & uri) ?;
106
+ debug ! ( "Original psbt: {:#?}" , psbt) ;
107
+ let ( req, ctx) = RequestBuilder :: from_psbt_and_uri ( psbt, uri) ?
108
+ . build_with_additional_fee ( Amount :: from_sat ( 10000 ) , None , FeeRate :: ZERO , false ) ?
109
+ . extract_v1 ( ) ?;
110
+ let headers = HeaderMock :: new ( & req. body , req. content_type ) ;
111
+
112
+ // **********************
113
+ // Inside the Receiver:
114
+ // this data would transit from one party to another over the network in production
115
+ let response = handle_v1_pj_request ( req, headers, & receiver, None , None , None ) ;
116
+ // this response would be returned as http response to the sender
117
+
118
+ // **********************
119
+ // Inside the Sender:
120
+ // Sender checks error due to mixed input scripts
121
+ assert ! ( ctx. process_response( & mut response. as_bytes( ) ) . is_err( ) ) ;
122
+ Ok ( ( ) )
123
+ }
82
124
}
83
125
84
126
#[ cfg( feature = "danger-local-https" ) ]
@@ -165,7 +207,7 @@ mod integration {
165
207
directory : Url ,
166
208
cert_der : Vec < u8 > ,
167
209
) -> Result < ( ) , BoxError > {
168
- let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( ) ?;
210
+ let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( None , None ) ?;
169
211
let agent = Arc :: new ( http_agent ( cert_der. clone ( ) ) ?) ;
170
212
wait_for_service_ready ( ohttp_relay. clone ( ) , agent. clone ( ) ) . await . unwrap ( ) ;
171
213
wait_for_service_ready ( directory. clone ( ) , agent. clone ( ) ) . await . unwrap ( ) ;
@@ -235,7 +277,7 @@ mod integration {
235
277
directory : Url ,
236
278
cert_der : Vec < u8 > ,
237
279
) -> Result < ( ) , BoxError > {
238
- let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( ) ?;
280
+ let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( None , None ) ?;
239
281
let agent = Arc :: new ( http_agent ( cert_der. clone ( ) ) ?) ;
240
282
wait_for_service_ready ( ohttp_relay. clone ( ) , agent. clone ( ) ) . await . unwrap ( ) ;
241
283
wait_for_service_ready ( directory. clone ( ) , agent. clone ( ) ) . await . unwrap ( ) ;
@@ -340,7 +382,7 @@ mod integration {
340
382
#[ test]
341
383
fn v2_to_v1 ( ) -> Result < ( ) , BoxError > {
342
384
init_tracing ( ) ;
343
- let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( ) ?;
385
+ let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( None , None ) ?;
344
386
// Receiver creates the payjoin URI
345
387
let pj_receiver_address = receiver. get_new_address ( None , None ) ?. assume_checked ( ) ;
346
388
let pj_uri = PjUriBuilder :: new ( pj_receiver_address, EXAMPLE_URL . to_owned ( ) , None , None )
@@ -408,7 +450,7 @@ mod integration {
408
450
directory : Url ,
409
451
cert_der : Vec < u8 > ,
410
452
) -> Result < ( ) , BoxError > {
411
- let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( ) ?;
453
+ let ( _bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( None , None ) ?;
412
454
let agent: Arc < Client > = Arc :: new ( http_agent ( cert_der. clone ( ) ) ?) ;
413
455
wait_for_service_ready ( ohttp_relay. clone ( ) , agent. clone ( ) ) . await ?;
414
456
wait_for_service_ready ( directory. clone ( ) , agent. clone ( ) ) . await ?;
@@ -745,7 +787,7 @@ mod integration {
745
787
#[ test]
746
788
fn receiver_consolidates_utxos ( ) -> Result < ( ) , BoxError > {
747
789
init_tracing ( ) ;
748
- let ( bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( ) ?;
790
+ let ( bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( None , None ) ?;
749
791
// Generate more UTXOs for the receiver
750
792
let receiver_address =
751
793
receiver. get_new_address ( None , Some ( AddressType :: Bech32 ) ) ?. assume_checked ( ) ;
@@ -833,7 +875,7 @@ mod integration {
833
875
#[ test]
834
876
fn receiver_forwards_payment ( ) -> Result < ( ) , BoxError > {
835
877
init_tracing ( ) ;
836
- let ( bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( ) ?;
878
+ let ( bitcoind, sender, receiver) = init_bitcoind_sender_receiver ( None , None ) ?;
837
879
let third_party = bitcoind. create_wallet ( "third-party" ) ?;
838
880
839
881
// Receiver creates the payjoin URI
@@ -929,6 +971,8 @@ mod integration {
929
971
}
930
972
931
973
fn init_bitcoind_sender_receiver (
974
+ sender_address_type : Option < AddressType > ,
975
+ receiver_address_type : Option < AddressType > ,
932
976
) -> Result < ( bitcoind:: BitcoinD , bitcoincore_rpc:: Client , bitcoincore_rpc:: Client ) , BoxError >
933
977
{
934
978
let bitcoind_exe =
@@ -938,10 +982,9 @@ mod integration {
938
982
let bitcoind = bitcoind:: BitcoinD :: with_conf ( bitcoind_exe, & conf) ?;
939
983
let receiver = bitcoind. create_wallet ( "receiver" ) ?;
940
984
let receiver_address =
941
- receiver. get_new_address ( None , Some ( AddressType :: Bech32 ) ) ?. assume_checked ( ) ;
985
+ receiver. get_new_address ( None , receiver_address_type ) ?. assume_checked ( ) ;
942
986
let sender = bitcoind. create_wallet ( "sender" ) ?;
943
- let sender_address =
944
- sender. get_new_address ( None , Some ( AddressType :: Bech32 ) ) ?. assume_checked ( ) ;
987
+ let sender_address = sender. get_new_address ( None , sender_address_type) ?. assume_checked ( ) ;
945
988
bitcoind. client . generate_to_address ( 1 , & receiver_address) ?;
946
989
bitcoind. client . generate_to_address ( 101 , & sender_address) ?;
947
990
0 commit comments