Calculate max_giveable based on spending script size

This commit is contained in:
Thomas Eizinger 2021-03-01 15:35:45 +11:00
parent 7251588e79
commit 9f0b1c5cbe
No known key found for this signature in database
GPG Key ID: 651AC83A6C6C8B96
3 changed files with 16 additions and 8 deletions

View File

@ -19,7 +19,7 @@ use std::{path::Path, sync::Arc, time::Duration};
use structopt::StructOpt;
use swap::{
bitcoin,
bitcoin::Amount,
bitcoin::{Amount, TxLock},
cli::{
command::{Arguments, Command},
config::{read_config, Config},
@ -112,7 +112,7 @@ async fn main() -> Result<()> {
debug!("Received {}", bitcoin_wallet.balance().await?);
}
let send_bitcoin = bitcoin_wallet.max_giveable().await?;
let send_bitcoin = bitcoin_wallet.max_giveable(TxLock::script_size()).await?;
info!("Swapping {} ...", send_bitcoin);

View File

@ -3,7 +3,9 @@ use crate::bitcoin::{
};
use ::bitcoin::{util::psbt::PartiallySignedTransaction, OutPoint, TxIn, TxOut, Txid};
use anyhow::Result;
use ecdsa_fun::fun::Point;
use miniscript::{Descriptor, DescriptorTrait};
use rand::thread_rng;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
@ -42,6 +44,16 @@ impl TxLock {
OutPoint::new(self.txid(), self.lock_output_vout() as u32)
}
/// Calculate the size of the script used by this transaction.
pub fn script_size() -> usize {
build_shared_output_descriptor(
Point::random(&mut thread_rng()),
Point::random(&mut thread_rng()),
)
.script_pubkey()
.len()
}
/// Retreive the index of the locked output in the transaction outputs
/// vector
fn lock_output_vout(&self) -> usize {

View File

@ -132,17 +132,13 @@ impl Wallet {
/// We define this as the maximum amount we can pay to a single output,
/// already accounting for the fees we need to spend to get the
/// transaction confirmed.
pub async fn max_giveable(&self) -> Result<Amount> {
pub async fn max_giveable(&self, locking_script_size: usize) -> Result<Amount> {
let wallet = self.inner.lock().await;
let mut tx_builder = wallet.build_tx();
// create a dummy script to make the txbuilder pass
// we don't intend to send this transaction, we just want to know the max amount
// we can spend
let dummy_script = Script::default();
let dummy_script = Script::from(vec![0u8; locking_script_size]);
tx_builder.set_single_recipient(dummy_script);
tx_builder.drain_wallet();
tx_builder.fee_rate(self.select_feerate());
let (_, details) = tx_builder.finish()?;