From d0e93e260e080d1961560131992369a9e16716d9 Mon Sep 17 00:00:00 2001 From: spacebear <144076611+grizznaut@users.noreply.github.com> Date: Tue, 30 Apr 2024 21:27:07 -0400 Subject: [PATCH] respect disableoutputsubstitution payjoin-cli receiver should not substitute its output address if explicitly disallowed by the sender. --- payjoin-cli/src/app/v1.rs | 13 ++++++++----- payjoin-cli/src/app/v2.rs | 13 ++++++++----- payjoin/src/receive/mod.rs | 4 ++++ payjoin/src/receive/v2.rs | 4 ++++ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/payjoin-cli/src/app/v1.rs b/payjoin-cli/src/app/v1.rs index e991b07c5..946a9758c 100644 --- a/payjoin-cli/src/app/v1.rs +++ b/payjoin-cli/src/app/v1.rs @@ -298,11 +298,14 @@ impl App { .map_err(|e| log::warn!("Failed to contribute inputs: {}", e)); } - let receiver_substitute_address = bitcoind - .get_new_address(None, None) - .map_err(|e| Error::Server(e.into()))? - .assume_checked(); - provisional_payjoin.substitute_output_address(receiver_substitute_address); + if !provisional_payjoin.is_output_substitution_disabled() { + // Substitute the receiver output address. + let receiver_substitute_address = bitcoind + .get_new_address(None, None) + .map_err(|e| Error::Server(e.into()))? + .assume_checked(); + provisional_payjoin.substitute_output_address(receiver_substitute_address); + } let payjoin_proposal = provisional_payjoin.finalize_proposal( |psbt: &Psbt| { diff --git a/payjoin-cli/src/app/v2.rs b/payjoin-cli/src/app/v2.rs index 63175f98a..e84090b86 100644 --- a/payjoin-cli/src/app/v2.rs +++ b/payjoin-cli/src/app/v2.rs @@ -280,11 +280,14 @@ impl App { .map_err(|e| log::warn!("Failed to contribute inputs: {}", e)); } - let receiver_substitute_address = bitcoind - .get_new_address(None, None) - .map_err(|e| Error::Server(e.into()))? - .assume_checked(); - provisional_payjoin.substitute_output_address(receiver_substitute_address); + if !provisional_payjoin.is_output_substitution_disabled() { + // Substitute the receiver output address. + let receiver_substitute_address = bitcoind + .get_new_address(None, None) + .map_err(|e| Error::Server(e.into()))? + .assume_checked(); + provisional_payjoin.substitute_output_address(receiver_substitute_address); + } let payjoin_proposal = provisional_payjoin.finalize_proposal( |psbt: &Psbt| { diff --git a/payjoin/src/receive/mod.rs b/payjoin/src/receive/mod.rs index 3701a90cb..7aab95371 100644 --- a/payjoin/src/receive/mod.rs +++ b/payjoin/src/receive/mod.rs @@ -473,6 +473,10 @@ impl ProvisionalProposal { ); } + pub fn is_output_substitution_disabled(&self) -> bool { + self.params.disable_output_substitution + } + /// Just replace an output address with pub fn substitute_output_address(&mut self, substitute_address: bitcoin::Address) { self.payjoin_psbt.unsigned_tx.output[self.owned_vouts[0]].script_pubkey = diff --git a/payjoin/src/receive/v2.rs b/payjoin/src/receive/v2.rs index 5e6e10d83..223c3c367 100644 --- a/payjoin/src/receive/v2.rs +++ b/payjoin/src/receive/v2.rs @@ -443,6 +443,10 @@ impl ProvisionalProposal { self.inner.contribute_non_witness_input(tx, outpoint) } + pub fn is_output_substitution_disabled(&self) -> bool { + self.inner.is_output_substitution_disabled() + } + /// Just replace an output address with pub fn substitute_output_address(&mut self, substitute_address: bitcoin::Address) { self.inner.substitute_output_address(substitute_address)