API to get an iterator for funding utxos in psbt
This commit is contained in:
parent
c7ff483c1c
commit
5afb0eaf40
|
@ -37,8 +37,12 @@ pub enum Error {
|
||||||
/// Magic bytes for a PSBT must be the ASCII for "psbt" serialized in most
|
/// Magic bytes for a PSBT must be the ASCII for "psbt" serialized in most
|
||||||
/// significant byte order.
|
/// significant byte order.
|
||||||
InvalidMagic,
|
InvalidMagic,
|
||||||
|
/// Missing both the witness and non-witness utxo.
|
||||||
|
MissingUtxo,
|
||||||
/// The separator for a PSBT must be `0xff`.
|
/// The separator for a PSBT must be `0xff`.
|
||||||
InvalidSeparator,
|
InvalidSeparator,
|
||||||
|
/// Returned when output index is out of bounds in relation to the output in non-witness UTXO.
|
||||||
|
PsbtUtxoOutOfbounds,
|
||||||
/// Known keys must be according to spec.
|
/// Known keys must be according to spec.
|
||||||
InvalidKey(raw::Key),
|
InvalidKey(raw::Key),
|
||||||
/// Non-proprietary key type found when proprietary key was expected
|
/// Non-proprietary key type found when proprietary key was expected
|
||||||
|
@ -98,6 +102,8 @@ impl fmt::Display for Error {
|
||||||
}
|
}
|
||||||
Error::NoMorePairs => f.write_str("no more key-value pairs for this psbt map"),
|
Error::NoMorePairs => f.write_str("no more key-value pairs for this psbt map"),
|
||||||
Error::HashParseError(e) => write!(f, "Hash Parse Error: {}", e),
|
Error::HashParseError(e) => write!(f, "Hash Parse Error: {}", e),
|
||||||
|
Error::MissingUtxo => f.write_str("UTXO information is not present in PSBT"),
|
||||||
|
Error::PsbtUtxoOutOfbounds => f.write_str("output index is out of bounds of non witness script output array"),
|
||||||
Error::InvalidPreimageHashPair{ref preimage, ref hash, ref hash_type} => {
|
Error::InvalidPreimageHashPair{ref preimage, ref hash, ref hash_type} => {
|
||||||
// directly using debug forms of psbthash enums
|
// directly using debug forms of psbthash enums
|
||||||
write!(f, "Preimage {:?} does not match {:?} hash {:?}", preimage, hash_type, hash )
|
write!(f, "Preimage {:?} does not match {:?} hash {:?}", preimage, hash_type, hash )
|
||||||
|
|
|
@ -20,14 +20,14 @@
|
||||||
//!
|
//!
|
||||||
|
|
||||||
use blockdata::script::Script;
|
use blockdata::script::Script;
|
||||||
use blockdata::transaction::Transaction;
|
use blockdata::transaction::{ TxOut, Transaction};
|
||||||
use consensus::{encode, Encodable, Decodable};
|
use consensus::{encode, Encodable, Decodable};
|
||||||
use consensus::encode::MAX_VEC_SIZE;
|
use consensus::encode::MAX_VEC_SIZE;
|
||||||
|
pub use util::sighash::Prevouts;
|
||||||
|
|
||||||
use prelude::*;
|
use prelude::*;
|
||||||
|
|
||||||
use io;
|
use io;
|
||||||
|
|
||||||
mod error;
|
mod error;
|
||||||
pub use self::error::Error;
|
pub use self::error::Error;
|
||||||
|
|
||||||
|
@ -72,6 +72,32 @@ pub struct PartiallySignedTransaction {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PartiallySignedTransaction {
|
impl PartiallySignedTransaction {
|
||||||
|
/// Returns an iterator for the funding UTXOs of the psbt
|
||||||
|
///
|
||||||
|
/// For each PSBT input that contains UTXO information `Ok` is returned containing that information.
|
||||||
|
/// The order of returned items is same as the order of inputs.
|
||||||
|
///
|
||||||
|
/// ## Errors
|
||||||
|
///
|
||||||
|
/// The function returns error when UTXO information is not present or is invalid.
|
||||||
|
///
|
||||||
|
/// ## Panics
|
||||||
|
///
|
||||||
|
/// The function panics if the length of transaction inputs is not equal to the length of PSBT inputs.
|
||||||
|
pub fn iter_funding_utxos(&self) -> impl Iterator<Item = Result<&TxOut, Error>> {
|
||||||
|
assert_eq!(self.inputs.len(), self.unsigned_tx.input.len());
|
||||||
|
self.unsigned_tx.input.iter().zip(&self.inputs).map(|(tx_input, psbt_input)| {
|
||||||
|
match (&psbt_input.witness_utxo, &psbt_input.non_witness_utxo) {
|
||||||
|
(Some(witness_utxo), _) => Ok(witness_utxo),
|
||||||
|
(None, Some(non_witness_utxo)) => {
|
||||||
|
let vout = tx_input.previous_output.vout as usize;
|
||||||
|
non_witness_utxo.output.get(vout).ok_or(Error::PsbtUtxoOutOfbounds)
|
||||||
|
},
|
||||||
|
(None, None) => Err(Error::MissingUtxo),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks that unsigned transaction does not have scriptSig's or witness
|
/// Checks that unsigned transaction does not have scriptSig's or witness
|
||||||
/// data
|
/// data
|
||||||
fn unsigned_tx_checks(&self) -> Result<(), Error> {
|
fn unsigned_tx_checks(&self) -> Result<(), Error> {
|
||||||
|
|
Loading…
Reference in New Issue