Skip to content

Commit

Permalink
fix amounts
Browse files Browse the repository at this point in the history
  • Loading branch information
DanGould committed Sep 30, 2024
1 parent db7c4bb commit c943682
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 36 deletions.
1 change: 0 additions & 1 deletion src/wallet/psbt_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,6 @@ impl BdkWalletVisitor for PsbtBuilder<AcceptingCurrentKeychainState> {
.push(((payout_id, destination, satoshis), 0));
}

dbg!("wantsOutputs: {:?}", &self.cfg.wants_outputs);
// add foreign payjoin utxos
// *try* Handle payjoin to see what happens. visit_bdk_wallet will actually use the state machine
let payjoin_original_psbt = if let Some(ref wants_outputs) = self.cfg.wants_outputs {
Expand Down
2 changes: 1 addition & 1 deletion tests/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ pub fn create_funded_psbt(
let outputs = std::collections::HashMap::from([(addr.to_string(), amount)]);
let options = bitcoincore_rpc::json::WalletCreateFundedPsbtOptions {
lock_unspent: Some(true),
fee_rate: Some(Amount::from_sat(100)),
fee_rate: Some(Amount::from_sat(1000)),
..Default::default()
};
Ok(bitcoind
Expand Down
59 changes: 25 additions & 34 deletions tests/psbt_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -460,15 +460,10 @@ async fn build_psbt_with_payjoin() -> anyhow::Result<()> {
let domain_addr = domain_current_keychain.new_external_address().await?;
let domain_change_address = domain_current_keychain.new_internal_address().await?;
let bitcoind = helpers::bitcoind_client().await?;
let wallet_funding = 700_000_000;
let wallet_funding_sats = Satoshis::from(wallet_funding);
let domain_funding = 300_000_000;
let domain_funding_sats = Satoshis::from(domain_funding);
dbg!("funding");
let tx_id = helpers::fund_addr(&bitcoind, &domain_addr, wallet_funding)?;
helpers::fund_addr(
&bitcoind,
&domain_addr.address,
wallet_funding - 200_000_000,
)?;
let tx_id = helpers::fund_addr(&bitcoind, &domain_addr, domain_funding)?;
dbg!("funded");
helpers::gen_blocks(&bitcoind, 10)?;
while !find_tx_id(&pool, domain_current_keychain_id, tx_id).await? {
Expand All @@ -479,51 +474,47 @@ async fn build_psbt_with_payjoin() -> anyhow::Result<()> {
// Build WantsOutputs for payjoin
// 1st build original_psbt for deposit depositor -> domain, not part of the builder (or a separate builder)
let deposit_addr = domain_current_keychain.new_external_address().await?;
let deposit_sats_u64 = 500_000_000;
let deposit_sats = Satoshis::from(deposit_sats_u64);
let deposit_funding = 200_000_000;
let deposit_funding_sats = Satoshis::from(deposit_funding);
dbg!("creating funded psbt");
let deposit_original_psbt =
helpers::create_funded_psbt(&bitcoind, &deposit_addr.address, deposit_sats.into())?;
helpers::create_funded_psbt(&bitcoind, &deposit_addr.address, deposit_funding)?;
use std::str::FromStr;
let deposit_original_psbt =
payjoin::bitcoin::Psbt::from_str(&deposit_original_psbt.to_string())?;
let owned_vout = deposit_original_psbt
let domain_owned_vout = deposit_original_psbt
.unsigned_tx
.output
.iter()
.position(|o| o.value.to_sat() == deposit_sats_u64)
.position(|o| o.value.to_sat() == deposit_funding)
.unwrap();
let change_vout = if owned_vout == 0 { 1 } else { 0 };
let change_vout = if domain_owned_vout == 0 { 1 } else { 0 };
let wants_outputs = WantsOutputs::for_psbt_mutation(
deposit_original_psbt,
change_vout,
vec![owned_vout],
payjoin::bitcoin::Address::from_str(&domain_addr.address.to_string())?.assume_checked(),
vec![domain_owned_vout],
payjoin::bitcoin::Address::from_str(&deposit_addr.address.to_string())?.assume_checked(),
);

let fee = FeeRate::from_sat_per_vb(1.0);
let cfg = PsbtBuilderConfig::builder()
.consolidate_deprecated_keychains(true)
.consolidate_deprecated_keychains(false) // for simplicity, we don't consolidate here
.fee_rate(fee)
.wants_outputs(Some(wants_outputs))
.build()
.unwrap();
let builder = PsbtBuilder::new(cfg);

let domain_wallet_id = WalletId::new();
let withdrawal_amount = Satoshis::from(100_000_000);
let destination: Address = domain_current_keychain
.new_external_address()
.await?
.address
.into();
let withdrawal_funding = 400_000_000;
let withdrawal_funding_sats = Satoshis::from(withdrawal_funding);
// Send funds from domain to an address associated with neither depositor nor withdrawer
let withdrawer_destination =
Address::parse_from_trusted_source("mgWUuj1J1N882jmqFxtDepEC73Rr22E9GU");
let payouts = vec![(
Uuid::new_v4(),
withdrawer_destination.clone(),
withdrawal_amount,
withdrawal_funding_sats,
)];
let builder = builder
.wallet_payouts(domain_wallet_id, payouts)
Expand All @@ -544,14 +535,14 @@ async fn build_psbt_with_payjoin() -> anyhow::Result<()> {
provisional_proposal,
..
} = builder.finish();
// assert_eq!(
// included_payouts
// .get(&depositor_wallet_id)
// .expect("wallet not included in payouts")
// .len(),
// 1
// );
// assert_eq!(wallet_totals.len(), 1);
assert_eq!(
included_payouts
.get(&domain_wallet_id)
.expect("wallet not included in payouts")
.len(),
1
);
assert_eq!(wallet_totals.len(), 1);
// let other_wallet_total = wallet_totals.get(&depositor_wallet_id).unwrap();
// assert!(other_wallet_total.change_outpoint.is_none());
// assert_eq!(other_wallet_total.change_address, other_change_address);
Expand Down Expand Up @@ -582,8 +573,8 @@ async fn build_psbt_with_payjoin() -> anyhow::Result<()> {
// acc + total.total_fee_satoshis
// });
// assert_eq!(total_summary_fees, fee_satoshis);
// assert!(unsigned_psbt.inputs.len() >= 1);
// assert_eq!(unsigned_psbt.outputs.len(), 2);
assert!(unsigned_psbt.inputs.len() >= 1); // from payjoin sender only
assert_eq!(unsigned_psbt.outputs.len(), 3); // withdrawal, sender change, domain change

let mut bitcoind_client = helpers::bitcoind_signing_client().await?;
dbg!("signing with bitcoind");
Expand Down

0 comments on commit c943682

Please sign in to comment.