Merging two match expressions for fee calculation
This commit is contained in:
parent
49894ffa6d
commit
365a91f805
@ -493,28 +493,6 @@ where
|
|||||||
// the new tx must "pay for its bandwidth"
|
// the new tx must "pay for its bandwidth"
|
||||||
let vbytes = tx.get_weight() as f32 / 4.0;
|
let vbytes = tx.get_weight() as f32 / 4.0;
|
||||||
let required_feerate = FeeRate::from_sat_per_vb(details.fees as f32 / vbytes + 1.0);
|
let required_feerate = FeeRate::from_sat_per_vb(details.fees as f32 / vbytes + 1.0);
|
||||||
let new_feerate = match builder
|
|
||||||
.fee_policy
|
|
||||||
.as_ref()
|
|
||||||
.unwrap_or(&FeePolicy::FeeRate(FeeRate::default()))
|
|
||||||
{
|
|
||||||
FeePolicy::FeeAmount(amount) => {
|
|
||||||
if *amount < details.fees {
|
|
||||||
return Err(Error::FeeTooLow {
|
|
||||||
required: details.fees,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
FeeRate::from_sat_per_vb(0.0)
|
|
||||||
}
|
|
||||||
FeePolicy::FeeRate(rate) => {
|
|
||||||
if *rate < required_feerate {
|
|
||||||
return Err(Error::FeeRateTooLow {
|
|
||||||
required: required_feerate,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
*rate
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if builder.send_all && tx.output.len() > 1 {
|
if builder.send_all && tx.output.len() > 1 {
|
||||||
return Err(Error::SendAllMultipleOutputs);
|
return Err(Error::SendAllMultipleOutputs);
|
||||||
@ -645,13 +623,27 @@ where
|
|||||||
must_use_utxos.append(&mut original_utxos);
|
must_use_utxos.append(&mut original_utxos);
|
||||||
|
|
||||||
let amount_needed = tx.output.iter().fold(0, |acc, out| acc + out.value);
|
let amount_needed = tx.output.iter().fold(0, |acc, out| acc + out.value);
|
||||||
let initial_fee = match builder
|
let (new_feerate, initial_fee) = match builder
|
||||||
.fee_policy
|
.fee_policy
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.unwrap_or(&FeePolicy::FeeRate(FeeRate::default()))
|
.unwrap_or(&FeePolicy::FeeRate(FeeRate::default()))
|
||||||
{
|
{
|
||||||
FeePolicy::FeeAmount(amount) => *amount as f32,
|
FeePolicy::FeeAmount(amount) => {
|
||||||
FeePolicy::FeeRate(_) => tx.get_weight() as f32 / 4.0 * new_feerate.as_sat_vb(),
|
if *amount < details.fees {
|
||||||
|
return Err(Error::FeeTooLow {
|
||||||
|
required: details.fees,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
(FeeRate::from_sat_per_vb(0.0), *amount as f32)
|
||||||
|
}
|
||||||
|
FeePolicy::FeeRate(rate) => {
|
||||||
|
if *rate < required_feerate {
|
||||||
|
return Err(Error::FeeRateTooLow {
|
||||||
|
required: required_feerate,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
(*rate, tx.get_weight() as f32 / 4.0 * rate.as_sat_vb())
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let coin_selection::CoinSelectionResult {
|
let coin_selection::CoinSelectionResult {
|
||||||
@ -1743,13 +1735,6 @@ mod test {
|
|||||||
.send_all(),
|
.send_all(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
assert_eq!(details.fees, 0);
|
|
||||||
assert_eq!(psbt.global.unsigned_tx.output.len(), 1);
|
|
||||||
assert_eq!(
|
|
||||||
psbt.global.unsigned_tx.output[0].value,
|
|
||||||
50_000 - details.fees
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2080,7 +2065,7 @@ mod test {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "FeeTooLow")]
|
#[should_panic(expected = "FeeTooLow")]
|
||||||
fn test_bump_fee_low_fee() {
|
fn test_bump_fee_low_abs() {
|
||||||
let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
|
let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
|
||||||
let addr = wallet.get_new_address().unwrap();
|
let addr = wallet.get_new_address().unwrap();
|
||||||
let (psbt, mut details) = wallet
|
let (psbt, mut details) = wallet
|
||||||
|
Loading…
x
Reference in New Issue
Block a user