From d59fa78cd7fea7496e6c3c0b3e53e731ebbb625e Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 24 Jun 2024 16:31:03 +0100 Subject: [PATCH] What an odyssey! Bitcoin sends now work. --- side-node/src/clients/btc_other_rpc.rs | 60 +++++++++++++++++--------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/side-node/src/clients/btc_other_rpc.rs b/side-node/src/clients/btc_other_rpc.rs index 9390ac0..4e3efd2 100644 --- a/side-node/src/clients/btc_other_rpc.rs +++ b/side-node/src/clients/btc_other_rpc.rs @@ -1,12 +1,15 @@ use crate::{keys, utils}; use bdk::bitcoin::base64; -use bdk::bitcoin::psbt::PartiallySignedTransaction; -use bdk::blockchain::Progress; +use bdk::bitcoin::psbt::{PartiallySignedTransaction, Psbt}; +use bdk::blockchain::{Blockchain, Progress}; use bdk::database::MemoryDatabase; use bdk::wallet::AddressIndex::{self, New}; +use bdk::wallet::AddressInfo; use bdk::{blockchain::ElectrumBlockchain, electrum_client, SyncOptions}; use bdk::{FeeRate, SignOptions, TransactionDetails, Wallet}; +use toml::to_string; +use tracing::field::display; #[derive(Debug)] pub struct CustomProgress; @@ -20,12 +23,20 @@ impl Progress for CustomProgress { pub async fn run() -> Result<(), anyhow::Error> { let dave = utils::home(&"dave".to_string()); + let sammy = utils::home(&"sammy".to_string()); let dave_wallet = keys::bitcoin::load_from_file(&dave).unwrap(); + let sammy_wallet = keys::bitcoin::load_from_file(&sammy).unwrap(); // Verify explicitly that the address is derived as expected - let expected_address = "tb1q88e45m4akrg2y00n4077vn90q8qw0svz7dss6k"; + let dave_expected_address = "tb1q88e45m4akrg2y00n4077vn90q8qw0svz7dss6k"; let derived_address = dave_wallet.get_address(AddressIndex::Peek(0))?.to_string(); - assert_eq!(expected_address, derived_address); + assert_eq!(dave_expected_address, derived_address); + + let dave_address = dave_wallet.get_address(AddressIndex::Peek(0))?.to_string(); + let sammy_address = sammy_wallet.get_address(AddressIndex::Peek(0))?.to_string(); + + println!("Dave's address: {}", dave_address); + println!("Sammy's address: {}", sammy_address); let blockchain = ElectrumBlockchain::from(electrum_client::Client::new( "ssl://electrum.blockstream.info:60002", @@ -34,38 +45,45 @@ pub async fn run() -> Result<(), anyhow::Error> { println!("Syncing..."); dave_wallet.sync(&blockchain, SyncOptions::default())?; - println!( - "Wallet balance for {} after syncing: {:?} sats on network {}", - dave_wallet.get_address(bdk::wallet::AddressIndex::Peek(0))?, - dave_wallet.get_balance()?, - dave_wallet.network() - ); + display_balance(&dave_wallet); + display_balance(&sammy_wallet); - let transactions = dave_wallet.list_transactions(false)?; - println!("Transaction History: {:?}", transactions); - - let (mut psbt, details) = build_sending_tx(&dave_wallet).expect("psbt fukked"); + let (mut psbt, details) = + build_sending_tx(&dave_wallet, sammy_wallet.get_address(New)?).expect("psbt build error"); println!("Transaction details: {:#?}", details); println!("Unsigned PSBT: {}", base64::encode(psbt.serialize())); - // let mut psbt = Psbt::deserialize(&base64::decode(psbt).unwrap())?; - let _finalized = dave_wallet.sign(&mut psbt, SignOptions::default())?; - println!("Finalized: {}", _finalized); + let finalized = dave_wallet.sign(&mut psbt, SignOptions::default())?; + println!("Finalized: {}", finalized); + let tx_id = blockchain + .broadcast(&psbt.extract_tx()) + .expect("broadcast error"); + println!("Transaction ID: {:?}", tx_id); Ok(()) } +fn display_balance(wallet: &Wallet) { + println!( + "Wallet balance for {} after syncing: {:?} sats on network {}", + wallet + .get_address(bdk::wallet::AddressIndex::Peek(0)) + .expect("couldn't get address"), + wallet.get_balance().expect("couldn't show balance"), + wallet.network(), + ); +} + fn build_sending_tx( wallet: &Wallet, + recipient: AddressInfo, ) -> anyhow::Result<(PartiallySignedTransaction, TransactionDetails), anyhow::Error> { - let send_to = wallet.get_address(New)?; - let mut builder = wallet.build_tx(); builder - .add_recipient(send_to.script_pubkey(), 500) + .add_recipient(recipient.script_pubkey(), 1000) .enable_rbf() .do_not_spend_change() - .fee_rate(FeeRate::from_sat_per_vb(5.0)); + .fee_rate(FeeRate::from_sat_per_vb(7.0)); Ok(builder.finish()?) }