What an odyssey! Bitcoin sends now work.
This commit is contained in:
@@ -1,12 +1,15 @@
|
|||||||
use crate::{keys, utils};
|
use crate::{keys, utils};
|
||||||
|
|
||||||
use bdk::bitcoin::base64;
|
use bdk::bitcoin::base64;
|
||||||
use bdk::bitcoin::psbt::PartiallySignedTransaction;
|
use bdk::bitcoin::psbt::{PartiallySignedTransaction, Psbt};
|
||||||
use bdk::blockchain::Progress;
|
use bdk::blockchain::{Blockchain, Progress};
|
||||||
use bdk::database::MemoryDatabase;
|
use bdk::database::MemoryDatabase;
|
||||||
use bdk::wallet::AddressIndex::{self, New};
|
use bdk::wallet::AddressIndex::{self, New};
|
||||||
|
use bdk::wallet::AddressInfo;
|
||||||
use bdk::{blockchain::ElectrumBlockchain, electrum_client, SyncOptions};
|
use bdk::{blockchain::ElectrumBlockchain, electrum_client, SyncOptions};
|
||||||
use bdk::{FeeRate, SignOptions, TransactionDetails, Wallet};
|
use bdk::{FeeRate, SignOptions, TransactionDetails, Wallet};
|
||||||
|
use toml::to_string;
|
||||||
|
use tracing::field::display;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct CustomProgress;
|
pub struct CustomProgress;
|
||||||
@@ -20,12 +23,20 @@ impl Progress for CustomProgress {
|
|||||||
|
|
||||||
pub async fn run() -> Result<(), anyhow::Error> {
|
pub async fn run() -> Result<(), anyhow::Error> {
|
||||||
let dave = utils::home(&"dave".to_string());
|
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 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
|
// 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();
|
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(
|
let blockchain = ElectrumBlockchain::from(electrum_client::Client::new(
|
||||||
"ssl://electrum.blockstream.info:60002",
|
"ssl://electrum.blockstream.info:60002",
|
||||||
@@ -34,38 +45,45 @@ pub async fn run() -> Result<(), anyhow::Error> {
|
|||||||
println!("Syncing...");
|
println!("Syncing...");
|
||||||
dave_wallet.sync(&blockchain, SyncOptions::default())?;
|
dave_wallet.sync(&blockchain, SyncOptions::default())?;
|
||||||
|
|
||||||
println!(
|
display_balance(&dave_wallet);
|
||||||
"Wallet balance for {} after syncing: {:?} sats on network {}",
|
display_balance(&sammy_wallet);
|
||||||
dave_wallet.get_address(bdk::wallet::AddressIndex::Peek(0))?,
|
|
||||||
dave_wallet.get_balance()?,
|
|
||||||
dave_wallet.network()
|
|
||||||
);
|
|
||||||
|
|
||||||
let transactions = dave_wallet.list_transactions(false)?;
|
let (mut psbt, details) =
|
||||||
println!("Transaction History: {:?}", transactions);
|
build_sending_tx(&dave_wallet, sammy_wallet.get_address(New)?).expect("psbt build error");
|
||||||
|
|
||||||
let (mut psbt, details) = build_sending_tx(&dave_wallet).expect("psbt fukked");
|
|
||||||
|
|
||||||
println!("Transaction details: {:#?}", details);
|
println!("Transaction details: {:#?}", details);
|
||||||
println!("Unsigned PSBT: {}", base64::encode(psbt.serialize()));
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn display_balance(wallet: &Wallet<MemoryDatabase>) {
|
||||||
|
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(
|
fn build_sending_tx(
|
||||||
wallet: &Wallet<MemoryDatabase>,
|
wallet: &Wallet<MemoryDatabase>,
|
||||||
|
recipient: AddressInfo,
|
||||||
) -> anyhow::Result<(PartiallySignedTransaction, TransactionDetails), anyhow::Error> {
|
) -> anyhow::Result<(PartiallySignedTransaction, TransactionDetails), anyhow::Error> {
|
||||||
let send_to = wallet.get_address(New)?;
|
|
||||||
|
|
||||||
let mut builder = wallet.build_tx();
|
let mut builder = wallet.build_tx();
|
||||||
builder
|
builder
|
||||||
.add_recipient(send_to.script_pubkey(), 500)
|
.add_recipient(recipient.script_pubkey(), 1000)
|
||||||
.enable_rbf()
|
.enable_rbf()
|
||||||
.do_not_spend_change()
|
.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()?)
|
Ok(builder.finish()?)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user