Skip to content

Commit

Permalink
fix integration and cli example
Browse files Browse the repository at this point in the history
  • Loading branch information
jbesraa committed Jul 31, 2023
1 parent 9f51146 commit 579bbda
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 57 deletions.
60 changes: 31 additions & 29 deletions payjoin-cli/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -286,20 +286,21 @@ impl App {
})?;
log::trace!("check4");

let mut payjoin = payjoin.identify_receiver_outputs(|output_script| {
if let Ok(address) = bitcoin::Address::from_script(output_script, network) {
self.bitcoind
.get_address_info(&address)
.map(|info| info.is_mine.unwrap_or(false))
.map_err(|e| Error::Server(e.into()))
} else {
Ok(false)
}
})?;
let mut provisional_payjoin: ProvisionalProposal =
payjoin.identify_receiver_outputs(|output_script| {
if let Ok(address) = bitcoin::Address::from_script(output_script, network) {
self.bitcoind
.get_address_info(&address)
.map(|info| info.is_mine.unwrap_or(false))
.map_err(|e| Error::Server(e.into()))
} else {
Ok(false)
}
})?;

if !self.config.sub_only {
// Select receiver payjoin inputs.
_ = try_contributing_inputs(&mut payjoin, &self.bitcoind)
_ = try_contributing_inputs(&mut provisional_payjoin, &self.bitcoind)
.map_err(|e| log::warn!("Failed to contribute inputs: {}", e));
}

Expand All @@ -308,24 +309,25 @@ impl App {
.get_new_address(None, None)
.map_err(|e| Error::Server(e.into()))?
.assume_checked();
payjoin.substitute_output_address(receiver_substitute_address);

let payjoin_proposal_psbt = payjoin.apply_fee(Some(1))?;

log::debug!("Extracted PSBT: {:#?}", payjoin_proposal_psbt);
// Sign payjoin psbt
let payjoin_base64_string = base64::encode(&payjoin_proposal_psbt.serialize());
// `wallet_process_psbt` adds available utxo data and finalizes
let payjoin_proposal_psbt = self
.bitcoind
.wallet_process_psbt(&payjoin_base64_string, None, None, Some(false))
.map_err(|e| Error::Server(e.into()))?
.psbt;
let payjoin_proposal_psbt = Psbt::from_str(&payjoin_proposal_psbt)
.context("Failed to parse PSBT")
.map_err(|e| Error::Server(e.into()))?;
let payjoin_proposal = payjoin.prepare_psbt(payjoin_proposal_psbt)?;
let payjoin_proposal_psbt = payjoin_proposal.get_payjoin_psbt();
provisional_payjoin.substitute_output_address(receiver_substitute_address);

let final_payjoin = provisional_payjoin
.finalize_proposal(
|psbt: &Psbt| {
self.bitcoind
.wallet_process_psbt(
&bitcoin::base64::encode(psbt.serialize()),
None,
None,
Some(false),
)
.map(|res| res.psbt)
.map_err(|e| Error::Server(e.into()))
},
Some(1),
)
.unwrap();
let payjoin_proposal_psbt = final_payjoin.get_payjoin_psbt();
log::debug!("Receiver's Payjoin proposal PSBT Rsponse: {:#?}", payjoin_proposal_psbt);

let payload = base64::encode(&payjoin_proposal_psbt.serialize());
Expand Down
23 changes: 11 additions & 12 deletions payjoin/src/receive/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,6 @@ mod error;
mod optional_parameters;

use bitcoind::bitcoincore_rpc;

Check warning on line 279 in payjoin/src/receive/mod.rs

View workflow job for this annotation

GitHub Actions / test-lib (nightly)

unused import: `bitcoind::bitcoincore_rpc`

Check warning on line 279 in payjoin/src/receive/mod.rs

View workflow job for this annotation

GitHub Actions / test-lib (stable)

unused import: `bitcoind::bitcoincore_rpc`

Check warning on line 279 in payjoin/src/receive/mod.rs

View workflow job for this annotation

GitHub Actions / build-payjoin-cli (nightly)

unused import: `bitcoind::bitcoincore_rpc`

Check warning on line 279 in payjoin/src/receive/mod.rs

View workflow job for this annotation

GitHub Actions / build-payjoin-cli (stable)

unused import: `bitcoind::bitcoincore_rpc`
use bitcoind::bitcoincore_rpc::core_rpc_json::WalletProcessPsbtResult;
pub use error::{Error, RequestError, SelectionError};
use error::{InternalRequestError, InternalSelectionError};
use optional_parameters::Params;
Expand Down Expand Up @@ -724,10 +723,7 @@ impl ProvisionalProposal {
/// this is kind of a "build_proposal" step before we sign and finalize and extract
///
/// WARNING: DO NOT ALTER INPUTS OR OUTPUTS AFTER THIS STEP
pub fn apply_fee(
&mut self,
min_feerate_sat_per_vb: Option<u64>,
) -> Result<&Psbt, RequestError> {
fn apply_fee(&mut self, min_feerate_sat_per_vb: Option<u64>) -> Result<&Psbt, RequestError> {
let min_feerate =
FeeRate::from_sat_per_vb_unchecked(min_feerate_sat_per_vb.unwrap_or_default());
log::trace!("min_feerate: {:?}", min_feerate);
Expand Down Expand Up @@ -777,7 +773,7 @@ impl ProvisionalProposal {
/// and return a PSBT that can produce a consensus-valid transaction that the sender will accept.
///
/// wallet_process_psbt should sign and finalize receiver inputs
pub fn prepare_psbt(mut self, processed_psbt: Psbt) -> Result<PayjoinProposal, RequestError> {
fn prepare_psbt(mut self, processed_psbt: Psbt) -> Result<PayjoinProposal, RequestError> {
self.payjoin_psbt = processed_psbt;
log::trace!("Preparing PSBT {:#?}", self.payjoin_psbt);
for input in self.payjoin_psbt.inputs_mut() {
Expand Down Expand Up @@ -817,16 +813,19 @@ impl ProvisionalProposal {

pub fn finalize_proposal(
mut self,
wallet_process_psbt: impl Fn(&str) -> Result<WalletProcessPsbtResult, bitcoincore_rpc::Error>,
wallet_process_psbt: impl Fn(&Psbt) -> Result<std::string::String, Error>,
min_feerate_sat_per_vb: Option<u64>,
) -> Result<PayjoinProposal, RequestError> {
let payjoin_proposal_psbt: &Psbt = self.apply_fee(min_feerate_sat_per_vb)?;
let payjoin_base64_string = bitcoin::base64::encode(&payjoin_proposal_psbt.serialize());
let payjoin_proposal_psbt = match wallet_process_psbt(&payjoin_base64_string) {
Ok(p) => p.psbt,
Err(e) => return Err(RequestError::from(InternalRequestError::BitcoinCoreRpc(e))),
let payjoin_proposal_psbt = match wallet_process_psbt(payjoin_proposal_psbt) {
Ok(p) => p,
Err(_) => {
return Err(RequestError::from(InternalRequestError::PsbtFinalizingError(
"wallet_process_psbt failed",
)));
}
};
let payjoin_proposal_psbt = match Psbt::from_str(&payjoin_proposal_psbt) {
let payjoin_proposal_psbt = match Psbt::from_str(&payjoin_proposal_psbt.to_string()) {
Ok(p) => p,
Err(e) => return Err(RequestError::from(InternalRequestError::PsbtParseError(e))),
};
Expand Down
36 changes: 20 additions & 16 deletions payjoin/tests/integration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ mod integration {
use payjoin::bitcoin::base64;
use payjoin::receive::Headers;
use payjoin::send::Request;
use payjoin::{bitcoin, PjUriExt, Uri, UriExt};
use payjoin::{bitcoin, Error, PjUriExt, Uri, UriExt};

#[test]
fn integration_test() {
Expand Down Expand Up @@ -200,20 +200,24 @@ mod integration {
let receiver_substitute_address =
receiver.get_new_address(None, None).unwrap().assume_checked();
payjoin.substitute_output_address(receiver_substitute_address);

let payjoin_proposal_psbt = payjoin.apply_fee(None).unwrap();

// Sign payjoin psbt
let payjoin_base64_string = base64::encode(&payjoin_proposal_psbt.serialize());
let payjoin_proposal_psbt = receiver
.wallet_process_psbt(&payjoin_base64_string, None, None, Some(false))
.unwrap()
.psbt;
let payjoin_proposal_psbt = Psbt::from_str(&payjoin_proposal_psbt).unwrap();

let payjoin_proposal_psbt = payjoin.prepare_psbt(payjoin_proposal_psbt).unwrap();
debug!("Receiver's Payjoin proposal PSBT: {:#?}", payjoin_proposal_psbt.get_payjoin_psbt());

base64::encode(&payjoin_proposal_psbt.get_payjoin_psbt().serialize())
let payjoin_proposal = payjoin
.finalize_proposal(
|psbt: &Psbt| {
receiver
.wallet_process_psbt(
&bitcoin::base64::encode(psbt.serialize()),
None,
None,
Some(false),
)
.map(|res| res.psbt)
.map_err(|e| Error::Server(e.into()))
},
Some(1),
)
.unwrap();
let psbt = payjoin_proposal.get_payjoin_psbt();
debug!("Receiver's Payjoin proposal PSBT: {:#?}", &psbt);
base64::encode(&psbt.serialize())
}
}

0 comments on commit 579bbda

Please sign in to comment.