Skip to content

Commit f1b0021

Browse files
committed
test mixed input scripts v1
1 parent d6cc4bf commit f1b0021

File tree

1 file changed

+53
-10
lines changed

1 file changed

+53
-10
lines changed

payjoin/tests/integration.rs

+53-10
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ mod integration {
3232
#[test]
3333
fn v1_to_v1() -> Result<(), BoxError> {
3434
init_tracing();
35-
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver()?;
35+
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver(None, None)?;
3636

3737
// Receiver creates the payjoin URI
3838
let pj_receiver_address = receiver.get_new_address(None, None)?.assume_checked();
@@ -79,6 +79,48 @@ mod integration {
7979
);
8080
Ok(())
8181
}
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+
}
82124
}
83125

84126
#[cfg(feature = "danger-local-https")]
@@ -165,7 +207,7 @@ mod integration {
165207
directory: Url,
166208
cert_der: Vec<u8>,
167209
) -> Result<(), BoxError> {
168-
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver()?;
210+
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver(None, None)?;
169211
let agent = Arc::new(http_agent(cert_der.clone())?);
170212
wait_for_service_ready(ohttp_relay.clone(), agent.clone()).await.unwrap();
171213
wait_for_service_ready(directory.clone(), agent.clone()).await.unwrap();
@@ -235,7 +277,7 @@ mod integration {
235277
directory: Url,
236278
cert_der: Vec<u8>,
237279
) -> Result<(), BoxError> {
238-
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver()?;
280+
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver(None, None)?;
239281
let agent = Arc::new(http_agent(cert_der.clone())?);
240282
wait_for_service_ready(ohttp_relay.clone(), agent.clone()).await.unwrap();
241283
wait_for_service_ready(directory.clone(), agent.clone()).await.unwrap();
@@ -340,7 +382,7 @@ mod integration {
340382
#[test]
341383
fn v2_to_v1() -> Result<(), BoxError> {
342384
init_tracing();
343-
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver()?;
385+
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver(None, None)?;
344386
// Receiver creates the payjoin URI
345387
let pj_receiver_address = receiver.get_new_address(None, None)?.assume_checked();
346388
let pj_uri = PjUriBuilder::new(pj_receiver_address, EXAMPLE_URL.to_owned(), None, None)
@@ -408,7 +450,7 @@ mod integration {
408450
directory: Url,
409451
cert_der: Vec<u8>,
410452
) -> Result<(), BoxError> {
411-
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver()?;
453+
let (_bitcoind, sender, receiver) = init_bitcoind_sender_receiver(None, None)?;
412454
let agent: Arc<Client> = Arc::new(http_agent(cert_der.clone())?);
413455
wait_for_service_ready(ohttp_relay.clone(), agent.clone()).await?;
414456
wait_for_service_ready(directory.clone(), agent.clone()).await?;
@@ -745,7 +787,7 @@ mod integration {
745787
#[test]
746788
fn receiver_consolidates_utxos() -> Result<(), BoxError> {
747789
init_tracing();
748-
let (bitcoind, sender, receiver) = init_bitcoind_sender_receiver()?;
790+
let (bitcoind, sender, receiver) = init_bitcoind_sender_receiver(None, None)?;
749791
// Generate more UTXOs for the receiver
750792
let receiver_address =
751793
receiver.get_new_address(None, Some(AddressType::Bech32))?.assume_checked();
@@ -833,7 +875,7 @@ mod integration {
833875
#[test]
834876
fn receiver_forwards_payment() -> Result<(), BoxError> {
835877
init_tracing();
836-
let (bitcoind, sender, receiver) = init_bitcoind_sender_receiver()?;
878+
let (bitcoind, sender, receiver) = init_bitcoind_sender_receiver(None, None)?;
837879
let third_party = bitcoind.create_wallet("third-party")?;
838880

839881
// Receiver creates the payjoin URI
@@ -929,6 +971,8 @@ mod integration {
929971
}
930972

931973
fn init_bitcoind_sender_receiver(
974+
sender_address_type: Option<AddressType>,
975+
receiver_address_type: Option<AddressType>,
932976
) -> Result<(bitcoind::BitcoinD, bitcoincore_rpc::Client, bitcoincore_rpc::Client), BoxError>
933977
{
934978
let bitcoind_exe =
@@ -938,10 +982,9 @@ mod integration {
938982
let bitcoind = bitcoind::BitcoinD::with_conf(bitcoind_exe, &conf)?;
939983
let receiver = bitcoind.create_wallet("receiver")?;
940984
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();
942986
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();
945988
bitcoind.client.generate_to_address(1, &receiver_address)?;
946989
bitcoind.client.generate_to_address(101, &sender_address)?;
947990

0 commit comments

Comments
 (0)