From eda23491c027699f3e64e263ee6651103326b553 Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Thu, 11 Feb 2021 10:58:44 -0800 Subject: [PATCH 1/6] Fix clippy warning 'unnecessary_wraps' --- src/descriptor/policy.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/descriptor/policy.rs b/src/descriptor/policy.rs index 3550c49c..83c6731e 100644 --- a/src/descriptor/policy.rs +++ b/src/descriptor/policy.rs @@ -354,7 +354,7 @@ impl Satisfaction { } } - fn finalize(&mut self) -> Result<(), PolicyError> { + fn finalize(&mut self) { // if partial try to bump it to a partialcomplete if let Satisfaction::Partial { n, @@ -420,8 +420,6 @@ impl Satisfaction { }; } } - - Ok(()) } } @@ -575,7 +573,7 @@ impl Policy { for (index, item) in items.iter().enumerate() { contribution.add(&item.contribution, index)?; } - contribution.finalize()?; + contribution.finalize(); let mut policy: Policy = SatisfiableItem::Thresh { items, threshold }.into(); policy.contribution = contribution; @@ -613,7 +611,7 @@ impl Policy { )?; } } - contribution.finalize()?; + contribution.finalize(); let mut policy: Policy = SatisfiableItem::Multisig { keys: parsed_keys, From 04348d00908b027bea52ef294503da072d760b91 Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Thu, 11 Feb 2021 11:00:48 -0800 Subject: [PATCH 2/6] Fix clippy warning 'wrong_self_convention' --- src/descriptor/dsl.rs | 46 +++++++++++++-------------- src/descriptor/mod.rs | 65 ++++++++++++++++++++------------------ src/descriptor/policy.rs | 36 +++++++++++++++------ src/descriptor/template.rs | 4 +-- src/keys/mod.rs | 50 ++++++++++++++--------------- src/wallet/mod.rs | 4 +-- src/wallet/signer.rs | 8 +++-- 7 files changed, 118 insertions(+), 95 deletions(-) diff --git a/src/descriptor/dsl.rs b/src/descriptor/dsl.rs index bc1f7256..75d2d147 100644 --- a/src/descriptor/dsl.rs +++ b/src/descriptor/dsl.rs @@ -79,7 +79,7 @@ macro_rules! impl_top_level_pk { use $crate::keys::{DescriptorKey, ToDescriptorKey}; let secp = $crate::bitcoin::secp256k1::Secp256k1::new(); - $key.to_descriptor_key() + $key.into_descriptor_key() .and_then(|key: DescriptorKey<$ctx>| key.extract(&secp)) .map_err($crate::descriptor::DescriptorError::Key) .map(|(pk, key_map, valid_networks)| ($inner_type::new(pk), key_map, valid_networks)) @@ -230,7 +230,7 @@ macro_rules! impl_sortedmulti { let mut keys = vec![]; $( - keys.push($key.to_descriptor_key()); + keys.push($key.into_descriptor_key()); )* keys.into_iter().collect::, _>>() @@ -658,7 +658,7 @@ macro_rules! fragment { let mut keys = vec![]; $( - keys.push($key.to_descriptor_key()); + keys.push($key.into_descriptor_key()); )* keys.into_iter().collect::, _>>() @@ -808,7 +808,7 @@ mod test { let xprv = bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap(); let path = bip32::DerivationPath::from_str("m/0").unwrap(); - let desc_key = (xprv, path.clone()).to_descriptor_key().unwrap(); + let desc_key = (xprv, path.clone()).into_descriptor_key().unwrap(); check( descriptor!(pk(desc_key)), false, @@ -820,7 +820,7 @@ mod test { ], ); - let desc_key = (xprv, path.clone()).to_descriptor_key().unwrap(); + let desc_key = (xprv, path.clone()).into_descriptor_key().unwrap(); check( descriptor!(pkh(desc_key)), false, @@ -833,8 +833,8 @@ mod test { ); let path2 = bip32::DerivationPath::from_str("m/2147483647'/0").unwrap(); - let desc_key1 = (xprv, path).to_descriptor_key().unwrap(); - let desc_key2 = (xprv, path2).to_descriptor_key().unwrap(); + let desc_key1 = (xprv, path).into_descriptor_key().unwrap(); + let desc_key2 = (xprv, path2).into_descriptor_key().unwrap(); check( descriptor!(sh(multi(1, desc_key1, desc_key2))), @@ -853,7 +853,7 @@ mod test { let xprv = bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap(); let path = bip32::DerivationPath::from_str("m/0").unwrap(); - let desc_key = (xprv, path.clone()).to_descriptor_key().unwrap(); + let desc_key = (xprv, path.clone()).into_descriptor_key().unwrap(); check( descriptor!(wpkh(desc_key)), true, @@ -865,7 +865,7 @@ mod test { ], ); - let desc_key = (xprv, path.clone()).to_descriptor_key().unwrap(); + let desc_key = (xprv, path.clone()).into_descriptor_key().unwrap(); check( descriptor!(sh(wpkh(desc_key))), true, @@ -878,8 +878,8 @@ mod test { ); let path2 = bip32::DerivationPath::from_str("m/2147483647'/0").unwrap(); - let desc_key1 = (xprv, path.clone()).to_descriptor_key().unwrap(); - let desc_key2 = (xprv, path2.clone()).to_descriptor_key().unwrap(); + let desc_key1 = (xprv, path.clone()).into_descriptor_key().unwrap(); + let desc_key2 = (xprv, path2.clone()).into_descriptor_key().unwrap(); check( descriptor!(wsh(multi(1, desc_key1, desc_key2))), true, @@ -891,8 +891,8 @@ mod test { ], ); - let desc_key1 = (xprv, path).to_descriptor_key().unwrap(); - let desc_key2 = (xprv, path2).to_descriptor_key().unwrap(); + let desc_key1 = (xprv, path).into_descriptor_key().unwrap(); + let desc_key2 = (xprv, path2).into_descriptor_key().unwrap(); check( descriptor!(sh(wsh(multi(1, desc_key1, desc_key2)))), true, @@ -968,7 +968,7 @@ mod test { fn test_valid_networks() { let xprv = bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap(); let path = bip32::DerivationPath::from_str("m/0").unwrap(); - let desc_key = (xprv, path.clone()).to_descriptor_key().unwrap(); + let desc_key = (xprv, path.clone()).into_descriptor_key().unwrap(); let (_desc, _key_map, valid_networks) = descriptor!(pkh(desc_key)).unwrap(); assert_eq!( @@ -978,7 +978,7 @@ mod test { let xprv = bip32::ExtendedPrivKey::from_str("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi").unwrap(); let path = bip32::DerivationPath::from_str("m/10/20/30/40").unwrap(); - let desc_key = (xprv, path.clone()).to_descriptor_key().unwrap(); + let desc_key = (xprv, path.clone()).into_descriptor_key().unwrap(); let (_desc, _key_map, valid_networks) = descriptor!(wpkh(desc_key)).unwrap(); assert_eq!(valid_networks, [Bitcoin].iter().cloned().collect()); @@ -991,26 +991,26 @@ mod test { let xprv1 = bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap(); let path1 = bip32::DerivationPath::from_str("m/0").unwrap(); - let desc_key1 = (xprv1, path1.clone()).to_descriptor_key().unwrap(); + let desc_key1 = (xprv1, path1.clone()).into_descriptor_key().unwrap(); let xprv2 = bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPegBHHnq7YEgM815dG24M2Jk5RVqipgDxF1HJ1tsnT815X5Fd5FRfMVUs8NZs9XCb6y9an8hRPThnhfwfXJ36intaekySHGF").unwrap(); let path2 = bip32::DerivationPath::from_str("m/2147483647'/0").unwrap(); - let desc_key2 = (xprv2, path2.clone()).to_descriptor_key().unwrap(); + let desc_key2 = (xprv2, path2.clone()).into_descriptor_key().unwrap(); let xprv3 = bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPdZXrcHNLf5JAJWFAoJ2TrstMRdSKtEggz6PddbuSkvHKM9oKJyFgZV1B7rw8oChspxyYbtmEXYyg1AjfWbL3ho3XHDpHRZf").unwrap(); let path3 = bip32::DerivationPath::from_str("m/10/20/30/40").unwrap(); - let desc_key3 = (xprv3, path3.clone()).to_descriptor_key().unwrap(); + let desc_key3 = (xprv3, path3.clone()).into_descriptor_key().unwrap(); let (_desc, key_map, _valid_networks) = descriptor!(sh(wsh(multi(2, desc_key1, desc_key2, desc_key3)))).unwrap(); assert_eq!(key_map.len(), 3); let desc_key1: DescriptorKey = - (xprv1, path1.clone()).to_descriptor_key().unwrap(); + (xprv1, path1.clone()).into_descriptor_key().unwrap(); let desc_key2: DescriptorKey = - (xprv2, path2.clone()).to_descriptor_key().unwrap(); + (xprv2, path2.clone()).into_descriptor_key().unwrap(); let desc_key3: DescriptorKey = - (xprv3, path3.clone()).to_descriptor_key().unwrap(); + (xprv3, path3.clone()).into_descriptor_key().unwrap(); let (key1, _key_map, _valid_networks) = desc_key1.extract(&secp).unwrap(); let (key2, _key_map, _valid_networks) = desc_key2.extract(&secp).unwrap(); @@ -1026,13 +1026,13 @@ mod test { // this compiles let xprv = bip32::ExtendedPrivKey::from_str("tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy").unwrap(); let path = bip32::DerivationPath::from_str("m/0").unwrap(); - let desc_key: DescriptorKey = (xprv, path.clone()).to_descriptor_key().unwrap(); + let desc_key: DescriptorKey = (xprv, path.clone()).into_descriptor_key().unwrap(); let (desc, _key_map, _valid_networks) = descriptor!(pkh(desc_key)).unwrap(); assert_eq!(desc.to_string(), "pkh(tpubD6NzVbkrYhZ4WR7a4vY1VT3khMJMeAxVsfq9TBJyJWrNk247zCJtV7AWf6UJP7rAVsn8NNKdJi3gFyKPTmWZS9iukb91xbn2HbFSMQm2igY/0/*)#yrnz9pp2"); // as expected this does not compile due to invalid context - //let desc_key:DescriptorKey = (xprv, path.clone()).to_descriptor_key().unwrap(); + //let desc_key:DescriptorKey = (xprv, path.clone()).into_descriptor_key().unwrap(); //let (desc, _key_map, _valid_networks) = descriptor!(pkh(desc_key)).unwrap(); } diff --git a/src/descriptor/mod.rs b/src/descriptor/mod.rs index 19322029..4b9aec46 100644 --- a/src/descriptor/mod.rs +++ b/src/descriptor/mod.rs @@ -74,7 +74,7 @@ pub type HDKeyPaths = BTreeMap; /// Trait for types which can be converted into an [`ExtendedDescriptor`] and a [`KeyMap`] usable by a wallet in a specific [`Network`] pub trait ToWalletDescriptor { /// Convert to wallet descriptor - fn to_wallet_descriptor( + fn into_wallet_descriptor( self, secp: &SecpCtx, network: Network, @@ -82,7 +82,7 @@ pub trait ToWalletDescriptor { } impl ToWalletDescriptor for &str { - fn to_wallet_descriptor( + fn into_wallet_descriptor( self, secp: &SecpCtx, network: Network, @@ -102,32 +102,33 @@ impl ToWalletDescriptor for &str { self }; - ExtendedDescriptor::parse_descriptor(secp, descriptor)?.to_wallet_descriptor(secp, network) + ExtendedDescriptor::parse_descriptor(secp, descriptor)? + .into_wallet_descriptor(secp, network) } } impl ToWalletDescriptor for &String { - fn to_wallet_descriptor( + fn into_wallet_descriptor( self, secp: &SecpCtx, network: Network, ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> { - self.as_str().to_wallet_descriptor(secp, network) + self.as_str().into_wallet_descriptor(secp, network) } } impl ToWalletDescriptor for ExtendedDescriptor { - fn to_wallet_descriptor( + fn into_wallet_descriptor( self, secp: &SecpCtx, network: Network, ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> { - (self, KeyMap::default()).to_wallet_descriptor(secp, network) + (self, KeyMap::default()).into_wallet_descriptor(secp, network) } } impl ToWalletDescriptor for (ExtendedDescriptor, KeyMap) { - fn to_wallet_descriptor( + fn into_wallet_descriptor( self, secp: &SecpCtx, network: Network, @@ -137,11 +138,11 @@ impl ToWalletDescriptor for (ExtendedDescriptor, KeyMap) { let check_key = |pk: &DescriptorPublicKey| { let (pk, _, networks) = if self.0.is_witness() { let desciptor_key: DescriptorKey = - pk.clone().to_descriptor_key()?; + pk.clone().into_descriptor_key()?; desciptor_key.extract(&secp)? } else { let desciptor_key: DescriptorKey = - pk.clone().to_descriptor_key()?; + pk.clone().into_descriptor_key()?; desciptor_key.extract(&secp)? }; @@ -160,7 +161,7 @@ impl ToWalletDescriptor for (ExtendedDescriptor, KeyMap) { } impl ToWalletDescriptor for DescriptorTemplateOut { - fn to_wallet_descriptor( + fn into_wallet_descriptor( self, _secp: &SecpCtx, network: Network, @@ -622,14 +623,16 @@ mod test { // here `to_descriptor_key` will set the valid networks for the key to only mainnet, since // we are using an "xpub" - let key = (xpub, path).to_descriptor_key().unwrap(); + let key = (xpub, path).into_descriptor_key().unwrap(); // override it with any. this happens in some key conversions, like bip39 let key = key.override_valid_networks(any_network()); // make a descriptor out of it let desc = crate::descriptor!(wpkh(key)).unwrap(); // this should conver the key that supports "any_network" to the right network (testnet) - let (wallet_desc, _) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, _) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); assert_eq!(wallet_desc.to_string(), "wpkh(tpubDEnoLuPdBep9bzw5LoGYpsxUQYheRQ9gcgrJhJEcdKFB9cWQRyYmkCyRoTqeD4tJYiVVgt6A3rN6rWn9RYhR9sBsGxji29LYWHuKKbdb1ev/0/*)#y8p7e8kk"); } @@ -640,30 +643,30 @@ mod test { let secp = Secp256k1::new(); let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)#tqz0nc62" - .to_wallet_descriptor(&secp, Network::Testnet); + .into_wallet_descriptor(&secp, Network::Testnet); assert!(desc.is_ok()); let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)" - .to_wallet_descriptor(&secp, Network::Testnet); + .into_wallet_descriptor(&secp, Network::Testnet); assert!(desc.is_ok()); let desc = "wpkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/1/2/*)#67ju93jw" - .to_wallet_descriptor(&secp, Network::Testnet); + .into_wallet_descriptor(&secp, Network::Testnet); assert!(desc.is_ok()); let desc = "wpkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/1/2/*)" - .to_wallet_descriptor(&secp, Network::Testnet); + .into_wallet_descriptor(&secp, Network::Testnet); assert!(desc.is_ok()); let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)#67ju93jw" - .to_wallet_descriptor(&secp, Network::Testnet); + .into_wallet_descriptor(&secp, Network::Testnet); assert!(matches!( desc.err(), Some(DescriptorError::InvalidDescriptorChecksum) )); let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)#67ju93jw" - .to_wallet_descriptor(&secp, Network::Testnet); + .into_wallet_descriptor(&secp, Network::Testnet); assert!(matches!( desc.err(), Some(DescriptorError::InvalidDescriptorChecksum) @@ -676,38 +679,38 @@ mod test { let secp = Secp256k1::new(); let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)" - .to_wallet_descriptor(&secp, Network::Testnet); + .into_wallet_descriptor(&secp, Network::Testnet); assert!(desc.is_ok()); let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)" - .to_wallet_descriptor(&secp, Network::Regtest); + .into_wallet_descriptor(&secp, Network::Regtest); assert!(desc.is_ok()); let desc = "wpkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/1/2/*)" - .to_wallet_descriptor(&secp, Network::Testnet); + .into_wallet_descriptor(&secp, Network::Testnet); assert!(desc.is_ok()); let desc = "wpkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/1/2/*)" - .to_wallet_descriptor(&secp, Network::Regtest); + .into_wallet_descriptor(&secp, Network::Regtest); assert!(desc.is_ok()); let desc = "sh(wpkh(02864bb4ad00cefa806098a69e192bbda937494e69eb452b87bb3f20f6283baedb))" - .to_wallet_descriptor(&secp, Network::Testnet); + .into_wallet_descriptor(&secp, Network::Testnet); assert!(desc.is_ok()); let desc = "sh(wpkh(02864bb4ad00cefa806098a69e192bbda937494e69eb452b87bb3f20f6283baedb))" - .to_wallet_descriptor(&secp, Network::Bitcoin); + .into_wallet_descriptor(&secp, Network::Bitcoin); assert!(desc.is_ok()); let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)" - .to_wallet_descriptor(&secp, Network::Bitcoin); + .into_wallet_descriptor(&secp, Network::Bitcoin); assert!(matches!( desc.err(), Some(DescriptorError::Key(KeyError::InvalidNetwork)) )); let desc = "wpkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/1/2/*)" - .to_wallet_descriptor(&secp, Network::Bitcoin); + .into_wallet_descriptor(&secp, Network::Bitcoin); assert!(matches!( desc.err(), Some(DescriptorError::Key(KeyError::InvalidNetwork)) @@ -721,17 +724,19 @@ mod test { let tpub = bip32::ExtendedPubKey::from_str("tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK").unwrap(); let path = bip32::DerivationPath::from_str("m/1/2").unwrap(); - let key = (tpub, path).to_descriptor_key().unwrap(); + let key = (tpub, path).into_descriptor_key().unwrap(); // make a descriptor out of it let desc = crate::descriptor!(wpkh(key)).unwrap(); - let (wallet_desc, _) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, _) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let wallet_desc_str = wallet_desc.to_string(); assert_eq!(wallet_desc_str, "wpkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/1/2/*)#67ju93jw"); let (wallet_desc2, _) = wallet_desc_str - .to_wallet_descriptor(&secp, Network::Testnet) + .into_wallet_descriptor(&secp, Network::Testnet) .unwrap(); assert_eq!(wallet_desc, wallet_desc2) } diff --git a/src/descriptor/policy.rs b/src/descriptor/policy.rs index 83c6731e..11f8ed86 100644 --- a/src/descriptor/policy.rs +++ b/src/descriptor/policy.rs @@ -913,8 +913,8 @@ mod test { let tprv = bip32::ExtendedPrivKey::from_str(tprv).unwrap(); let tpub = bip32::ExtendedPubKey::from_private(&secp, &tprv); let fingerprint = tprv.fingerprint(&secp); - let prvkey = (tprv, path.clone()).to_descriptor_key().unwrap(); - let pubkey = (tpub, path).to_descriptor_key().unwrap(); + let prvkey = (tprv, path.clone()).into_descriptor_key().unwrap(); + let pubkey = (tpub, path).into_descriptor_key().unwrap(); (prvkey, pubkey, fingerprint) } @@ -927,7 +927,9 @@ mod test { let (prvkey, pubkey, fingerprint) = setup_keys(TPRV0_STR); let desc = descriptor!(wpkh(pubkey)).unwrap(); - let (wallet_desc, keymap) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, keymap) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let signers_container = Arc::new(SignersContainer::from(keymap)); let policy = wallet_desc .extract_policy(&signers_container, &Secp256k1::new()) @@ -940,7 +942,9 @@ mod test { assert!(matches!(&policy.contribution, Satisfaction::None)); let desc = descriptor!(wpkh(prvkey)).unwrap(); - let (wallet_desc, keymap) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, keymap) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let signers_container = Arc::new(SignersContainer::from(keymap)); let policy = wallet_desc .extract_policy(&signers_container, &Secp256k1::new()) @@ -1023,7 +1027,9 @@ mod test { let (_prvkey0, pubkey0, fingerprint0) = setup_keys(TPRV0_STR); let (prvkey1, _pubkey1, fingerprint1) = setup_keys(TPRV1_STR); let desc = descriptor!(sh(multi(1, pubkey0, prvkey1))).unwrap(); - let (wallet_desc, keymap) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, keymap) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let signers_container = Arc::new(SignersContainer::from(keymap)); let policy = wallet_desc .extract_policy(&signers_container, &Secp256k1::new()) @@ -1053,7 +1059,9 @@ mod test { let (prvkey0, _pubkey0, fingerprint0) = setup_keys(TPRV0_STR); let (prvkey1, _pubkey1, fingerprint1) = setup_keys(TPRV1_STR); let desc = descriptor!(sh(multi(2, prvkey0, prvkey1))).unwrap(); - let (wallet_desc, keymap) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, keymap) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let signers_container = Arc::new(SignersContainer::from(keymap)); let policy = wallet_desc .extract_policy(&signers_container, &Secp256k1::new()) @@ -1083,7 +1091,9 @@ mod test { let (prvkey, pubkey, fingerprint) = setup_keys(TPRV0_STR); let desc = descriptor!(wpkh(pubkey)).unwrap(); - let (wallet_desc, keymap) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, keymap) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let single_key = wallet_desc.derive(0); let signers_container = Arc::new(SignersContainer::from(keymap)); let policy = single_key @@ -1097,7 +1107,9 @@ mod test { assert!(matches!(&policy.contribution, Satisfaction::None)); let desc = descriptor!(wpkh(prvkey)).unwrap(); - let (wallet_desc, keymap) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, keymap) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let single_key = wallet_desc.derive(0); let signers_container = Arc::new(SignersContainer::from(keymap)); let policy = single_key @@ -1122,7 +1134,9 @@ mod test { let (_prvkey0, pubkey0, fingerprint0) = setup_keys(TPRV0_STR); let (prvkey1, _pubkey1, fingerprint1) = setup_keys(TPRV1_STR); let desc = descriptor!(sh(multi(1, pubkey0, prvkey1))).unwrap(); - let (wallet_desc, keymap) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, keymap) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let single_key = wallet_desc.derive(0); let signers_container = Arc::new(SignersContainer::from(keymap)); let policy = single_key @@ -1164,7 +1178,9 @@ mod test { ))) .unwrap(); - let (wallet_desc, keymap) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (wallet_desc, keymap) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let signers_container = Arc::new(SignersContainer::from(keymap)); let policy = wallet_desc .extract_policy(&signers_container, &Secp256k1::new()) diff --git a/src/descriptor/template.rs b/src/descriptor/template.rs index f269c7a9..95d02921 100644 --- a/src/descriptor/template.rs +++ b/src/descriptor/template.rs @@ -70,12 +70,12 @@ pub trait DescriptorTemplate { /// Turns a [`DescriptorTemplate`] into a valid wallet descriptor by calling its /// [`build`](DescriptorTemplate::build) method impl ToWalletDescriptor for T { - fn to_wallet_descriptor( + fn into_wallet_descriptor( self, secp: &SecpCtx, network: Network, ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError> { - Ok(self.build()?.to_wallet_descriptor(secp, network)?) + Ok(self.build()?.into_wallet_descriptor(secp, network)?) } } diff --git a/src/keys/mod.rs b/src/keys/mod.rs index 065c008b..3f6bfe03 100644 --- a/src/keys/mod.rs +++ b/src/keys/mod.rs @@ -212,8 +212,8 @@ impl ExtScriptContext for Ctx { /// } /// /// impl ToDescriptorKey for MyKeyType { -/// fn to_descriptor_key(self) -> Result, KeyError> { -/// self.pubkey.to_descriptor_key() +/// fn into_descriptor_key(self) -> Result, KeyError> { +/// self.pubkey.into_descriptor_key() /// } /// } /// ``` @@ -233,7 +233,7 @@ impl ExtScriptContext for Ctx { /// } /// /// impl ToDescriptorKey for MyKeyType { -/// fn to_descriptor_key(self) -> Result, KeyError> { +/// fn into_descriptor_key(self) -> Result, KeyError> { /// Ok(DescriptorKey::from_public( /// DescriptorPublicKey::SinglePub(DescriptorSinglePub { /// origin: None, @@ -258,9 +258,9 @@ impl ExtScriptContext for Ctx { /// } /// /// impl ToDescriptorKey for MyKeyType { -/// fn to_descriptor_key(self) -> Result, KeyError> { +/// fn into_descriptor_key(self) -> Result, KeyError> { /// if Ctx::is_legacy() == self.is_legacy { -/// self.pubkey.to_descriptor_key() +/// self.pubkey.into_descriptor_key() /// } else { /// Err(KeyError::InvalidScriptContext) /// } @@ -286,8 +286,8 @@ impl ExtScriptContext for Ctx { /// } /// /// impl ToDescriptorKey for MySegwitOnlyKeyType { -/// fn to_descriptor_key(self) -> Result, KeyError> { -/// self.pubkey.to_descriptor_key() +/// fn into_descriptor_key(self) -> Result, KeyError> { +/// self.pubkey.into_descriptor_key() /// } /// } /// @@ -301,7 +301,7 @@ impl ExtScriptContext for Ctx { /// ``` pub trait ToDescriptorKey: Sized { /// Turn the key into a [`DescriptorKey`] within the requested [`ScriptContext`] - fn to_descriptor_key(self) -> Result, KeyError>; + fn into_descriptor_key(self) -> Result, KeyError>; } /// Enum for extended keys that can be either `xprv` or `xpub` @@ -499,14 +499,14 @@ let xprv = xkey.into_xprv(Network::Bitcoin).unwrap(); derivation_path, wildcard: Wildcard::Unhardened, }) - .to_descriptor_key(), + .into_descriptor_key(), ExtendedKey::Public((xpub, _)) => DescriptorPublicKey::XPub(DescriptorXKey { origin, xkey: xpub, derivation_path, wildcard: Wildcard::Unhardened, }) - .to_descriptor_key(), + .into_descriptor_key(), } } } @@ -588,8 +588,8 @@ where Ctx: ScriptContext, K: ToDescriptorKey, { - fn to_descriptor_key(self) -> Result, KeyError> { - let desc_key = self.key.to_descriptor_key()?; + fn into_descriptor_key(self) -> Result, KeyError> { + let desc_key = self.key.into_descriptor_key()?; Ok(desc_key.override_valid_networks(self.valid_networks)) } } @@ -712,7 +712,7 @@ impl GeneratableKey for PrivateKey { } impl> ToDescriptorKey for (T, bip32::DerivationPath) { - fn to_descriptor_key(self) -> Result, KeyError> { + fn into_descriptor_key(self) -> Result, KeyError> { self.0.into_descriptor_key(None, self.1) } } @@ -720,7 +720,7 @@ impl> ToDescriptorKey for (T, bip3 impl> ToDescriptorKey for (T, bip32::KeySource, bip32::DerivationPath) { - fn to_descriptor_key(self) -> Result, KeyError> { + fn into_descriptor_key(self) -> Result, KeyError> { self.0.into_descriptor_key(Some(self.1), self.2) } } @@ -731,7 +731,7 @@ fn expand_multi_keys, Ctx: ScriptContext>( ) -> Result<(Vec, KeyMap, ValidNetworks), KeyError> { let (pks, key_maps_networks): (Vec<_>, Vec<_>) = pks .into_iter() - .map(|key| Ok::<_, KeyError>(key.to_descriptor_key()?.extract(secp)?)) + .map(|key| Ok::<_, KeyError>(key.into_descriptor_key()?.extract(secp)?)) .collect::, _>>()? .into_iter() .map(|(a, b, c)| (a, (b, c))) @@ -756,7 +756,7 @@ pub fn make_pk, Ctx: ScriptContext>( descriptor_key: Pk, secp: &SecpCtx, ) -> Result<(Miniscript, KeyMap, ValidNetworks), DescriptorError> { - let (key, key_map, valid_networks) = descriptor_key.to_descriptor_key()?.extract(secp)?; + let (key, key_map, valid_networks) = descriptor_key.into_descriptor_key()?.extract(secp)?; let minisc = Miniscript::from_ast(Terminal::PkK(key))?; minisc.check_minsicript()?; @@ -803,13 +803,13 @@ where /// The "identity" conversion is used internally by some `bdk::fragment`s impl ToDescriptorKey for DescriptorKey { - fn to_descriptor_key(self) -> Result, KeyError> { + fn into_descriptor_key(self) -> Result, KeyError> { Ok(self) } } impl ToDescriptorKey for DescriptorPublicKey { - fn to_descriptor_key(self) -> Result, KeyError> { + fn into_descriptor_key(self) -> Result, KeyError> { let networks = match self { DescriptorPublicKey::SinglePub(_) => any_network(), DescriptorPublicKey::XPub(DescriptorXKey { xkey, .. }) @@ -825,17 +825,17 @@ impl ToDescriptorKey for DescriptorPublicKey { } impl ToDescriptorKey for PublicKey { - fn to_descriptor_key(self) -> Result, KeyError> { + fn into_descriptor_key(self) -> Result, KeyError> { DescriptorPublicKey::SinglePub(DescriptorSinglePub { key: self, origin: None, }) - .to_descriptor_key() + .into_descriptor_key() } } impl ToDescriptorKey for DescriptorSecretKey { - fn to_descriptor_key(self) -> Result, KeyError> { + fn into_descriptor_key(self) -> Result, KeyError> { let networks = match &self { DescriptorSecretKey::SinglePriv(sk) if sk.key.network == Network::Bitcoin => { mainnet_network() @@ -853,20 +853,20 @@ impl ToDescriptorKey for DescriptorSecretKey { } impl ToDescriptorKey for &'_ str { - fn to_descriptor_key(self) -> Result, KeyError> { + fn into_descriptor_key(self) -> Result, KeyError> { DescriptorSecretKey::from_str(self) .map_err(|e| KeyError::Message(e.to_string()))? - .to_descriptor_key() + .into_descriptor_key() } } impl ToDescriptorKey for PrivateKey { - fn to_descriptor_key(self) -> Result, KeyError> { + fn into_descriptor_key(self) -> Result, KeyError> { DescriptorSecretKey::SinglePriv(DescriptorSinglePriv { key: self, origin: None, }) - .to_descriptor_key() + .into_descriptor_key() } } diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index 69e578bf..f862b6e2 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -134,7 +134,7 @@ where ) -> Result { let secp = Secp256k1::new(); - let (descriptor, keymap) = descriptor.to_wallet_descriptor(&secp, network)?; + let (descriptor, keymap) = descriptor.into_wallet_descriptor(&secp, network)?; database.check_descriptor_checksum( KeychainKind::External, get_checksum(&descriptor.to_string())?.as_bytes(), @@ -143,7 +143,7 @@ where let (change_descriptor, change_signers) = match change_descriptor { Some(desc) => { let (change_descriptor, change_keymap) = - desc.to_wallet_descriptor(&secp, network)?; + desc.into_wallet_descriptor(&secp, network)?; database.check_descriptor_checksum( KeychainKind::Internal, get_checksum(&change_descriptor.to_string())?.as_bytes(), diff --git a/src/wallet/signer.rs b/src/wallet/signer.rs index bffc469f..7199dbbd 100644 --- a/src/wallet/signer.rs +++ b/src/wallet/signer.rs @@ -579,7 +579,9 @@ mod signers_container_tests { let (prvkey1, _, _) = setup_keys(TPRV0_STR); let (prvkey2, _, _) = setup_keys(TPRV1_STR); let desc = descriptor!(sh(multi(2, prvkey1, prvkey2))).unwrap(); - let (_, keymap) = desc.to_wallet_descriptor(&secp, Network::Testnet).unwrap(); + let (_, keymap) = desc + .into_wallet_descriptor(&secp, Network::Testnet) + .unwrap(); let signers = SignersContainer::from(keymap); assert_eq!(signers.ids().len(), 2); @@ -690,8 +692,8 @@ mod signers_container_tests { let tprv = bip32::ExtendedPrivKey::from_str(tprv).unwrap(); let tpub = bip32::ExtendedPubKey::from_private(&secp, &tprv); let fingerprint = tprv.fingerprint(&secp); - let prvkey = (tprv, path.clone()).to_descriptor_key().unwrap(); - let pubkey = (tpub, path).to_descriptor_key().unwrap(); + let prvkey = (tprv, path.clone()).into_descriptor_key().unwrap(); + let pubkey = (tpub, path).into_descriptor_key().unwrap(); (prvkey, pubkey, fingerprint) } From c90a1f70a6ec441790829d346fcadf24906155c5 Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Thu, 11 Feb 2021 13:08:21 -0800 Subject: [PATCH 3/6] Fix clippy warn on compact_filters peer::_recv() --- src/blockchain/compact_filters/peer.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/blockchain/compact_filters/peer.rs b/src/blockchain/compact_filters/peer.rs index 62fa2cb4..754c832b 100644 --- a/src/blockchain/compact_filters/peer.rs +++ b/src/blockchain/compact_filters/peer.rs @@ -223,14 +223,14 @@ impl Peer { )), )?; let version = if let NetworkMessage::Version(version) = - Self::_recv(&responses, "version", None)?.unwrap() + Self::_recv(&responses, "version", None).unwrap() { version } else { return Err(CompactFiltersError::InvalidResponse); }; - if let NetworkMessage::Verack = Self::_recv(&responses, "verack", None)?.unwrap() { + if let NetworkMessage::Verack = Self::_recv(&responses, "verack", None).unwrap() { Self::_send(&mut locked_writer, network.magic(), NetworkMessage::Verack)?; } else { return Err(CompactFiltersError::InvalidResponse); @@ -271,7 +271,7 @@ impl Peer { responses: &Arc>, wait_for: &'static str, timeout: Option, - ) -> Result, CompactFiltersError> { + ) -> Option { let message_resp = { let mut lock = responses.write().unwrap(); let message_resp = lock.entry(wait_for).or_default(); @@ -287,15 +287,14 @@ impl Peer { Some(t) => { let result = cvar.wait_timeout(messages, t).unwrap(); if result.1.timed_out() { - return Ok(None); + return None; } - messages = result.0; } } } - Ok(messages.pop()) + messages.pop() } /// Return the [`VersionMessage`] sent by the peer @@ -415,7 +414,7 @@ impl Peer { wait_for: &'static str, timeout: Option, ) -> Result, CompactFiltersError> { - Self::_recv(&self.responses, wait_for, timeout) + Ok(Self::_recv(&self.responses, wait_for, timeout)) } } From 2f7513753c71df9cc2ac07493c09e8ff6b00721d Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Thu, 11 Feb 2021 11:34:06 -0800 Subject: [PATCH 4/6] Update CHANGELOG for rust 1.50.0 clippy changes --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3717708a..59fc9a6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Wallet #### Changed - Removed the explicit `id` argument from `Wallet::add_signer()` since that's now part of `Signer` itself +- Renamed `ToWalletDescriptor::to_wallet_descriptor` to `ToWalletDescriptor::into_wallet_descriptor` + +### Policy +#### Changed +- Removed unneeded `Result<(), PolicyError>` return type for `Satisfaction::finalize()` ## [v0.3.0] - [v0.2.0] From d638da2f10bda0c08b240c05f6fc187d46e3a33a Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Fri, 12 Feb 2021 22:34:43 -0800 Subject: [PATCH 5/6] Rename ToWalletDescriptor to IntoWalletDescriptor --- CHANGELOG.md | 2 +- src/descriptor/mod.rs | 18 +++++++++--------- src/descriptor/policy.rs | 2 +- src/descriptor/template.rs | 6 +++--- src/wallet/mod.rs | 8 ++++---- src/wallet/signer.rs | 2 +- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59fc9a6a..6c2e63ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Wallet #### Changed - Removed the explicit `id` argument from `Wallet::add_signer()` since that's now part of `Signer` itself -- Renamed `ToWalletDescriptor::to_wallet_descriptor` to `ToWalletDescriptor::into_wallet_descriptor` +- Renamed `ToWalletDescriptor::to_wallet_descriptor` to `IntoWalletDescriptor::into_wallet_descriptor` ### Policy #### Changed diff --git a/src/descriptor/mod.rs b/src/descriptor/mod.rs index 4b9aec46..09c60e9f 100644 --- a/src/descriptor/mod.rs +++ b/src/descriptor/mod.rs @@ -72,7 +72,7 @@ pub type DerivedDescriptor<'s> = Descriptor>; pub type HDKeyPaths = BTreeMap; /// Trait for types which can be converted into an [`ExtendedDescriptor`] and a [`KeyMap`] usable by a wallet in a specific [`Network`] -pub trait ToWalletDescriptor { +pub trait IntoWalletDescriptor { /// Convert to wallet descriptor fn into_wallet_descriptor( self, @@ -81,7 +81,7 @@ pub trait ToWalletDescriptor { ) -> Result<(ExtendedDescriptor, KeyMap), DescriptorError>; } -impl ToWalletDescriptor for &str { +impl IntoWalletDescriptor for &str { fn into_wallet_descriptor( self, secp: &SecpCtx, @@ -107,7 +107,7 @@ impl ToWalletDescriptor for &str { } } -impl ToWalletDescriptor for &String { +impl IntoWalletDescriptor for &String { fn into_wallet_descriptor( self, secp: &SecpCtx, @@ -117,7 +117,7 @@ impl ToWalletDescriptor for &String { } } -impl ToWalletDescriptor for ExtendedDescriptor { +impl IntoWalletDescriptor for ExtendedDescriptor { fn into_wallet_descriptor( self, secp: &SecpCtx, @@ -127,7 +127,7 @@ impl ToWalletDescriptor for ExtendedDescriptor { } } -impl ToWalletDescriptor for (ExtendedDescriptor, KeyMap) { +impl IntoWalletDescriptor for (ExtendedDescriptor, KeyMap) { fn into_wallet_descriptor( self, secp: &SecpCtx, @@ -160,7 +160,7 @@ impl ToWalletDescriptor for (ExtendedDescriptor, KeyMap) { } } -impl ToWalletDescriptor for DescriptorTemplateOut { +impl IntoWalletDescriptor for DescriptorTemplateOut { fn into_wallet_descriptor( self, _secp: &SecpCtx, @@ -637,7 +637,7 @@ mod test { assert_eq!(wallet_desc.to_string(), "wpkh(tpubDEnoLuPdBep9bzw5LoGYpsxUQYheRQ9gcgrJhJEcdKFB9cWQRyYmkCyRoTqeD4tJYiVVgt6A3rN6rWn9RYhR9sBsGxji29LYWHuKKbdb1ev/0/*)#y8p7e8kk"); } - // test ToWalletDescriptor trait from &str with and without checksum appended + // test IntoWalletDescriptor trait from &str with and without checksum appended #[test] fn test_descriptor_from_str_with_checksum() { let secp = Secp256k1::new(); @@ -673,7 +673,7 @@ mod test { )); } - // test ToWalletDescriptor trait from &str with keys from right and wrong network + // test IntoWalletDescriptor trait from &str with keys from right and wrong network #[test] fn test_descriptor_from_str_with_keys_network() { let secp = Secp256k1::new(); @@ -717,7 +717,7 @@ mod test { )); } - // test ToWalletDescriptor trait from the output of the descriptor!() macro + // test IntoWalletDescriptor trait from the output of the descriptor!() macro #[test] fn test_descriptor_from_str_from_output_of_macro() { let secp = Secp256k1::new(); diff --git a/src/descriptor/policy.rs b/src/descriptor/policy.rs index 11f8ed86..f138dfdb 100644 --- a/src/descriptor/policy.rs +++ b/src/descriptor/policy.rs @@ -888,7 +888,7 @@ impl ExtractPolicy for Descriptor { #[cfg(test)] mod test { use crate::descriptor; - use crate::descriptor::{ExtractPolicy, ToWalletDescriptor}; + use crate::descriptor::{ExtractPolicy, IntoWalletDescriptor}; use super::*; use crate::descriptor::policy::SatisfiableItem::{Multisig, Signature, Thresh}; diff --git a/src/descriptor/template.rs b/src/descriptor/template.rs index 95d02921..98103dc6 100644 --- a/src/descriptor/template.rs +++ b/src/descriptor/template.rs @@ -32,7 +32,7 @@ use bitcoin::Network; use miniscript::{Legacy, Segwitv0}; -use super::{ExtendedDescriptor, KeyMap, ToWalletDescriptor}; +use super::{ExtendedDescriptor, IntoWalletDescriptor, KeyMap}; use crate::descriptor::DescriptorError; use crate::keys::{DerivableKey, ToDescriptorKey, ValidNetworks}; use crate::wallet::utils::SecpCtx; @@ -43,7 +43,7 @@ pub type DescriptorTemplateOut = (ExtendedDescriptor, KeyMap, ValidNetworks); /// Trait for descriptor templates that can be built into a full descriptor /// -/// Since [`ToWalletDescriptor`] is implemented for any [`DescriptorTemplate`], they can also be +/// Since [`IntoWalletDescriptor`] is implemented for any [`DescriptorTemplate`], they can also be /// passed directly to the [`Wallet`](crate::Wallet) constructor. /// /// ## Example @@ -69,7 +69,7 @@ pub trait DescriptorTemplate { /// Turns a [`DescriptorTemplate`] into a valid wallet descriptor by calling its /// [`build`](DescriptorTemplate::build) method -impl ToWalletDescriptor for T { +impl IntoWalletDescriptor for T { fn into_wallet_descriptor( self, secp: &SecpCtx, diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index f862b6e2..b2729ec7 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -67,7 +67,7 @@ use crate::database::{BatchDatabase, BatchOperations, DatabaseUtils}; use crate::descriptor::derived::AsDerived; use crate::descriptor::{ get_checksum, DerivedDescriptor, DerivedDescriptorMeta, DescriptorMeta, DescriptorScripts, - ExtendedDescriptor, ExtractPolicy, Policy, ToWalletDescriptor, XKeyUtils, + ExtendedDescriptor, ExtractPolicy, IntoWalletDescriptor, Policy, XKeyUtils, }; use crate::error::Error; use crate::psbt::PSBTUtils; @@ -110,7 +110,7 @@ where D: BatchDatabase, { /// Create a new "offline" wallet - pub fn new_offline( + pub fn new_offline( descriptor: E, change_descriptor: Option, network: Network, @@ -124,7 +124,7 @@ impl Wallet where D: BatchDatabase, { - fn _new( + fn _new( descriptor: E, change_descriptor: Option, network: Network, @@ -1247,7 +1247,7 @@ where { /// Create a new "online" wallet #[maybe_async] - pub fn new( + pub fn new( descriptor: E, change_descriptor: Option, network: Network, diff --git a/src/wallet/signer.rs b/src/wallet/signer.rs index 7199dbbd..aad07a20 100644 --- a/src/wallet/signer.rs +++ b/src/wallet/signer.rs @@ -560,7 +560,7 @@ impl Eq for SignersContainerKey {} mod signers_container_tests { use super::*; use crate::descriptor; - use crate::descriptor::ToWalletDescriptor; + use crate::descriptor::IntoWalletDescriptor; use crate::keys::{DescriptorKey, ToDescriptorKey}; use bitcoin::secp256k1::{All, Secp256k1}; use bitcoin::util::bip32; From 1c6864aee8303cbe9427e93d726c760d3bedc22e Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Fri, 12 Feb 2021 23:02:13 -0800 Subject: [PATCH 6/6] Rename ToDescriptorKey to IntoDescriptorKey --- CHANGELOG.md | 5 ++-- src/descriptor/dsl.rs | 16 +++++------ src/descriptor/mod.rs | 4 +-- src/descriptor/policy.rs | 2 +- src/descriptor/template.rs | 24 ++++++++-------- src/keys/mod.rs | 58 ++++++++++++++++++++------------------ src/wallet/signer.rs | 2 +- 7 files changed, 57 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c2e63ec..3cf22f85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Keys #### Changed - Renamed `DerivableKey::add_metadata()` to `DerivableKey::into_descriptor_key()` +- Renamed `ToDescriptorKey::to_descriptor_key()` to `IntoDescriptorKey::into_descriptor_key()` #### Added - Added an `ExtendedKey` type that is an enum of `bip32::ExtendedPubKey` and `bip32::ExtendedPrivKey` - Added `DerivableKey::into_extended_key()` as the only method that needs to be implemented @@ -27,9 +28,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Wallet #### Changed - Removed the explicit `id` argument from `Wallet::add_signer()` since that's now part of `Signer` itself -- Renamed `ToWalletDescriptor::to_wallet_descriptor` to `IntoWalletDescriptor::into_wallet_descriptor` +- Renamed `ToWalletDescriptor::to_wallet_descriptor()` to `IntoWalletDescriptor::into_wallet_descriptor()` -### Policy +### Policy #### Changed - Removed unneeded `Result<(), PolicyError>` return type for `Satisfaction::finalize()` diff --git a/src/descriptor/dsl.rs b/src/descriptor/dsl.rs index 75d2d147..37e9a1a4 100644 --- a/src/descriptor/dsl.rs +++ b/src/descriptor/dsl.rs @@ -76,7 +76,7 @@ macro_rules! impl_top_level_pk { use $crate::miniscript::descriptor::$inner_type; #[allow(unused_imports)] - use $crate::keys::{DescriptorKey, ToDescriptorKey}; + use $crate::keys::{DescriptorKey, IntoDescriptorKey}; let secp = $crate::bitcoin::secp256k1::Secp256k1::new(); $key.into_descriptor_key() @@ -225,7 +225,7 @@ macro_rules! impl_sortedmulti { $crate::keys::make_sortedmulti($thresh, $keys, $build_desc, &secp) }); ( $build_desc:expr, sortedmulti ( $thresh:expr $(, $key:expr )+ ) ) => ({ - use $crate::keys::ToDescriptorKey; + use $crate::keys::IntoDescriptorKey; let secp = $crate::bitcoin::secp256k1::Secp256k1::new(); let mut keys = vec![]; @@ -326,11 +326,11 @@ macro_rules! apply_modifier { /// broken up to `s:d:v:older(144)`. /// /// The `pk()`, `pk_k()` and `pk_h()` operands can take as argument any type that implements -/// [`ToDescriptorKey`]. This means that keys can also be written inline as strings, but in that +/// [`IntoDescriptorKey`]. This means that keys can also be written inline as strings, but in that /// case they must be wrapped in quotes, which is another difference compared to the standard /// descriptor syntax. /// -/// [`ToDescriptorKey`]: crate::keys::ToDescriptorKey +/// [`IntoDescriptorKey`]: crate::keys::IntoDescriptorKey /// /// ## Example /// @@ -653,7 +653,7 @@ macro_rules! fragment { $crate::keys::make_multi($thresh, $keys) }); ( multi ( $thresh:expr $(, $key:expr )+ ) ) => ({ - use $crate::keys::ToDescriptorKey; + use $crate::keys::IntoDescriptorKey; let secp = $crate::bitcoin::secp256k1::Secp256k1::new(); let mut keys = vec![]; @@ -685,7 +685,7 @@ mod test { use std::str::FromStr; use crate::descriptor::{DescriptorError, DescriptorMeta}; - use crate::keys::{DescriptorKey, ToDescriptorKey, ValidNetworks}; + use crate::keys::{DescriptorKey, IntoDescriptorKey, ValidNetworks}; use bitcoin::network::constants::Network::{Bitcoin, Regtest, Signet, Testnet}; use bitcoin::util::bip32; use bitcoin::PrivateKey; @@ -724,7 +724,7 @@ mod test { } // - at least one of each "type" of operator; ie. one modifier, one leaf_opcode, one leaf_opcode_value, etc. - // - mixing up key types that implement ToDescriptorKey in multi() or thresh() + // - mixing up key types that implement IntoDescriptorKey in multi() or thresh() // expected script for pk and bare manually created // expected addresses created with `bitcoin-cli getdescriptorinfo` (for hash) and `bitcoin-cli deriveaddresses` @@ -1020,7 +1020,7 @@ mod test { assert_eq!(key_map.get(&key3).unwrap().to_string(), "tprv8ZgxMBicQKsPdZXrcHNLf5JAJWFAoJ2TrstMRdSKtEggz6PddbuSkvHKM9oKJyFgZV1B7rw8oChspxyYbtmEXYyg1AjfWbL3ho3XHDpHRZf/10/20/30/40/*"); } - // - verify the ScriptContext is correctly validated (i.e. passing a type that only impl ToDescriptorKey to a pkh() descriptor should throw a compilation error + // - verify the ScriptContext is correctly validated (i.e. passing a type that only impl IntoDescriptorKey to a pkh() descriptor should throw a compilation error #[test] fn test_script_context_validation() { // this compiles diff --git a/src/descriptor/mod.rs b/src/descriptor/mod.rs index 09c60e9f..10000786 100644 --- a/src/descriptor/mod.rs +++ b/src/descriptor/mod.rs @@ -54,7 +54,7 @@ pub use self::derived::DerivedDescriptorKey; pub use self::error::Error as DescriptorError; pub use self::policy::Policy; use self::template::DescriptorTemplateOut; -use crate::keys::{KeyError, ToDescriptorKey}; +use crate::keys::{IntoDescriptorKey, KeyError}; use crate::wallet::signer::SignersContainer; use crate::wallet::utils::SecpCtx; @@ -614,7 +614,7 @@ mod test { #[test] fn test_to_wallet_descriptor_fixup_networks() { - use crate::keys::{any_network, ToDescriptorKey}; + use crate::keys::{any_network, IntoDescriptorKey}; let secp = Secp256k1::new(); diff --git a/src/descriptor/policy.rs b/src/descriptor/policy.rs index f138dfdb..54ba808b 100644 --- a/src/descriptor/policy.rs +++ b/src/descriptor/policy.rs @@ -892,7 +892,7 @@ mod test { use super::*; use crate::descriptor::policy::SatisfiableItem::{Multisig, Signature, Thresh}; - use crate::keys::{DescriptorKey, ToDescriptorKey}; + use crate::keys::{DescriptorKey, IntoDescriptorKey}; use crate::wallet::signer::SignersContainer; use bitcoin::secp256k1::{All, Secp256k1}; use bitcoin::util::bip32; diff --git a/src/descriptor/template.rs b/src/descriptor/template.rs index 98103dc6..14c3aef7 100644 --- a/src/descriptor/template.rs +++ b/src/descriptor/template.rs @@ -34,7 +34,7 @@ use miniscript::{Legacy, Segwitv0}; use super::{ExtendedDescriptor, IntoWalletDescriptor, KeyMap}; use crate::descriptor::DescriptorError; -use crate::keys::{DerivableKey, ToDescriptorKey, ValidNetworks}; +use crate::keys::{DerivableKey, IntoDescriptorKey, ValidNetworks}; use crate::wallet::utils::SecpCtx; use crate::{descriptor, KeychainKind}; @@ -50,13 +50,13 @@ pub type DescriptorTemplateOut = (ExtendedDescriptor, KeyMap, ValidNetworks); /// /// ``` /// use bdk::descriptor::error::Error as DescriptorError; -/// use bdk::keys::{KeyError, ToDescriptorKey}; +/// use bdk::keys::{KeyError, IntoDescriptorKey}; /// use bdk::miniscript::Legacy; /// use bdk::template::{DescriptorTemplate, DescriptorTemplateOut}; /// -/// struct MyP2PKH>(K); +/// struct MyP2PKH>(K); /// -/// impl> DescriptorTemplate for MyP2PKH { +/// impl> DescriptorTemplate for MyP2PKH { /// fn build(self) -> Result { /// Ok(bdk::descriptor!(pkh(self.0))?) /// } @@ -104,9 +104,9 @@ impl IntoWalletDescriptor for T { /// ); /// # Ok::<_, Box>(()) /// ``` -pub struct P2PKH>(pub K); +pub struct P2PKH>(pub K); -impl> DescriptorTemplate for P2PKH { +impl> DescriptorTemplate for P2PKH { fn build(self) -> Result { Ok(descriptor!(pkh(self.0))?) } @@ -138,9 +138,9 @@ impl> DescriptorTemplate for P2PKH { /// # Ok::<_, Box>(()) /// ``` #[allow(non_camel_case_types)] -pub struct P2WPKH_P2SH>(pub K); +pub struct P2WPKH_P2SH>(pub K); -impl> DescriptorTemplate for P2WPKH_P2SH { +impl> DescriptorTemplate for P2WPKH_P2SH { fn build(self) -> Result { Ok(descriptor!(sh(wpkh(self.0)))?) } @@ -171,9 +171,9 @@ impl> DescriptorTemplate for P2WPKH_P2SH { /// ); /// # Ok::<_, Box>(()) /// ``` -pub struct P2WPKH>(pub K); +pub struct P2WPKH>(pub K); -impl> DescriptorTemplate for P2WPKH { +impl> DescriptorTemplate for P2WPKH { fn build(self) -> Result { Ok(descriptor!(wpkh(self.0))?) } @@ -410,7 +410,7 @@ macro_rules! expand_make_bipxx { bip: u32, key: K, keychain: KeychainKind, - ) -> Result, DescriptorError> { + ) -> Result, DescriptorError> { let mut derivation_path = Vec::with_capacity(4); derivation_path.push(bip32::ChildNumber::from_hardened_idx(bip)?); derivation_path.push(bip32::ChildNumber::from_hardened_idx(0)?); @@ -434,7 +434,7 @@ macro_rules! expand_make_bipxx { key: K, parent_fingerprint: bip32::Fingerprint, keychain: KeychainKind, - ) -> Result, DescriptorError> { + ) -> Result, DescriptorError> { let derivation_path: bip32::DerivationPath = match keychain { KeychainKind::External => vec![bip32::ChildNumber::from_normal_idx(0)?].into(), KeychainKind::Internal => vec![bip32::ChildNumber::from_normal_idx(1)?].into(), diff --git a/src/keys/mod.rs b/src/keys/mod.rs index 3f6bfe03..0ce5d128 100644 --- a/src/keys/mod.rs +++ b/src/keys/mod.rs @@ -205,13 +205,13 @@ impl ExtScriptContext for Ctx { /// ``` /// use bdk::bitcoin::PublicKey; /// -/// use bdk::keys::{DescriptorKey, KeyError, ScriptContext, ToDescriptorKey}; +/// use bdk::keys::{DescriptorKey, KeyError, ScriptContext, IntoDescriptorKey}; /// /// pub struct MyKeyType { /// pubkey: PublicKey, /// } /// -/// impl ToDescriptorKey for MyKeyType { +/// impl IntoDescriptorKey for MyKeyType { /// fn into_descriptor_key(self) -> Result, KeyError> { /// self.pubkey.into_descriptor_key() /// } @@ -225,14 +225,14 @@ impl ExtScriptContext for Ctx { /// /// use bdk::keys::{ /// mainnet_network, DescriptorKey, DescriptorPublicKey, DescriptorSinglePub, KeyError, -/// ScriptContext, ToDescriptorKey, +/// ScriptContext, IntoDescriptorKey, /// }; /// /// pub struct MyKeyType { /// pubkey: PublicKey, /// } /// -/// impl ToDescriptorKey for MyKeyType { +/// impl IntoDescriptorKey for MyKeyType { /// fn into_descriptor_key(self) -> Result, KeyError> { /// Ok(DescriptorKey::from_public( /// DescriptorPublicKey::SinglePub(DescriptorSinglePub { @@ -250,14 +250,14 @@ impl ExtScriptContext for Ctx { /// ``` /// use bdk::bitcoin::PublicKey; /// -/// use bdk::keys::{DescriptorKey, ExtScriptContext, KeyError, ScriptContext, ToDescriptorKey}; +/// use bdk::keys::{DescriptorKey, ExtScriptContext, KeyError, ScriptContext, IntoDescriptorKey}; /// /// pub struct MyKeyType { /// is_legacy: bool, /// pubkey: PublicKey, /// } /// -/// impl ToDescriptorKey for MyKeyType { +/// impl IntoDescriptorKey for MyKeyType { /// fn into_descriptor_key(self) -> Result, KeyError> { /// if Ctx::is_legacy() == self.is_legacy { /// self.pubkey.into_descriptor_key() @@ -279,13 +279,13 @@ impl ExtScriptContext for Ctx { /// use bdk::bitcoin::PublicKey; /// use std::str::FromStr; /// -/// use bdk::keys::{DescriptorKey, KeyError, ToDescriptorKey}; +/// use bdk::keys::{DescriptorKey, KeyError, IntoDescriptorKey}; /// /// pub struct MySegwitOnlyKeyType { /// pubkey: PublicKey, /// } /// -/// impl ToDescriptorKey for MySegwitOnlyKeyType { +/// impl IntoDescriptorKey for MySegwitOnlyKeyType { /// fn into_descriptor_key(self) -> Result, KeyError> { /// self.pubkey.into_descriptor_key() /// } @@ -299,7 +299,7 @@ impl ExtScriptContext for Ctx { /// /// # Ok::<_, Box>(()) /// ``` -pub trait ToDescriptorKey: Sized { +pub trait IntoDescriptorKey: Sized { /// Turn the key into a [`DescriptorKey`] within the requested [`ScriptContext`] fn into_descriptor_key(self) -> Result, KeyError>; } @@ -370,12 +370,12 @@ impl From for ExtendedKey { /// Trait for keys that can be derived. /// /// When extra metadata are provided, a [`DerivableKey`] can be transofrmed into a -/// [`DescriptorKey`]: the trait [`ToDescriptorKey`] is automatically implemented +/// [`DescriptorKey`]: the trait [`IntoDescriptorKey`] is automatically implemented /// for `(DerivableKey, DerivationPath)` and /// `(DerivableKey, KeySource, DerivationPath)` tuples. /// /// For key types that don't encode any indication about the path to use (like bip39), it's -/// generally recommended to implemented this trait instead of [`ToDescriptorKey`]. The same +/// generally recommended to implemented this trait instead of [`IntoDescriptorKey`]. The same /// rules regarding script context and valid networks apply. /// /// ## Examples @@ -583,10 +583,10 @@ where // Make generated keys directly usable in descriptors, and make sure they get assigned the right // `valid_networks`. -impl ToDescriptorKey for GeneratedKey +impl IntoDescriptorKey for GeneratedKey where Ctx: ScriptContext, - K: ToDescriptorKey, + K: IntoDescriptorKey, { fn into_descriptor_key(self) -> Result, KeyError> { let desc_key = self.key.into_descriptor_key()?; @@ -596,12 +596,12 @@ where /// Trait for keys that can be generated /// -/// The same rules about [`ScriptContext`] and [`ValidNetworks`] from [`ToDescriptorKey`] apply. +/// The same rules about [`ScriptContext`] and [`ValidNetworks`] from [`IntoDescriptorKey`] apply. /// /// This trait is particularly useful when combined with [`DerivableKey`]: if `Self` /// implements it, the returned [`GeneratedKey`] will also implement it. The same is true for -/// [`ToDescriptorKey`]: the generated keys can be directly used in descriptors if `Self` is also -/// [`ToDescriptorKey`]. +/// [`IntoDescriptorKey`]: the generated keys can be directly used in descriptors if `Self` is also +/// [`IntoDescriptorKey`]. pub trait GeneratableKey: Sized { /// Type specifying the amount of entropy required e.g. `[u8;32]` type Entropy: AsMut<[u8]> + Default; @@ -711,13 +711,15 @@ impl GeneratableKey for PrivateKey { } } -impl> ToDescriptorKey for (T, bip32::DerivationPath) { +impl> IntoDescriptorKey + for (T, bip32::DerivationPath) +{ fn into_descriptor_key(self) -> Result, KeyError> { self.0.into_descriptor_key(None, self.1) } } -impl> ToDescriptorKey +impl> IntoDescriptorKey for (T, bip32::KeySource, bip32::DerivationPath) { fn into_descriptor_key(self) -> Result, KeyError> { @@ -725,7 +727,7 @@ impl> ToDescriptorKey } } -fn expand_multi_keys, Ctx: ScriptContext>( +fn expand_multi_keys, Ctx: ScriptContext>( pks: Vec, secp: &SecpCtx, ) -> Result<(Vec, KeyMap, ValidNetworks), KeyError> { @@ -752,7 +754,7 @@ fn expand_multi_keys, Ctx: ScriptContext>( // Used internally by `bdk::fragment!` to build `pk_k()` fragments #[doc(hidden)] -pub fn make_pk, Ctx: ScriptContext>( +pub fn make_pk, Ctx: ScriptContext>( descriptor_key: Pk, secp: &SecpCtx, ) -> Result<(Miniscript, KeyMap, ValidNetworks), DescriptorError> { @@ -766,7 +768,7 @@ pub fn make_pk, Ctx: ScriptContext>( // Used internally by `bdk::fragment!` to build `multi()` fragments #[doc(hidden)] -pub fn make_multi, Ctx: ScriptContext>( +pub fn make_multi, Ctx: ScriptContext>( thresh: usize, pks: Vec, secp: &SecpCtx, @@ -788,7 +790,7 @@ pub fn make_sortedmulti( secp: &SecpCtx, ) -> Result<(Descriptor, KeyMap, ValidNetworks), DescriptorError> where - Pk: ToDescriptorKey, + Pk: IntoDescriptorKey, Ctx: ScriptContext, F: Fn( usize, @@ -802,13 +804,13 @@ where } /// The "identity" conversion is used internally by some `bdk::fragment`s -impl ToDescriptorKey for DescriptorKey { +impl IntoDescriptorKey for DescriptorKey { fn into_descriptor_key(self) -> Result, KeyError> { Ok(self) } } -impl ToDescriptorKey for DescriptorPublicKey { +impl IntoDescriptorKey for DescriptorPublicKey { fn into_descriptor_key(self) -> Result, KeyError> { let networks = match self { DescriptorPublicKey::SinglePub(_) => any_network(), @@ -824,7 +826,7 @@ impl ToDescriptorKey for DescriptorPublicKey { } } -impl ToDescriptorKey for PublicKey { +impl IntoDescriptorKey for PublicKey { fn into_descriptor_key(self) -> Result, KeyError> { DescriptorPublicKey::SinglePub(DescriptorSinglePub { key: self, @@ -834,7 +836,7 @@ impl ToDescriptorKey for PublicKey { } } -impl ToDescriptorKey for DescriptorSecretKey { +impl IntoDescriptorKey for DescriptorSecretKey { fn into_descriptor_key(self) -> Result, KeyError> { let networks = match &self { DescriptorSecretKey::SinglePriv(sk) if sk.key.network == Network::Bitcoin => { @@ -852,7 +854,7 @@ impl ToDescriptorKey for DescriptorSecretKey { } } -impl ToDescriptorKey for &'_ str { +impl IntoDescriptorKey for &'_ str { fn into_descriptor_key(self) -> Result, KeyError> { DescriptorSecretKey::from_str(self) .map_err(|e| KeyError::Message(e.to_string()))? @@ -860,7 +862,7 @@ impl ToDescriptorKey for &'_ str { } } -impl ToDescriptorKey for PrivateKey { +impl IntoDescriptorKey for PrivateKey { fn into_descriptor_key(self) -> Result, KeyError> { DescriptorSecretKey::SinglePriv(DescriptorSinglePriv { key: self, diff --git a/src/wallet/signer.rs b/src/wallet/signer.rs index aad07a20..83888f50 100644 --- a/src/wallet/signer.rs +++ b/src/wallet/signer.rs @@ -561,7 +561,7 @@ mod signers_container_tests { use super::*; use crate::descriptor; use crate::descriptor::IntoWalletDescriptor; - use crate::keys::{DescriptorKey, ToDescriptorKey}; + use crate::keys::{DescriptorKey, IntoDescriptorKey}; use bitcoin::secp256k1::{All, Secp256k1}; use bitcoin::util::bip32; use bitcoin::util::psbt::PartiallySignedTransaction;