Revert back to Vec to hold utxos in builder
Due to brain malfunction I made utxos into a BTree. This made a test pass but is incorrect. The test itself was incorrect as per comment in https://github.com/bitcoindevkit/bdk/pull/258#issuecomment-758370380 So I (1) reverted utxos back to a Vec, (2) fixed the test and expanded the comment in the test.
This commit is contained in:
parent
890d6191a1
commit
10fcba9439
@ -507,7 +507,7 @@ where
|
|||||||
let (required_utxos, optional_utxos) = self.preselect_utxos(
|
let (required_utxos, optional_utxos) = self.preselect_utxos(
|
||||||
params.change_policy,
|
params.change_policy,
|
||||||
¶ms.unspendable,
|
¶ms.unspendable,
|
||||||
params.utxos.values().cloned().collect(),
|
params.utxos.clone(),
|
||||||
params.drain_wallet,
|
params.drain_wallet,
|
||||||
params.manually_selected_only,
|
params.manually_selected_only,
|
||||||
params.bumping_fee.is_some(), // we mandate confirmed transactions if we're bumping the fee
|
params.bumping_fee.is_some(), // we mandate confirmed transactions if we're bumping the fee
|
||||||
@ -672,7 +672,7 @@ where
|
|||||||
let original_txin = tx.input.drain(..).collect::<Vec<_>>();
|
let original_txin = tx.input.drain(..).collect::<Vec<_>>();
|
||||||
let original_utxos = original_txin
|
let original_utxos = original_txin
|
||||||
.iter()
|
.iter()
|
||||||
.map(|txin| -> Result<(OutPoint, (UTXO, usize)), Error> {
|
.map(|txin| -> Result<_, Error> {
|
||||||
let txout = self
|
let txout = self
|
||||||
.database
|
.database
|
||||||
.borrow()
|
.borrow()
|
||||||
@ -706,9 +706,9 @@ where
|
|||||||
keychain,
|
keychain,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok((utxo.outpoint, (utxo, weight)))
|
Ok((utxo, weight))
|
||||||
})
|
})
|
||||||
.collect::<Result<BTreeMap<OutPoint, (UTXO, usize)>, _>>()?;
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
|
||||||
if tx.output.len() > 1 {
|
if tx.output.len() > 1 {
|
||||||
let mut change_index = None;
|
let mut change_index = None;
|
||||||
@ -2653,9 +2653,10 @@ mod test {
|
|||||||
fn test_bump_fee_remove_output_manually_selected_only() {
|
fn test_bump_fee_remove_output_manually_selected_only() {
|
||||||
let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
|
let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh());
|
||||||
// receive an extra tx so that our wallet has two utxos. then we manually pick only one of
|
// receive an extra tx so that our wallet has two utxos. then we manually pick only one of
|
||||||
// them, and make sure that `bump_fee` doesn't try to add more. eventually, it should fail
|
// them, and make sure that `bump_fee` doesn't try to add more. This fails because we've
|
||||||
// because the fee rate is too high and the single utxo isn't enough to create a non-dust
|
// told the wallet it's not allowed to add more inputs AND it can't reduce the value of the
|
||||||
// output
|
// existing output. In other words, bump_fee + manually_selected_only is always an error
|
||||||
|
// unless you've also set "maintain_single_recipient".
|
||||||
let incoming_txid = crate::populate_test_db!(
|
let incoming_txid = crate::populate_test_db!(
|
||||||
wallet.database.borrow_mut(),
|
wallet.database.borrow_mut(),
|
||||||
testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
|
testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 1)),
|
||||||
@ -2694,8 +2695,6 @@ mod test {
|
|||||||
|
|
||||||
let mut builder = wallet.build_fee_bump(txid).unwrap();
|
let mut builder = wallet.build_fee_bump(txid).unwrap();
|
||||||
builder
|
builder
|
||||||
.add_utxo(outpoint)
|
|
||||||
.unwrap()
|
|
||||||
.manually_selected_only()
|
.manually_selected_only()
|
||||||
.fee_rate(FeeRate::from_sat_per_vb(255.0));
|
.fee_rate(FeeRate::from_sat_per_vb(255.0));
|
||||||
builder.finish().unwrap();
|
builder.finish().unwrap();
|
||||||
|
@ -147,7 +147,7 @@ pub(crate) struct TxParams {
|
|||||||
pub(crate) fee_policy: Option<FeePolicy>,
|
pub(crate) fee_policy: Option<FeePolicy>,
|
||||||
pub(crate) internal_policy_path: Option<BTreeMap<String, Vec<usize>>>,
|
pub(crate) internal_policy_path: Option<BTreeMap<String, Vec<usize>>>,
|
||||||
pub(crate) external_policy_path: Option<BTreeMap<String, Vec<usize>>>,
|
pub(crate) external_policy_path: Option<BTreeMap<String, Vec<usize>>>,
|
||||||
pub(crate) utxos: BTreeMap<OutPoint, (UTXO, usize)>,
|
pub(crate) utxos: Vec<(UTXO, usize)>,
|
||||||
pub(crate) unspendable: HashSet<OutPoint>,
|
pub(crate) unspendable: HashSet<OutPoint>,
|
||||||
pub(crate) manually_selected_only: bool,
|
pub(crate) manually_selected_only: bool,
|
||||||
pub(crate) sighash: Option<SigHashType>,
|
pub(crate) sighash: Option<SigHashType>,
|
||||||
@ -273,15 +273,11 @@ impl<'a, B, D: BatchDatabase, Cs: CoinSelectionAlgorithm<D>, Ctx: TxBuilderConte
|
|||||||
/// These have priority over the "unspendable" utxos, meaning that if a utxo is present both in
|
/// 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.
|
/// the "utxos" and the "unspendable" list, it will be spent.
|
||||||
pub fn add_utxo(&mut self, outpoint: OutPoint) -> Result<&mut Self, Error> {
|
pub fn add_utxo(&mut self, outpoint: OutPoint) -> Result<&mut Self, Error> {
|
||||||
if self.params.utxos.get(&outpoint).is_none() {
|
let deriv_ctx = crate::wallet::descriptor_to_pk_ctx(self.wallet.secp_ctx());
|
||||||
let deriv_ctx = crate::wallet::descriptor_to_pk_ctx(self.wallet.secp_ctx());
|
let utxo = self.wallet.get_utxo(outpoint)?.ok_or(Error::UnknownUTXO)?;
|
||||||
let utxo = self.wallet.get_utxo(outpoint)?.ok_or(Error::UnknownUTXO)?;
|
let descriptor = self.wallet.get_descriptor_for_keychain(utxo.keychain);
|
||||||
let descriptor = self.wallet.get_descriptor_for_keychain(utxo.keychain);
|
let satisfaction_weight = descriptor.max_satisfaction_weight(deriv_ctx).unwrap();
|
||||||
let satisfaction_weight = descriptor.max_satisfaction_weight(deriv_ctx).unwrap();
|
self.params.utxos.push((utxo, satisfaction_weight));
|
||||||
self.params
|
|
||||||
.utxos
|
|
||||||
.insert(outpoint, (utxo, satisfaction_weight));
|
|
||||||
}
|
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user