feat: expose new methods on txbuilder
This commit is contained in:
parent
e79ce98295
commit
787152e0b4
@ -15,6 +15,8 @@ class LiveWalletTest {
|
|||||||
val update = esploraClient.scan(wallet, 10uL, 1uL)
|
val update = esploraClient.scan(wallet, 10uL, 1uL)
|
||||||
wallet.applyUpdate(update)
|
wallet.applyUpdate(update)
|
||||||
println("Balance: ${wallet.getBalance().total()}")
|
println("Balance: ${wallet.getBalance().total()}")
|
||||||
|
val balance: Balance = wallet.getBalance()
|
||||||
|
println("Balance: $balance")
|
||||||
|
|
||||||
assert(wallet.getBalance().total() > 0uL)
|
assert(wallet.getBalance().total() > 0uL)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.bitcoindevkit
|
package org.bitcoindevkit
|
||||||
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
@ -43,6 +43,12 @@ enum BdkError {
|
|||||||
"Psbt",
|
"Psbt",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ChangeSpendPolicy {
|
||||||
|
"ChangeAllowed",
|
||||||
|
"OnlyChange",
|
||||||
|
"ChangeForbidden"
|
||||||
|
};
|
||||||
|
|
||||||
interface Balance {
|
interface Balance {
|
||||||
u64 immature();
|
u64 immature();
|
||||||
|
|
||||||
@ -95,8 +101,24 @@ interface TxBuilder {
|
|||||||
|
|
||||||
TxBuilder add_recipient(Script script, u64 amount);
|
TxBuilder add_recipient(Script script, u64 amount);
|
||||||
|
|
||||||
|
TxBuilder set_recipients(sequence<ScriptAmount> script_amount);
|
||||||
|
|
||||||
|
TxBuilder add_unspendable(OutPoint unspendable);
|
||||||
|
|
||||||
|
TxBuilder add_utxo(OutPoint outpoint);
|
||||||
|
|
||||||
|
TxBuilder change_policy(ChangeSpendPolicy change_policy);
|
||||||
|
|
||||||
|
TxBuilder do_not_spend_change();
|
||||||
|
|
||||||
|
TxBuilder only_spend_change();
|
||||||
|
|
||||||
|
TxBuilder manually_selected_only();
|
||||||
|
|
||||||
TxBuilder fee_rate(float sat_per_vbyte);
|
TxBuilder fee_rate(float sat_per_vbyte);
|
||||||
|
|
||||||
|
TxBuilder drain_wallet();
|
||||||
|
|
||||||
[Throws=BdkError]
|
[Throws=BdkError]
|
||||||
PartiallySignedTransaction finish([ByRef] Wallet wallet);
|
PartiallySignedTransaction finish([ByRef] Wallet wallet);
|
||||||
};
|
};
|
||||||
@ -198,6 +220,15 @@ interface EsploraClient {
|
|||||||
Update scan(Wallet wallet, u64 stop_gap, u64 parallel_requests);
|
Update scan(Wallet wallet, u64 stop_gap, u64 parallel_requests);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// bdk-ffi-defined types
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
dictionary ScriptAmount {
|
||||||
|
Script script;
|
||||||
|
u64 amount;
|
||||||
|
};
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// bdk crate - bitcoin re-exports
|
// bdk crate - bitcoin re-exports
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@ -263,3 +294,8 @@ interface PartiallySignedTransaction {
|
|||||||
|
|
||||||
Transaction extract_tx();
|
Transaction extract_tx();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dictionary OutPoint {
|
||||||
|
string txid;
|
||||||
|
u32 vout;
|
||||||
|
};
|
||||||
|
@ -4,7 +4,9 @@ use bdk::bitcoin::consensus::Decodable;
|
|||||||
use bdk::bitcoin::network::constants::Network as BdkNetwork;
|
use bdk::bitcoin::network::constants::Network as BdkNetwork;
|
||||||
use bdk::bitcoin::psbt::PartiallySignedTransaction as BdkPartiallySignedTransaction;
|
use bdk::bitcoin::psbt::PartiallySignedTransaction as BdkPartiallySignedTransaction;
|
||||||
use bdk::bitcoin::Address as BdkAddress;
|
use bdk::bitcoin::Address as BdkAddress;
|
||||||
|
use bdk::bitcoin::OutPoint as BdkOutPoint;
|
||||||
use bdk::bitcoin::Transaction as BdkTransaction;
|
use bdk::bitcoin::Transaction as BdkTransaction;
|
||||||
|
use bdk::bitcoin::Txid;
|
||||||
use bdk::Error as BdkError;
|
use bdk::Error as BdkError;
|
||||||
|
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
@ -283,3 +285,21 @@ impl From<BdkPartiallySignedTransaction> for PartiallySignedTransaction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A reference to a transaction output.
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
||||||
|
pub struct OutPoint {
|
||||||
|
/// The referenced transaction's txid.
|
||||||
|
pub txid: String,
|
||||||
|
/// The index of the referenced output in its transaction's vout.
|
||||||
|
pub vout: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&OutPoint> for BdkOutPoint {
|
||||||
|
fn from(outpoint: &OutPoint) -> Self {
|
||||||
|
BdkOutPoint {
|
||||||
|
txid: Txid::from_str(&outpoint.txid).unwrap(),
|
||||||
|
vout: outpoint.vout,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@ mod wallet;
|
|||||||
// TODO 6: Why are these imports required?
|
// TODO 6: Why are these imports required?
|
||||||
use crate::bitcoin::Address;
|
use crate::bitcoin::Address;
|
||||||
use crate::bitcoin::Network;
|
use crate::bitcoin::Network;
|
||||||
|
use crate::bitcoin::OutPoint;
|
||||||
use crate::bitcoin::PartiallySignedTransaction;
|
use crate::bitcoin::PartiallySignedTransaction;
|
||||||
use crate::bitcoin::Script;
|
use crate::bitcoin::Script;
|
||||||
use crate::bitcoin::Transaction;
|
use crate::bitcoin::Transaction;
|
||||||
@ -21,6 +22,7 @@ use crate::wallet::Update;
|
|||||||
use crate::wallet::Wallet;
|
use crate::wallet::Wallet;
|
||||||
|
|
||||||
use bdk::keys::bip39::WordCount;
|
use bdk::keys::bip39::WordCount;
|
||||||
|
use bdk::wallet::tx_builder::ChangeSpendPolicy;
|
||||||
use bdk::wallet::AddressIndex as BdkAddressIndex;
|
use bdk::wallet::AddressIndex as BdkAddressIndex;
|
||||||
use bdk::wallet::AddressInfo as BdkAddressInfo;
|
use bdk::wallet::AddressInfo as BdkAddressInfo;
|
||||||
use bdk::wallet::Balance as BdkBalance;
|
use bdk::wallet::Balance as BdkBalance;
|
||||||
@ -32,10 +34,10 @@ use std::sync::Arc;
|
|||||||
uniffi::include_scaffolding!("bdk");
|
uniffi::include_scaffolding!("bdk");
|
||||||
|
|
||||||
/// A output script and an amount of satoshis.
|
/// A output script and an amount of satoshis.
|
||||||
// pub struct ScriptAmount {
|
pub struct ScriptAmount {
|
||||||
// pub script: Arc<Script>,
|
pub script: Arc<Script>,
|
||||||
// pub amount: u64,
|
pub amount: u64,
|
||||||
// }
|
}
|
||||||
|
|
||||||
/// A derived address and the index it was found at.
|
/// A derived address and the index it was found at.
|
||||||
pub struct AddressInfo {
|
pub struct AddressInfo {
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
use crate::bitcoin::PartiallySignedTransaction;
|
use crate::bitcoin::{OutPoint, PartiallySignedTransaction};
|
||||||
use crate::descriptor::Descriptor;
|
use crate::descriptor::Descriptor;
|
||||||
use crate::{AddressIndex, AddressInfo, Network};
|
use crate::{AddressIndex, AddressInfo, Network, ScriptAmount};
|
||||||
use crate::{Balance, Script};
|
use crate::{Balance, Script};
|
||||||
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf;
|
use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf;
|
||||||
|
use bdk::bitcoin::OutPoint as BdkOutPoint;
|
||||||
use bdk::wallet::Update as BdkUpdate;
|
use bdk::wallet::Update as BdkUpdate;
|
||||||
use bdk::Wallet as BdkWallet;
|
use bdk::Wallet as BdkWallet;
|
||||||
use bdk::{Error as BdkError, FeeRate};
|
use bdk::{Error as BdkError, FeeRate};
|
||||||
|
|
||||||
|
use bdk::wallet::tx_builder::ChangeSpendPolicy;
|
||||||
use std::sync::{Arc, Mutex, MutexGuard};
|
use std::sync::{Arc, Mutex, MutexGuard};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -261,13 +264,13 @@ pub struct Update(pub(crate) BdkUpdate);
|
|||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct TxBuilder {
|
pub struct TxBuilder {
|
||||||
pub(crate) recipients: Vec<(BdkScriptBuf, u64)>,
|
pub(crate) recipients: Vec<(BdkScriptBuf, u64)>,
|
||||||
// pub(crate) utxos: Vec<OutPoint>,
|
pub(crate) utxos: Vec<OutPoint>,
|
||||||
// pub(crate) unspendable: HashSet<OutPoint>,
|
pub(crate) unspendable: HashSet<OutPoint>,
|
||||||
// pub(crate) change_policy: ChangeSpendPolicy,
|
pub(crate) change_policy: ChangeSpendPolicy,
|
||||||
// pub(crate) manually_selected_only: bool,
|
pub(crate) manually_selected_only: bool,
|
||||||
pub(crate) fee_rate: Option<f32>,
|
pub(crate) fee_rate: Option<f32>,
|
||||||
// pub(crate) fee_absolute: Option<u64>,
|
// pub(crate) fee_absolute: Option<u64>,
|
||||||
// pub(crate) drain_wallet: bool,
|
pub(crate) drain_wallet: bool,
|
||||||
// pub(crate) drain_to: Option<BdkScript>,
|
// pub(crate) drain_to: Option<BdkScript>,
|
||||||
// pub(crate) rbf: Option<RbfValue>,
|
// pub(crate) rbf: Option<RbfValue>,
|
||||||
// pub(crate) data: Vec<u8>,
|
// pub(crate) data: Vec<u8>,
|
||||||
@ -277,13 +280,13 @@ impl TxBuilder {
|
|||||||
pub(crate) fn new() -> Self {
|
pub(crate) fn new() -> Self {
|
||||||
TxBuilder {
|
TxBuilder {
|
||||||
recipients: Vec::new(),
|
recipients: Vec::new(),
|
||||||
// utxos: Vec::new(),
|
utxos: Vec::new(),
|
||||||
// unspendable: HashSet::new(),
|
unspendable: HashSet::new(),
|
||||||
// change_policy: ChangeSpendPolicy::ChangeAllowed,
|
change_policy: ChangeSpendPolicy::ChangeAllowed,
|
||||||
// manually_selected_only: false,
|
manually_selected_only: false,
|
||||||
fee_rate: None,
|
fee_rate: None,
|
||||||
// fee_absolute: None,
|
// fee_absolute: None,
|
||||||
// drain_wallet: false,
|
drain_wallet: false,
|
||||||
// drain_to: None,
|
// drain_to: None,
|
||||||
// rbf: None,
|
// rbf: None,
|
||||||
// data: Vec::new(),
|
// data: Vec::new(),
|
||||||
@ -301,71 +304,78 @@ impl TxBuilder {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub(crate) fn set_recipients(&self, recipients: Vec<ScriptAmount>) -> Arc<Self> {
|
pub(crate) fn set_recipients(&self, recipients: Vec<ScriptAmount>) -> Arc<Self> {
|
||||||
// let recipients = recipients
|
let recipients = recipients
|
||||||
// .iter()
|
.iter()
|
||||||
// .map(|script_amount| (script_amount.script.inner.clone(), script_amount.amount))
|
.map(|script_amount| (script_amount.script.0.clone(), script_amount.amount))
|
||||||
// .collect();
|
.collect();
|
||||||
// Arc::new(TxBuilder {
|
Arc::new(TxBuilder {
|
||||||
// recipients,
|
recipients,
|
||||||
// ..self.clone()
|
..self.clone()
|
||||||
// })
|
})
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
/// Add a utxo to the internal list of unspendable utxos. It’s important to note that the "must-be-spent"
|
||||||
|
/// utxos added with [TxBuilder.addUtxo] have priority over this. See the Rust docs of the two linked methods for more details.
|
||||||
|
pub(crate) fn add_unspendable(&self, unspendable: OutPoint) -> Arc<Self> {
|
||||||
|
let mut unspendable_hash_set = self.unspendable.clone();
|
||||||
|
unspendable_hash_set.insert(unspendable);
|
||||||
|
Arc::new(TxBuilder {
|
||||||
|
unspendable: unspendable_hash_set,
|
||||||
|
..self.clone()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add an outpoint to the internal list of UTXOs that must be spent. These have priority over the "unspendable"
|
||||||
|
/// utxos, meaning that if a utxo is present both in the "utxos" and the "unspendable" list, it will be spent.
|
||||||
|
pub(crate) fn add_utxo(&self, outpoint: OutPoint) -> Arc<Self> {
|
||||||
|
self.add_utxos(vec![outpoint])
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add the list of outpoints to the internal list of UTXOs that must be spent. If an error occurs while adding
|
||||||
|
/// any of the UTXOs then none of them are added and the error is returned. These have priority over the "unspendable"
|
||||||
|
/// utxos, meaning that if a utxo is present both in the "utxos" and the "unspendable" list, it will be spent.
|
||||||
|
pub(crate) fn add_utxos(&self, mut outpoints: Vec<OutPoint>) -> Arc<Self> {
|
||||||
|
let mut utxos = self.utxos.to_vec();
|
||||||
|
utxos.append(&mut outpoints);
|
||||||
|
Arc::new(TxBuilder {
|
||||||
|
utxos,
|
||||||
|
..self.clone()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn change_policy(&self, change_policy: ChangeSpendPolicy) -> Arc<Self> {
|
||||||
|
Arc::new(TxBuilder {
|
||||||
|
change_policy,
|
||||||
|
..self.clone()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Do not spend change outputs. This effectively adds all the change outputs to the "unspendable" list. See TxBuilder.unspendable.
|
||||||
|
pub(crate) fn do_not_spend_change(&self) -> Arc<Self> {
|
||||||
|
Arc::new(TxBuilder {
|
||||||
|
change_policy: ChangeSpendPolicy::ChangeForbidden,
|
||||||
|
..self.clone()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Only spend change outputs. This effectively adds all the non-change outputs to the "unspendable" list. See TxBuilder.unspendable.
|
||||||
|
pub(crate) fn only_spend_change(&self) -> Arc<Self> {
|
||||||
|
Arc::new(TxBuilder {
|
||||||
|
change_policy: ChangeSpendPolicy::OnlyChange,
|
||||||
|
..self.clone()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Only spend utxos added by [add_utxo]. The wallet will not add additional utxos to the transaction even if they are
|
||||||
|
/// needed to make the transaction valid.
|
||||||
|
pub(crate) fn manually_selected_only(&self) -> Arc<Self> {
|
||||||
|
Arc::new(TxBuilder {
|
||||||
|
manually_selected_only: true,
|
||||||
|
..self.clone()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// /// Add a utxo to the internal list of unspendable utxos. It’s important to note that the "must-be-spent"
|
|
||||||
// /// utxos added with [TxBuilder.addUtxo] have priority over this. See the Rust docs of the two linked methods for more details.
|
|
||||||
// pub(crate) fn add_unspendable(&self, unspendable: OutPoint) -> Arc<Self> {
|
|
||||||
// let mut unspendable_hash_set = self.unspendable.clone();
|
|
||||||
// unspendable_hash_set.insert(unspendable);
|
|
||||||
// Arc::new(TxBuilder {
|
|
||||||
// unspendable: unspendable_hash_set,
|
|
||||||
// ..self.clone()
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// Add an outpoint to the internal list of UTXOs that must be spent. These have priority over the "unspendable"
|
|
||||||
// /// utxos, meaning that if a utxo is present both in the "utxos" and the "unspendable" list, it will be spent.
|
|
||||||
// pub(crate) fn add_utxo(&self, outpoint: OutPoint) -> Arc<Self> {
|
|
||||||
// self.add_utxos(vec![outpoint])
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// Add the list of outpoints to the internal list of UTXOs that must be spent. If an error occurs while adding
|
|
||||||
// /// any of the UTXOs then none of them are added and the error is returned. These have priority over the "unspendable"
|
|
||||||
// /// utxos, meaning that if a utxo is present both in the "utxos" and the "unspendable" list, it will be spent.
|
|
||||||
// pub(crate) fn add_utxos(&self, mut outpoints: Vec<OutPoint>) -> Arc<Self> {
|
|
||||||
// let mut utxos = self.utxos.to_vec();
|
|
||||||
// utxos.append(&mut outpoints);
|
|
||||||
// Arc::new(TxBuilder {
|
|
||||||
// utxos,
|
|
||||||
// ..self.clone()
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// Do not spend change outputs. This effectively adds all the change outputs to the "unspendable" list. See TxBuilder.unspendable.
|
|
||||||
// pub(crate) fn do_not_spend_change(&self) -> Arc<Self> {
|
|
||||||
// Arc::new(TxBuilder {
|
|
||||||
// change_policy: ChangeSpendPolicy::ChangeForbidden,
|
|
||||||
// ..self.clone()
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// Only spend utxos added by [add_utxo]. The wallet will not add additional utxos to the transaction even if they are
|
|
||||||
// /// needed to make the transaction valid.
|
|
||||||
// pub(crate) fn manually_selected_only(&self) -> Arc<Self> {
|
|
||||||
// Arc::new(TxBuilder {
|
|
||||||
// manually_selected_only: true,
|
|
||||||
// ..self.clone()
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// Only spend change outputs. This effectively adds all the non-change outputs to the "unspendable" list. See TxBuilder.unspendable.
|
|
||||||
// pub(crate) fn only_spend_change(&self) -> Arc<Self> {
|
|
||||||
// Arc::new(TxBuilder {
|
|
||||||
// change_policy: ChangeSpendPolicy::OnlyChange,
|
|
||||||
// ..self.clone()
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// Replace the internal list of unspendable utxos with a new list. It’s important to note that the "must-be-spent" utxos added with
|
// /// Replace the internal list of unspendable utxos with a new list. It’s important to note that the "must-be-spent" utxos added with
|
||||||
// /// TxBuilder.addUtxo have priority over these. See the Rust docs of the two linked methods for more details.
|
// /// TxBuilder.addUtxo have priority over these. See the Rust docs of the two linked methods for more details.
|
||||||
// pub(crate) fn unspendable(&self, unspendable: Vec<OutPoint>) -> Arc<Self> {
|
// pub(crate) fn unspendable(&self, unspendable: Vec<OutPoint>) -> Arc<Self> {
|
||||||
@ -374,7 +384,7 @@ impl TxBuilder {
|
|||||||
// ..self.clone()
|
// ..self.clone()
|
||||||
// })
|
// })
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
/// Set a custom fee rate.
|
/// Set a custom fee rate.
|
||||||
pub(crate) fn fee_rate(&self, sat_per_vb: f32) -> Arc<Self> {
|
pub(crate) fn fee_rate(&self, sat_per_vb: f32) -> Arc<Self> {
|
||||||
Arc::new(TxBuilder {
|
Arc::new(TxBuilder {
|
||||||
@ -382,7 +392,7 @@ impl TxBuilder {
|
|||||||
..self.clone()
|
..self.clone()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// /// Set an absolute fee.
|
// /// Set an absolute fee.
|
||||||
// pub(crate) fn fee_absolute(&self, fee_amount: u64) -> Arc<Self> {
|
// pub(crate) fn fee_absolute(&self, fee_amount: u64) -> Arc<Self> {
|
||||||
// Arc::new(TxBuilder {
|
// Arc::new(TxBuilder {
|
||||||
@ -390,15 +400,15 @@ impl TxBuilder {
|
|||||||
// ..self.clone()
|
// ..self.clone()
|
||||||
// })
|
// })
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// /// Spend all the available inputs. This respects filters like TxBuilder.unspendable and the change policy.
|
/// Spend all the available inputs. This respects filters like TxBuilder.unspendable and the change policy.
|
||||||
// pub(crate) fn drain_wallet(&self) -> Arc<Self> {
|
pub(crate) fn drain_wallet(&self) -> Arc<Self> {
|
||||||
// Arc::new(TxBuilder {
|
Arc::new(TxBuilder {
|
||||||
// drain_wallet: true,
|
drain_wallet: true,
|
||||||
// ..self.clone()
|
..self.clone()
|
||||||
// })
|
})
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// /// Sets the address to drain excess coins to. Usually, when there are excess coins they are sent to a change address
|
// /// Sets the address to drain excess coins to. Usually, when there are excess coins they are sent to a change address
|
||||||
// /// generated by the wallet. This option replaces the usual change address with an arbitrary ScriptPubKey of your choosing.
|
// /// generated by the wallet. This option replaces the usual change address with an arbitrary ScriptPubKey of your choosing.
|
||||||
// /// Just as with a change output, if the drain output is not needed (the excess coins are too small) it will not be included
|
// /// Just as with a change output, if the drain output is not needed (the excess coins are too small) it will not be included
|
||||||
@ -431,17 +441,16 @@ impl TxBuilder {
|
|||||||
// ..self.clone()
|
// ..self.clone()
|
||||||
// })
|
// })
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// /// Add data as an output using OP_RETURN.
|
/// Add data as an output using OP_RETURN.
|
||||||
// pub(crate) fn add_data(&self, data: Vec<u8>) -> Arc<Self> {
|
// pub(crate) fn add_data(&self, data: Vec<u8>) -> Arc<Self> {
|
||||||
// Arc::new(TxBuilder {
|
// Arc::new(TxBuilder {
|
||||||
// data,
|
// data,
|
||||||
// ..self.clone()
|
// ..self.clone()
|
||||||
// })
|
// })
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
/// Finish building the transaction. Returns the BIP174 PSBT.
|
/// Finish building the transaction. Returns the BIP174 PSBT.
|
||||||
/// TODO: The TxBuilder in bdk returns a Psbt type
|
|
||||||
pub(crate) fn finish(
|
pub(crate) fn finish(
|
||||||
&self,
|
&self,
|
||||||
wallet: &Wallet,
|
wallet: &Wallet,
|
||||||
@ -449,34 +458,32 @@ impl TxBuilder {
|
|||||||
// TODO: I had to change the wallet here to be mutable. Why is that now required with the 1.0 API?
|
// TODO: I had to change the wallet here to be mutable. Why is that now required with the 1.0 API?
|
||||||
let mut wallet = wallet.get_wallet();
|
let mut wallet = wallet.get_wallet();
|
||||||
let mut tx_builder = wallet.build_tx();
|
let mut tx_builder = wallet.build_tx();
|
||||||
// TODO: I'm not yet clear on the Script/ScriptBuf differences and whether this is the best
|
|
||||||
// way to do this.
|
|
||||||
for (script, amount) in &self.recipients {
|
for (script, amount) in &self.recipients {
|
||||||
tx_builder.add_recipient(script.clone(), *amount);
|
tx_builder.add_recipient(script.clone(), *amount);
|
||||||
}
|
}
|
||||||
// tx_builder.change_policy(self.change_policy);
|
tx_builder.change_policy(self.change_policy);
|
||||||
// if !self.utxos.is_empty() {
|
if !self.utxos.is_empty() {
|
||||||
// let bdk_utxos: Vec<BdkOutPoint> = self.utxos.iter().map(BdkOutPoint::from).collect();
|
let bdk_utxos: Vec<BdkOutPoint> = self.utxos.iter().map(BdkOutPoint::from).collect();
|
||||||
// let utxos: &[BdkOutPoint] = &bdk_utxos;
|
let utxos: &[BdkOutPoint] = &bdk_utxos;
|
||||||
// tx_builder.add_utxos(utxos)?;
|
tx_builder.add_utxos(utxos)?;
|
||||||
// }
|
}
|
||||||
// if !self.unspendable.is_empty() {
|
// if !self.unspendable.is_empty() {
|
||||||
// let bdk_unspendable: Vec<BdkOutPoint> =
|
// let bdk_unspendable: Vec<BdkOutPoint> =
|
||||||
// self.unspendable.iter().map(BdkOutPoint::from).collect();
|
// self.unspendable.iter().map(BdkOutPoint::from).collect();
|
||||||
// tx_builder.unspendable(bdk_unspendable);
|
// tx_builder.unspendable(bdk_unspendable);
|
||||||
// }
|
// }
|
||||||
// if self.manually_selected_only {
|
if self.manually_selected_only {
|
||||||
// tx_builder.manually_selected_only();
|
tx_builder.manually_selected_only();
|
||||||
// }
|
}
|
||||||
if let Some(sat_per_vb) = self.fee_rate {
|
if let Some(sat_per_vb) = self.fee_rate {
|
||||||
tx_builder.fee_rate(FeeRate::from_sat_per_vb(sat_per_vb));
|
tx_builder.fee_rate(FeeRate::from_sat_per_vb(sat_per_vb));
|
||||||
}
|
}
|
||||||
// if let Some(fee_amount) = self.fee_absolute {
|
// if let Some(fee_amount) = self.fee_absolute {
|
||||||
// tx_builder.fee_absolute(fee_amount);
|
// tx_builder.fee_absolute(fee_amount);
|
||||||
// }
|
// }
|
||||||
// if self.drain_wallet {
|
if self.drain_wallet {
|
||||||
// tx_builder.drain_wallet();
|
tx_builder.drain_wallet();
|
||||||
// }
|
}
|
||||||
// if let Some(script) = &self.drain_to {
|
// if let Some(script) = &self.drain_to {
|
||||||
// tx_builder.drain_to(script.clone());
|
// tx_builder.drain_to(script.clone());
|
||||||
// }
|
// }
|
||||||
@ -501,7 +508,7 @@ impl TxBuilder {
|
|||||||
Ok(Arc::new(psbt.into()))
|
Ok(Arc::new(psbt.into()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// /// The BumpFeeTxBuilder is used to bump the fee on a transaction that has been broadcast and has its RBF flag set to true.
|
// /// The BumpFeeTxBuilder is used to bump the fee on a transaction that has been broadcast and has its RBF flag set to true.
|
||||||
// #[derive(Clone)]
|
// #[derive(Clone)]
|
||||||
// pub(crate) struct BumpFeeTxBuilder {
|
// pub(crate) struct BumpFeeTxBuilder {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user