.iter()
.chain(self.change_signers.signers().iter())
{
- for index in 0..psbt.inputs.len() {
- signer.sign(&mut psbt, index)?;
+ if signer.sign_whole_tx() {
+ signer.sign(&mut psbt, None)?;
+ } else {
+ for index in 0..psbt.inputs.len() {
+ signer.sign(&mut psbt, Some(index))?;
+ }
}
}
-use std::any::Any;
use std::cmp::Ordering;
use std::collections::BTreeMap;
use std::fmt;
fn sign(
&self,
psbt: &mut psbt::PartiallySignedTransaction,
- input_index: usize,
+ input_index: Option<usize>,
) -> Result<(), SignerError>;
+ fn sign_whole_tx(&self) -> bool {
+ false
+ }
+
fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
None
}
fn sign(
&self,
psbt: &mut psbt::PartiallySignedTransaction,
- input_index: usize,
+ input_index: Option<usize>,
) -> Result<(), SignerError> {
+ let input_index = input_index.unwrap();
if input_index >= psbt.inputs.len() {
return Err(SignerError::InputIndexOutOfRange);
}
let ctx = Secp256k1::signing_only();
let derived_key = self.xkey.derive_priv(&ctx, &deriv_path).unwrap();
- derived_key.private_key.sign(psbt, input_index)
+ derived_key.private_key.sign(psbt, Some(input_index))
}
fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
fn sign(
&self,
psbt: &mut psbt::PartiallySignedTransaction,
- input_index: usize,
+ input_index: Option<usize>,
) -> Result<(), SignerError> {
+ let input_index = input_index.unwrap();
if input_index >= psbt.inputs.len() {
return Err(SignerError::InputIndexOutOfRange);
}
}
}
-impl<Pk: MiniscriptKey + Any> Signer for SignersContainer<Pk> {
- fn sign(
- &self,
- psbt: &mut psbt::PartiallySignedTransaction,
- input_index: usize,
- ) -> Result<(), SignerError> {
- for signer in self.0.values() {
- signer.sign(psbt, input_index)?;
- }
-
- Ok(())
- }
-}
-
impl From<KeyMap> for SignersContainer<DescriptorPublicKey> {
fn from(keymap: KeyMap) -> SignersContainer<DescriptorPublicKey> {
let mut container = SignersContainer::new();