[wallet] Add explicit ordering for the signers

This commit is contained in:
Alekos Filini
2020-08-17 12:10:51 +02:00
parent f54243fd18
commit 991db28170
2 changed files with 89 additions and 16 deletions

View File

@@ -24,7 +24,7 @@ pub mod tx_builder;
pub mod utils;
use address_validator::AddressValidator;
use signer::{Signer, SignerId, SignersContainer};
use signer::{Signer, SignerId, SignerOrdering, SignersContainer};
use tx_builder::TxBuilder;
use utils::{After, FeeRate, IsDust, Older};
@@ -142,6 +142,7 @@ where
&mut self,
script_type: ScriptType,
id: SignerId<DescriptorPublicKey>,
ordering: SignerOrdering,
signer: Arc<Box<dyn Signer>>,
) {
let signers = match script_type {
@@ -149,7 +150,7 @@ where
ScriptType::Internal => Arc::make_mut(&mut self.change_signers),
};
signers.add_external(id, signer);
signers.add_external(id, ordering, signer);
}
pub fn add_address_validator(&mut self, validator: Arc<Box<dyn AddressValidator>>) {
@@ -575,15 +576,18 @@ where
Ok((psbt, details))
}
// TODO: define an enum for signing errors
pub fn sign(&self, mut psbt: PSBT, assume_height: Option<u32>) -> Result<(PSBT, bool), Error> {
// this helps us doing our job later
self.add_input_hd_keypaths(&mut psbt)?;
for index in 0..psbt.inputs.len() {
self.signers.sign(&mut psbt, index)?;
if self.change_descriptor.is_some() {
self.change_signers.sign(&mut psbt, index)?;
for signer in self
.signers
.signers()
.iter()
.chain(self.change_signers.signers().iter())
{
for index in 0..psbt.inputs.len() {
signer.sign(&mut psbt, index)?;
}
}