Use Psbt instead of PSBT
Idiomatic Rust uses lowercase for acronyms for all characters after the first e.g. `std::net::TcpStream`. PSBT (Partially Signed Bitcoin Transaction) should be rendered `Psbt` in Rust code if we want to write idiomatic Rust. Use `Psbt` instead of `PSBT` when aliasing the import of `PartiallySignedTransaction` from `bitcoin` library.
This commit is contained in:
parent
f6631e35b8
commit
aa3707b5b4
@ -61,7 +61,7 @@ use crate::wallet::utils::{self, After, Older, SecpCtx};
|
|||||||
use super::checksum::get_checksum;
|
use super::checksum::get_checksum;
|
||||||
use super::error::Error;
|
use super::error::Error;
|
||||||
use super::XKeyUtils;
|
use super::XKeyUtils;
|
||||||
use bitcoin::util::psbt::PartiallySignedTransaction as PSBT;
|
use bitcoin::util::psbt::PartiallySignedTransaction as Psbt;
|
||||||
use miniscript::psbt::PsbtInputSatisfier;
|
use miniscript::psbt::PsbtInputSatisfier;
|
||||||
|
|
||||||
/// Raw public key or extended key fingerprint
|
/// Raw public key or extended key fingerprint
|
||||||
@ -760,7 +760,7 @@ fn signature(
|
|||||||
policy
|
policy
|
||||||
}
|
}
|
||||||
|
|
||||||
fn signature_in_psbt(psbt: &PSBT, key: &DescriptorPublicKey, secp: &SecpCtx) -> bool {
|
fn signature_in_psbt(psbt: &Psbt, key: &DescriptorPublicKey, secp: &SecpCtx) -> bool {
|
||||||
//TODO check signature validity
|
//TODO check signature validity
|
||||||
psbt.inputs.iter().all(|input| match key {
|
psbt.inputs.iter().all(|input| match key {
|
||||||
DescriptorPublicKey::SinglePub(key) => input.partial_sigs.contains_key(&key.key),
|
DescriptorPublicKey::SinglePub(key) => input.partial_sigs.contains_key(&key.key),
|
||||||
@ -923,7 +923,7 @@ impl<Ctx: ScriptContext> ExtractPolicy for Miniscript<DescriptorPublicKey, Ctx>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn psbt_inputs_sat(psbt: &PSBT) -> impl Iterator<Item = PsbtInputSatisfier> {
|
fn psbt_inputs_sat(psbt: &Psbt) -> impl Iterator<Item = PsbtInputSatisfier> {
|
||||||
(0..psbt.inputs.len()).map(move |i| PsbtInputSatisfier::new(psbt, i))
|
(0..psbt.inputs.len()).map(move |i| PsbtInputSatisfier::new(psbt, i))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,11 +933,11 @@ pub enum BuildSatisfaction<'a> {
|
|||||||
/// Don't generate `satisfaction` field
|
/// Don't generate `satisfaction` field
|
||||||
None,
|
None,
|
||||||
/// Analyze the given PSBT to check for existing signatures
|
/// Analyze the given PSBT to check for existing signatures
|
||||||
Psbt(&'a PSBT),
|
Psbt(&'a Psbt),
|
||||||
/// Like `Psbt` variant and also check for expired timelocks
|
/// Like `Psbt` variant and also check for expired timelocks
|
||||||
PsbtTimelocks {
|
PsbtTimelocks {
|
||||||
/// Given PSBT
|
/// Given PSBT
|
||||||
psbt: &'a PSBT,
|
psbt: &'a Psbt,
|
||||||
/// Current blockchain height
|
/// Current blockchain height
|
||||||
current_height: u32,
|
current_height: u32,
|
||||||
/// The highest confirmation height between the inputs
|
/// The highest confirmation height between the inputs
|
||||||
@ -946,7 +946,7 @@ pub enum BuildSatisfaction<'a> {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
impl<'a> BuildSatisfaction<'a> {
|
impl<'a> BuildSatisfaction<'a> {
|
||||||
fn psbt(&self) -> Option<&'a PSBT> {
|
fn psbt(&self) -> Option<&'a Psbt> {
|
||||||
match self {
|
match self {
|
||||||
BuildSatisfaction::None => None,
|
BuildSatisfaction::None => None,
|
||||||
BuildSatisfaction::Psbt(psbt) => Some(psbt),
|
BuildSatisfaction::Psbt(psbt) => Some(psbt),
|
||||||
@ -1475,7 +1475,7 @@ mod test {
|
|||||||
|
|
||||||
let signers_container = Arc::new(SignersContainer::from(keymap));
|
let signers_container = Arc::new(SignersContainer::from(keymap));
|
||||||
|
|
||||||
let psbt: PSBT = deserialize(&base64::decode(ALICE_SIGNED_PSBT).unwrap()).unwrap();
|
let psbt: Psbt = deserialize(&base64::decode(ALICE_SIGNED_PSBT).unwrap()).unwrap();
|
||||||
|
|
||||||
let policy_alice_psbt = wallet_desc
|
let policy_alice_psbt = wallet_desc
|
||||||
.extract_policy(&signers_container, BuildSatisfaction::Psbt(&psbt), &secp)
|
.extract_policy(&signers_container, BuildSatisfaction::Psbt(&psbt), &secp)
|
||||||
@ -1490,7 +1490,7 @@ mod test {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
let psbt: PSBT = deserialize(&base64::decode(BOB_SIGNED_PSBT).unwrap()).unwrap();
|
let psbt: Psbt = deserialize(&base64::decode(BOB_SIGNED_PSBT).unwrap()).unwrap();
|
||||||
let policy_bob_psbt = wallet_desc
|
let policy_bob_psbt = wallet_desc
|
||||||
.extract_policy(&signers_container, BuildSatisfaction::Psbt(&psbt), &secp)
|
.extract_policy(&signers_container, BuildSatisfaction::Psbt(&psbt), &secp)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@ -1504,7 +1504,7 @@ mod test {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
let psbt: PSBT = deserialize(&base64::decode(ALICE_BOB_SIGNED_PSBT).unwrap()).unwrap();
|
let psbt: Psbt = deserialize(&base64::decode(ALICE_BOB_SIGNED_PSBT).unwrap()).unwrap();
|
||||||
let policy_alice_bob_psbt = wallet_desc
|
let policy_alice_bob_psbt = wallet_desc
|
||||||
.extract_policy(&signers_container, BuildSatisfaction::Psbt(&psbt), &secp)
|
.extract_policy(&signers_container, BuildSatisfaction::Psbt(&psbt), &secp)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@ -1545,7 +1545,7 @@ mod test {
|
|||||||
addr.to_string()
|
addr.to_string()
|
||||||
);
|
);
|
||||||
|
|
||||||
let psbt: PSBT =
|
let psbt: Psbt =
|
||||||
deserialize(&base64::decode(PSBT_POLICY_CONSIDER_TIMELOCK_EXPIRED).unwrap()).unwrap();
|
deserialize(&base64::decode(PSBT_POLICY_CONSIDER_TIMELOCK_EXPIRED).unwrap()).unwrap();
|
||||||
|
|
||||||
let build_sat = BuildSatisfaction::PsbtTimelocks {
|
let build_sat = BuildSatisfaction::PsbtTimelocks {
|
||||||
@ -1584,7 +1584,7 @@ mod test {
|
|||||||
);
|
);
|
||||||
//println!("{}", serde_json::to_string(&policy_expired).unwrap());
|
//println!("{}", serde_json::to_string(&policy_expired).unwrap());
|
||||||
|
|
||||||
let psbt_signed: PSBT =
|
let psbt_signed: Psbt =
|
||||||
deserialize(&base64::decode(PSBT_POLICY_CONSIDER_TIMELOCK_EXPIRED_SIGNED).unwrap())
|
deserialize(&base64::decode(PSBT_POLICY_CONSIDER_TIMELOCK_EXPIRED_SIGNED).unwrap())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -9,14 +9,14 @@
|
|||||||
// You may not use this file except in accordance with one or both of these
|
// You may not use this file except in accordance with one or both of these
|
||||||
// licenses.
|
// licenses.
|
||||||
|
|
||||||
use bitcoin::util::psbt::PartiallySignedTransaction as PSBT;
|
use bitcoin::util::psbt::PartiallySignedTransaction as Psbt;
|
||||||
use bitcoin::TxOut;
|
use bitcoin::TxOut;
|
||||||
|
|
||||||
pub trait PsbtUtils {
|
pub trait PsbtUtils {
|
||||||
fn get_utxo_for(&self, input_index: usize) -> Option<TxOut>;
|
fn get_utxo_for(&self, input_index: usize) -> Option<TxOut>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PsbtUtils for PSBT {
|
impl PsbtUtils for Psbt {
|
||||||
fn get_utxo_for(&self, input_index: usize) -> Option<TxOut> {
|
fn get_utxo_for(&self, input_index: usize) -> Option<TxOut> {
|
||||||
let tx = &self.global.unsigned_tx;
|
let tx = &self.global.unsigned_tx;
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ impl PsbtUtils for PSBT {
|
|||||||
mod test {
|
mod test {
|
||||||
use crate::bitcoin::consensus::deserialize;
|
use crate::bitcoin::consensus::deserialize;
|
||||||
use crate::bitcoin::TxIn;
|
use crate::bitcoin::TxIn;
|
||||||
use crate::psbt::PSBT;
|
use crate::psbt::Psbt;
|
||||||
use crate::wallet::test::{get_funded_wallet, get_test_wpkh};
|
use crate::wallet::test::{get_funded_wallet, get_test_wpkh};
|
||||||
use crate::wallet::AddressIndex;
|
use crate::wallet::AddressIndex;
|
||||||
use crate::SignOptions;
|
use crate::SignOptions;
|
||||||
@ -53,7 +53,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "InputIndexOutOfRange")]
|
#[should_panic(expected = "InputIndexOutOfRange")]
|
||||||
fn test_psbt_malformed_psbt_input_legacy() {
|
fn test_psbt_malformed_psbt_input_legacy() {
|
||||||
let psbt_bip: PSBT = deserialize(&base64::decode(PSBT_STR).unwrap()).unwrap();
|
let psbt_bip: Psbt = deserialize(&base64::decode(PSBT_STR).unwrap()).unwrap();
|
||||||
let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
|
let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
|
||||||
let send_to = wallet.get_address(AddressIndex::New).unwrap();
|
let send_to = wallet.get_address(AddressIndex::New).unwrap();
|
||||||
let mut builder = wallet.build_tx();
|
let mut builder = wallet.build_tx();
|
||||||
@ -70,7 +70,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
#[should_panic(expected = "InputIndexOutOfRange")]
|
#[should_panic(expected = "InputIndexOutOfRange")]
|
||||||
fn test_psbt_malformed_psbt_input_segwit() {
|
fn test_psbt_malformed_psbt_input_segwit() {
|
||||||
let psbt_bip: PSBT = deserialize(&base64::decode(PSBT_STR).unwrap()).unwrap();
|
let psbt_bip: Psbt = deserialize(&base64::decode(PSBT_STR).unwrap()).unwrap();
|
||||||
let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
|
let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
|
||||||
let send_to = wallet.get_address(AddressIndex::New).unwrap();
|
let send_to = wallet.get_address(AddressIndex::New).unwrap();
|
||||||
let mut builder = wallet.build_tx();
|
let mut builder = wallet.build_tx();
|
||||||
@ -102,7 +102,7 @@ mod test {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_psbt_sign_with_finalized() {
|
fn test_psbt_sign_with_finalized() {
|
||||||
let psbt_bip: PSBT = deserialize(&base64::decode(PSBT_STR).unwrap()).unwrap();
|
let psbt_bip: Psbt = deserialize(&base64::decode(PSBT_STR).unwrap()).unwrap();
|
||||||
let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
|
let (wallet, _, _) = get_funded_wallet(get_test_wpkh());
|
||||||
let send_to = wallet.get_address(AddressIndex::New).unwrap();
|
let send_to = wallet.get_address(AddressIndex::New).unwrap();
|
||||||
let mut builder = wallet.build_tx();
|
let mut builder = wallet.build_tx();
|
||||||
|
@ -25,7 +25,7 @@ use bitcoin::consensus::encode::serialize;
|
|||||||
use bitcoin::util::base58;
|
use bitcoin::util::base58;
|
||||||
use bitcoin::util::psbt::raw::Key as PSBTKey;
|
use bitcoin::util::psbt::raw::Key as PSBTKey;
|
||||||
use bitcoin::util::psbt::Input;
|
use bitcoin::util::psbt::Input;
|
||||||
use bitcoin::util::psbt::PartiallySignedTransaction as PSBT;
|
use bitcoin::util::psbt::PartiallySignedTransaction as Psbt;
|
||||||
use bitcoin::{Address, Network, OutPoint, Script, SigHashType, Transaction, TxOut, Txid};
|
use bitcoin::{Address, Network, OutPoint, Script, SigHashType, Transaction, TxOut, Txid};
|
||||||
|
|
||||||
use miniscript::descriptor::DescriptorTrait;
|
use miniscript::descriptor::DescriptorTrait;
|
||||||
@ -371,7 +371,7 @@ where
|
|||||||
&self,
|
&self,
|
||||||
coin_selection: Cs,
|
coin_selection: Cs,
|
||||||
params: TxParams,
|
params: TxParams,
|
||||||
) -> Result<(PSBT, TransactionDetails), Error> {
|
) -> Result<(Psbt, TransactionDetails), Error> {
|
||||||
let external_policy = self
|
let external_policy = self
|
||||||
.descriptor
|
.descriptor
|
||||||
.extract_policy(&self.signers, BuildSatisfaction::None, &self.secp)?
|
.extract_policy(&self.signers, BuildSatisfaction::None, &self.secp)?
|
||||||
@ -857,7 +857,7 @@ where
|
|||||||
/// let finalized = wallet.sign(&mut psbt, SignOptions::default())?;
|
/// let finalized = wallet.sign(&mut psbt, SignOptions::default())?;
|
||||||
/// assert!(finalized, "we should have signed all the inputs");
|
/// assert!(finalized, "we should have signed all the inputs");
|
||||||
/// # Ok::<(), bdk::Error>(())
|
/// # Ok::<(), bdk::Error>(())
|
||||||
pub fn sign(&self, psbt: &mut PSBT, sign_options: SignOptions) -> Result<bool, Error> {
|
pub fn sign(&self, psbt: &mut Psbt, sign_options: SignOptions) -> Result<bool, Error> {
|
||||||
// this helps us doing our job later
|
// this helps us doing our job later
|
||||||
self.add_input_hd_keypaths(psbt)?;
|
self.add_input_hd_keypaths(psbt)?;
|
||||||
|
|
||||||
@ -927,7 +927,7 @@ where
|
|||||||
/// Try to finalize a PSBT
|
/// Try to finalize a PSBT
|
||||||
///
|
///
|
||||||
/// The [`SignOptions`] can be used to tweak the behavior of the finalizer.
|
/// The [`SignOptions`] can be used to tweak the behavior of the finalizer.
|
||||||
pub fn finalize_psbt(&self, psbt: &mut PSBT, sign_options: SignOptions) -> Result<bool, Error> {
|
pub fn finalize_psbt(&self, psbt: &mut Psbt, sign_options: SignOptions) -> Result<bool, Error> {
|
||||||
let tx = &psbt.global.unsigned_tx;
|
let tx = &psbt.global.unsigned_tx;
|
||||||
let mut finished = true;
|
let mut finished = true;
|
||||||
|
|
||||||
@ -1228,10 +1228,10 @@ where
|
|||||||
tx: Transaction,
|
tx: Transaction,
|
||||||
selected: Vec<Utxo>,
|
selected: Vec<Utxo>,
|
||||||
params: TxParams,
|
params: TxParams,
|
||||||
) -> Result<PSBT, Error> {
|
) -> Result<Psbt, Error> {
|
||||||
use bitcoin::util::psbt::serialize::Serialize;
|
use bitcoin::util::psbt::serialize::Serialize;
|
||||||
|
|
||||||
let mut psbt = PSBT::from_unsigned_tx(tx)?;
|
let mut psbt = Psbt::from_unsigned_tx(tx)?;
|
||||||
|
|
||||||
if params.add_global_xpubs {
|
if params.add_global_xpubs {
|
||||||
let mut all_xpubs = self.descriptor.get_extended_keys()?;
|
let mut all_xpubs = self.descriptor.get_extended_keys()?;
|
||||||
@ -1371,7 +1371,7 @@ where
|
|||||||
Ok(psbt_input)
|
Ok(psbt_input)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_input_hd_keypaths(&self, psbt: &mut PSBT) -> Result<(), Error> {
|
fn add_input_hd_keypaths(&self, psbt: &mut Psbt) -> Result<(), Error> {
|
||||||
let mut input_utxos = Vec::with_capacity(psbt.inputs.len());
|
let mut input_utxos = Vec::with_capacity(psbt.inputs.len());
|
||||||
for n in 0..psbt.inputs.len() {
|
for n in 0..psbt.inputs.len() {
|
||||||
input_utxos.push(psbt.get_utxo_for(n).clone());
|
input_utxos.push(psbt.get_utxo_for(n).clone());
|
||||||
|
@ -41,7 +41,7 @@ use std::collections::HashSet;
|
|||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
use bitcoin::util::psbt::{self, PartiallySignedTransaction as PSBT};
|
use bitcoin::util::psbt::{self, PartiallySignedTransaction as Psbt};
|
||||||
use bitcoin::{OutPoint, Script, SigHashType, Transaction};
|
use bitcoin::{OutPoint, Script, SigHashType, Transaction};
|
||||||
|
|
||||||
use miniscript::descriptor::DescriptorTrait;
|
use miniscript::descriptor::DescriptorTrait;
|
||||||
@ -521,7 +521,7 @@ impl<'a, B, D: BatchDatabase, Cs: CoinSelectionAlgorithm<D>, Ctx: TxBuilderConte
|
|||||||
/// Returns the [`BIP174`] "PSBT" and summary details about the transaction.
|
/// Returns the [`BIP174`] "PSBT" and summary details about the transaction.
|
||||||
///
|
///
|
||||||
/// [`BIP174`]: https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki
|
/// [`BIP174`]: https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki
|
||||||
pub fn finish(self) -> Result<(PSBT, TransactionDetails), Error> {
|
pub fn finish(self) -> Result<(Psbt, TransactionDetails), Error> {
|
||||||
self.wallet.create_tx(self.coin_selection, self.params)
|
self.wallet.create_tx(self.coin_selection, self.params)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user