`PsbtUtils::fee_amount` panics when PSBT outputs exceed inputs
I maintainer di solito rispondono entro 2 giorni
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 72/100
Direzione di ricerca
Inizia in src/psbt/mod.rs, su PsbtUtils::fee_amount, e ispeziona la documentazione del trait e la delega a fee_rate. Aggiungi un test di regressione usando il caso outputs-exceed-inputs fornito, quindi verifica che il comportamento scelto e visibile al chiamante sia coperto e che fee_amount e fee_rate non causino più panic.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
PsbtUtils::fee_amount (src/psbt/mod.rs) computes the fee as input_amount.checked_sub(output_amount).expect("input amount must be greater than output amount"). When the PSBT's outputs sum to more than its inputs, checked_sub returns None and the expect panics. fee_rate delegates to fee_amount, so it panics too.
The trait docs only say None is returned when a TxOut is missing for an input; there is no documented precondition that outputs are bounded by inputs. Since PSBTs are commonly received from other parties (coinjoin, payjoin, externally produced PSBTs), callers displaying a fee before signing can hit this on well-formed but inconsistent input.
This issue was found by AI.
To Reproduce
use bdk_wallet::psbt::PsbtUtils;
use bitcoin::{Amount, OutPoint, Psbt, ScriptBuf, Transaction, TxIn, TxOut, absolute, transaction};
#[test]
fn fee_amount_when_outputs_exceed_inputs() {
let prev_tx = Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::ZERO,
input: vec![TxIn::default()],
output: vec![TxOut {
value: Amount::from_sat(50_000),
script_pubkey: ScriptBuf::default(),
}],
};
let unsigned_tx = Transaction {
version: transaction::Version::TWO,
lock_time: absolute::LockTime::ZERO,
input: vec![TxIn {
previous_output: OutPoint::new(prev_tx.compute_txid(), 0),
..Default::default()
}],
output: vec![TxOut {
value: Amount::from_sat(90_000),
script_pubkey: ScriptBuf::default(),
}],
};
let mut psbt = Psbt::from_unsigned_tx(unsigned_tx).unwrap();
psbt.inputs[0].non_witness_utxo = Some(prev_tx);
// panics at src/psbt/mod.rs:79: "input amount must be greater than output amount"
let _ = psbt.fee_amount();
}
Expected behavior
fee_amount / fee_rate should not panic on a PSBT whose outputs exceed its inputs; the condition should be signalled to the caller (e.g. via the return value) or documented as a precondition.
Build environment
- BDK tag/commit:
6fc68462(master)
Which backend(s) are relevant (if any)?
- None / not backend-related (e.g.
bdk_chain,bdk_core)
Is this blocking production use?
- No
- Lingua principale
- Rust
- Stelle
- 61
- Fork
- 116
- Merge medio
- 7h 29m
- PR unite (30g)
- 6
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di bitcoindevkit/bdk_wallet
-
Change output crossing a compactsize boundary leaves the fee slightly below the requested feerateForse già presa @artofbitcoin l’ha presa 3 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
bitcoindevkit/bdk_wallet#578 · 2 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
Change address `mark_used` marker is not persisted; same change address reissued after restartForse già presa @NaitikVerma6776 l’ha presa 4 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
bitcoindevkit/bdk_wallet#577 · 3 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
bdk_wallet uses `std` items without feature gateForse già presa @Chibey-max l’ha presa 8 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
bitcoindevkit/bdk_wallet#574 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
`CaravanExport::to_descriptors` accepts duplicate xpubsForse già presa @chukwudiikeh l’ha presa 8 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
bitcoindevkit/bdk_wallet#560 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Add tests for `MissingNonWitnessUtxo` / `InvalidNonWitnessUtxo` signing errorsForse già presa @Arowolokehinde l’ha presa 25 giorni fa. Apertatests
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
bitcoindevkit/bdk_wallet#552 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di bitcoindevkit/bdk_wallet
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
pop-os/cosmic-comp#2956 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
libp2p/rust-libp2p#6694 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
EmbarkStudios/cargo-deny#910 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
tursodatabase/turso#10054 ·
I maintainer di solito rispondono entro 1 giorno
-
build: Update rust versionForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertadependencies
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
ibm-granite-community/granite-cli#229 ·
I maintainer di solito rispondono entro 1 giorno