2024-06-25 14:43:57 +01:00
|
|
|
use crate::bitcoin::clients;
|
2024-07-24 17:33:40 +01:00
|
|
|
use bdk_wallet::bitcoin::{Amount, Network};
|
|
|
|
|
use tracing_subscriber::filter::EnvFilter;
|
|
|
|
|
use tracing_subscriber::util::SubscriberInitExt;
|
|
|
|
|
use tracing_subscriber::{fmt, layer::SubscriberExt};
|
2024-06-25 14:43:57 +01:00
|
|
|
|
2024-07-25 12:34:26 +01:00
|
|
|
use super::clients::esplora::EsploraWallet;
|
|
|
|
|
|
2024-07-24 16:46:02 +01:00
|
|
|
pub(crate) async fn simple_transfer() -> Result<(), anyhow::Error> {
|
2024-07-25 12:34:26 +01:00
|
|
|
let (mut dave, mut sammy) = setup().await?;
|
2024-07-24 17:33:40 +01:00
|
|
|
|
2024-07-25 12:34:26 +01:00
|
|
|
let send_amount = Amount::from_sat(500);
|
|
|
|
|
ensure_enough_sats(&dave, send_amount);
|
|
|
|
|
|
|
|
|
|
let sammy_address = sammy.next_unused_address()?.address;
|
|
|
|
|
let tx = dave.build_and_sign_send_tx(sammy_address, send_amount)?;
|
|
|
|
|
dave.broadcast(&tx).await?;
|
2024-06-25 14:43:57 +01:00
|
|
|
|
2024-07-25 12:34:26 +01:00
|
|
|
Ok(())
|
|
|
|
|
}
|
2024-06-25 14:43:57 +01:00
|
|
|
|
2024-07-25 12:34:26 +01:00
|
|
|
async fn setup() -> Result<(EsploraWallet, EsploraWallet), anyhow::Error> {
|
|
|
|
|
tracing_setup();
|
|
|
|
|
let mut dave = clients::esplora::create_wallet("dave", Network::Signet)?;
|
|
|
|
|
let mut sammy = clients::esplora::create_wallet("sammy", Network::Signet)?;
|
2024-07-24 17:33:40 +01:00
|
|
|
let _ = dave.balance();
|
2024-06-25 14:58:53 +01:00
|
|
|
dave.sync().await?;
|
2024-07-24 18:14:08 +01:00
|
|
|
let _ = dave.balance();
|
2024-07-24 17:33:40 +01:00
|
|
|
let _sammy = sammy.balance();
|
2024-06-25 15:18:30 +01:00
|
|
|
sammy.sync().await?;
|
2024-07-24 18:14:08 +01:00
|
|
|
let _ = sammy.balance();
|
2024-07-25 12:34:26 +01:00
|
|
|
Ok((dave, sammy))
|
2024-07-24 18:14:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Exit if the wallet does not have enough sats to send.
|
2024-07-25 12:34:26 +01:00
|
|
|
fn ensure_enough_sats(wallet: &EsploraWallet, send_amount: bitcoin::Amount) {
|
2024-07-24 18:14:08 +01:00
|
|
|
if wallet.balance().total() < send_amount {
|
2024-07-24 17:33:40 +01:00
|
|
|
tracing::error!(
|
|
|
|
|
"Please send at least {} sats to the receiving address. Exiting.",
|
2024-06-25 14:43:57 +01:00
|
|
|
send_amount
|
|
|
|
|
);
|
|
|
|
|
std::process::exit(0);
|
|
|
|
|
}
|
2024-06-25 14:13:06 +01:00
|
|
|
}
|
2024-07-24 16:46:02 +01:00
|
|
|
|
|
|
|
|
pub(crate) async fn htlc() -> anyhow::Result<()> {
|
2024-07-25 12:34:26 +01:00
|
|
|
let (mut dave, mut sammy) = setup().await?;
|
2024-07-24 16:52:35 +01:00
|
|
|
|
2024-07-25 12:34:26 +01:00
|
|
|
// format a new commitment transaction like in Lightning
|
|
|
|
|
let mut commitment_builder = dave.build_tx()?;
|
|
|
|
|
let amount = Amount::from_sat(500);
|
|
|
|
|
let recipient = sammy.next_unused_address()?.script_pubkey();
|
|
|
|
|
commitment_builder.add_recipient(recipient, amount);
|
|
|
|
|
commitment_builder.enable_rbf();
|
|
|
|
|
let psbt = commitment_builder
|
|
|
|
|
.finish()
|
|
|
|
|
.expect("unable to build commitment");
|
|
|
|
|
|
|
|
|
|
// sign the commitment transaction
|
|
|
|
|
let mut dave_psbt = dave.sign(&mut psbt.clone(), false)?;
|
|
|
|
|
let sammy_psbt = sammy.sign(&mut psbt.clone(), false)?;
|
|
|
|
|
|
|
|
|
|
dave_psbt
|
|
|
|
|
.combine(sammy_psbt)
|
|
|
|
|
.expect("problem combining bitcoin PSBTs"); // these guys love mutability
|
|
|
|
|
|
|
|
|
|
let finalized = dave
|
|
|
|
|
.wallet()
|
|
|
|
|
.finalize_psbt(&mut dave_psbt, bdk_wallet::SignOptions::default())
|
|
|
|
|
.expect("couldn't finalize");
|
|
|
|
|
|
|
|
|
|
assert!(finalized);
|
|
|
|
|
let tx = dave_psbt.extract_tx()?;
|
|
|
|
|
|
|
|
|
|
let _ = dave.broadcast(&tx).await.expect("couldn't broadcast");
|
2024-07-24 16:52:35 +01:00
|
|
|
|
2024-07-25 12:34:26 +01:00
|
|
|
let _ = sammy.sync();
|
|
|
|
|
sammy.balance();
|
2024-07-24 16:46:02 +01:00
|
|
|
Ok(())
|
|
|
|
|
}
|
2024-07-24 17:33:40 +01:00
|
|
|
|
|
|
|
|
fn tracing_setup() {
|
|
|
|
|
tracing_subscriber::registry()
|
|
|
|
|
.with(fmt::layer())
|
|
|
|
|
.with(EnvFilter::from_default_env())
|
|
|
|
|
.init();
|
|
|
|
|
|
|
|
|
|
tracing::info!("Tracing initialized.");
|
|
|
|
|
}
|