create constants for ChildNumber enum
These constants are -> * `ONE_NORMAL` & `ZERO_NORMAL` * `ZERO_HARDENED` & `ONE_HARDENED`
This commit is contained in:
parent
d063cc1d5c
commit
3a5f2932a4
|
@ -48,7 +48,7 @@ fn main() {
|
||||||
|
|
||||||
// generate first receiving address at m/0/0
|
// generate first receiving address at m/0/0
|
||||||
// manually creating indexes this time
|
// manually creating indexes this time
|
||||||
let zero = ChildNumber::from_normal_idx(0).unwrap();
|
let zero = ChildNumber::ZERO_NORMAL;
|
||||||
let public_key = xpub.derive_pub(&secp, &[zero, zero]).unwrap().public_key;
|
let public_key = xpub.derive_pub(&secp, &[zero, zero]).unwrap().public_key;
|
||||||
let address = Address::p2wpkh(CompressedPublicKey(public_key), KnownHrp::Mainnet);
|
let address = Address::p2wpkh(CompressedPublicKey(public_key), KnownHrp::Mainnet);
|
||||||
println!("First receiving address: {}", address);
|
println!("First receiving address: {}", address);
|
||||||
|
|
|
@ -61,7 +61,7 @@ fn get_external_address_xpriv<C: Signing>(
|
||||||
let derivation_path =
|
let derivation_path =
|
||||||
BIP84_DERIVATION_PATH.into_derivation_path().expect("valid derivation path");
|
BIP84_DERIVATION_PATH.into_derivation_path().expect("valid derivation path");
|
||||||
let child_xpriv = master_xpriv.derive_priv(secp, &derivation_path);
|
let child_xpriv = master_xpriv.derive_priv(secp, &derivation_path);
|
||||||
let external_index = ChildNumber::from_normal_idx(0).unwrap();
|
let external_index = ChildNumber::ZERO_NORMAL;
|
||||||
let idx = ChildNumber::from_normal_idx(index).expect("valid index number");
|
let idx = ChildNumber::from_normal_idx(index).expect("valid index number");
|
||||||
|
|
||||||
child_xpriv.derive_priv(secp, &[external_index, idx])
|
child_xpriv.derive_priv(secp, &[external_index, idx])
|
||||||
|
@ -76,7 +76,7 @@ fn get_internal_address_xpriv<C: Signing>(
|
||||||
let derivation_path =
|
let derivation_path =
|
||||||
BIP84_DERIVATION_PATH.into_derivation_path().expect("valid derivation path");
|
BIP84_DERIVATION_PATH.into_derivation_path().expect("valid derivation path");
|
||||||
let child_xpriv = master_xpriv.derive_priv(secp, &derivation_path);
|
let child_xpriv = master_xpriv.derive_priv(secp, &derivation_path);
|
||||||
let internal_index = ChildNumber::from_normal_idx(1).unwrap();
|
let internal_index = ChildNumber::ONE_NORMAL;
|
||||||
let idx = ChildNumber::from_normal_idx(index).expect("valid index number");
|
let idx = ChildNumber::from_normal_idx(index).expect("valid index number");
|
||||||
|
|
||||||
child_xpriv.derive_priv(secp, &[internal_index, idx])
|
child_xpriv.derive_priv(secp, &[internal_index, idx])
|
||||||
|
|
|
@ -255,7 +255,7 @@ impl WatchOnly {
|
||||||
&self,
|
&self,
|
||||||
secp: &Secp256k1<C>,
|
secp: &Secp256k1<C>,
|
||||||
) -> Result<(CompressedPublicKey, Address, DerivationPath)> {
|
) -> Result<(CompressedPublicKey, Address, DerivationPath)> {
|
||||||
let path = [ChildNumber::from_normal_idx(1)?, ChildNumber::from_normal_idx(0)?];
|
let path = [ChildNumber::ONE_NORMAL, ChildNumber::ZERO_NORMAL];
|
||||||
let derived = self.account_0_xpub.derive_pub(secp, &path)?;
|
let derived = self.account_0_xpub.derive_pub(secp, &path)?;
|
||||||
|
|
||||||
let pk = derived.to_pub();
|
let pk = derived.to_pub();
|
||||||
|
|
|
@ -60,7 +60,7 @@ fn get_external_address_xpriv<C: Signing>(
|
||||||
let derivation_path =
|
let derivation_path =
|
||||||
BIP86_DERIVATION_PATH.into_derivation_path().expect("valid derivation path");
|
BIP86_DERIVATION_PATH.into_derivation_path().expect("valid derivation path");
|
||||||
let child_xpriv = master_xpriv.derive_priv(secp, &derivation_path);
|
let child_xpriv = master_xpriv.derive_priv(secp, &derivation_path);
|
||||||
let external_index = ChildNumber::from_normal_idx(0).unwrap();
|
let external_index = ChildNumber::ZERO_NORMAL;
|
||||||
let idx = ChildNumber::from_normal_idx(index).expect("valid index number");
|
let idx = ChildNumber::from_normal_idx(index).expect("valid index number");
|
||||||
|
|
||||||
child_xpriv.derive_priv(secp, &[external_index, idx])
|
child_xpriv.derive_priv(secp, &[external_index, idx])
|
||||||
|
@ -75,7 +75,7 @@ fn get_internal_address_xpriv<C: Signing>(
|
||||||
let derivation_path =
|
let derivation_path =
|
||||||
BIP86_DERIVATION_PATH.into_derivation_path().expect("valid derivation path");
|
BIP86_DERIVATION_PATH.into_derivation_path().expect("valid derivation path");
|
||||||
let child_xpriv = master_xpriv.derive_priv(secp, &derivation_path);
|
let child_xpriv = master_xpriv.derive_priv(secp, &derivation_path);
|
||||||
let internal_index = ChildNumber::from_normal_idx(1).unwrap();
|
let internal_index = ChildNumber::ONE_NORMAL;
|
||||||
let idx = ChildNumber::from_normal_idx(index).expect("valid index number");
|
let idx = ChildNumber::from_normal_idx(index).expect("valid index number");
|
||||||
|
|
||||||
child_xpriv.derive_priv(secp, &[internal_index, idx])
|
child_xpriv.derive_priv(secp, &[internal_index, idx])
|
||||||
|
|
|
@ -360,7 +360,7 @@ impl BenefactorWallet {
|
||||||
current_spend_info: None,
|
current_spend_info: None,
|
||||||
next_psbt: None,
|
next_psbt: None,
|
||||||
secp: Secp256k1::new(),
|
secp: Secp256k1::new(),
|
||||||
next: ChildNumber::from_normal_idx(0).expect("Zero is a valid child number"),
|
next: ChildNumber::ZERO_NORMAL,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -126,8 +126,19 @@ pub enum ChildNumber {
|
||||||
index: u32,
|
index: u32,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ChildNumber {
|
impl ChildNumber {
|
||||||
|
/// Normal child number with index 0.
|
||||||
|
pub const ZERO_NORMAL: Self = ChildNumber::Normal { index: 0 };
|
||||||
|
|
||||||
|
/// Normal child number with index 1.
|
||||||
|
pub const ONE_NORMAL: Self = ChildNumber::Normal { index: 1 };
|
||||||
|
|
||||||
|
/// Hardened child number with index 0.
|
||||||
|
pub const ZERO_HARDENED: Self = ChildNumber::Hardened { index: 0 };
|
||||||
|
|
||||||
|
/// Hardened child number with index 1.
|
||||||
|
pub const ONE_HARDENED: Self = ChildNumber::Hardened { index: 1 };
|
||||||
|
|
||||||
/// Create a [`Normal`] from an index, returns an error if the index is not within
|
/// Create a [`Normal`] from an index, returns an error if the index is not within
|
||||||
/// [0, 2^31 - 1].
|
/// [0, 2^31 - 1].
|
||||||
///
|
///
|
||||||
|
@ -417,8 +428,8 @@ impl DerivationPath {
|
||||||
///
|
///
|
||||||
/// let deriv_1 = base.extend(DerivationPath::from_str("0/1").unwrap());
|
/// let deriv_1 = base.extend(DerivationPath::from_str("0/1").unwrap());
|
||||||
/// let deriv_2 = base.extend(&[
|
/// let deriv_2 = base.extend(&[
|
||||||
/// ChildNumber::from_normal_idx(0).unwrap(),
|
/// ChildNumber::ZERO_NORMAL,
|
||||||
/// ChildNumber::from_normal_idx(1).unwrap()
|
/// ChildNumber::ONE_NORMAL
|
||||||
/// ]);
|
/// ]);
|
||||||
///
|
///
|
||||||
/// assert_eq!(deriv_1, deriv_2);
|
/// assert_eq!(deriv_1, deriv_2);
|
||||||
|
@ -564,7 +575,7 @@ impl Xpriv {
|
||||||
network: network.into(),
|
network: network.into(),
|
||||||
depth: 0,
|
depth: 0,
|
||||||
parent_fingerprint: Default::default(),
|
parent_fingerprint: Default::default(),
|
||||||
child_number: ChildNumber::from_normal_idx(0)?,
|
child_number: ChildNumber::ZERO_NORMAL,
|
||||||
private_key: secp256k1::SecretKey::from_slice(&hmac_result.as_ref()[..32])?,
|
private_key: secp256k1::SecretKey::from_slice(&hmac_result.as_ref()[..32])?,
|
||||||
chain_code: ChainCode::from_hmac(hmac_result),
|
chain_code: ChainCode::from_hmac(hmac_result),
|
||||||
})
|
})
|
||||||
|
@ -919,23 +930,16 @@ mod tests {
|
||||||
assert_eq!(DerivationPath::from_str("m/").unwrap(), DerivationPath(vec![]));
|
assert_eq!(DerivationPath::from_str("m/").unwrap(), DerivationPath(vec![]));
|
||||||
assert_eq!(DerivationPath::from_str("").unwrap(), DerivationPath(vec![]));
|
assert_eq!(DerivationPath::from_str("").unwrap(), DerivationPath(vec![]));
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(DerivationPath::from_str("0'"), Ok(vec![ChildNumber::ZERO_HARDENED].into()));
|
||||||
DerivationPath::from_str("0'"),
|
|
||||||
Ok(vec![ChildNumber::from_hardened_idx(0).unwrap()].into())
|
|
||||||
);
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DerivationPath::from_str("0'/1"),
|
DerivationPath::from_str("0'/1"),
|
||||||
Ok(vec![
|
Ok(vec![ChildNumber::ZERO_HARDENED, ChildNumber::ONE_NORMAL].into())
|
||||||
ChildNumber::from_hardened_idx(0).unwrap(),
|
|
||||||
ChildNumber::from_normal_idx(1).unwrap()
|
|
||||||
]
|
|
||||||
.into())
|
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DerivationPath::from_str("0h/1/2'"),
|
DerivationPath::from_str("0h/1/2'"),
|
||||||
Ok(vec![
|
Ok(vec![
|
||||||
ChildNumber::from_hardened_idx(0).unwrap(),
|
ChildNumber::ZERO_HARDENED,
|
||||||
ChildNumber::from_normal_idx(1).unwrap(),
|
ChildNumber::ONE_NORMAL,
|
||||||
ChildNumber::from_hardened_idx(2).unwrap(),
|
ChildNumber::from_hardened_idx(2).unwrap(),
|
||||||
]
|
]
|
||||||
.into())
|
.into())
|
||||||
|
@ -943,16 +947,16 @@ mod tests {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
DerivationPath::from_str("0'/1/2h/2"),
|
DerivationPath::from_str("0'/1/2h/2"),
|
||||||
Ok(vec![
|
Ok(vec![
|
||||||
ChildNumber::from_hardened_idx(0).unwrap(),
|
ChildNumber::ZERO_HARDENED,
|
||||||
ChildNumber::from_normal_idx(1).unwrap(),
|
ChildNumber::ONE_NORMAL,
|
||||||
ChildNumber::from_hardened_idx(2).unwrap(),
|
ChildNumber::from_hardened_idx(2).unwrap(),
|
||||||
ChildNumber::from_normal_idx(2).unwrap(),
|
ChildNumber::from_normal_idx(2).unwrap(),
|
||||||
]
|
]
|
||||||
.into())
|
.into())
|
||||||
);
|
);
|
||||||
let want = DerivationPath::from(vec![
|
let want = DerivationPath::from(vec![
|
||||||
ChildNumber::from_hardened_idx(0).unwrap(),
|
ChildNumber::ZERO_HARDENED,
|
||||||
ChildNumber::from_normal_idx(1).unwrap(),
|
ChildNumber::ONE_NORMAL,
|
||||||
ChildNumber::from_hardened_idx(2).unwrap(),
|
ChildNumber::from_hardened_idx(2).unwrap(),
|
||||||
ChildNumber::from_normal_idx(2).unwrap(),
|
ChildNumber::from_normal_idx(2).unwrap(),
|
||||||
ChildNumber::from_normal_idx(1000000000).unwrap(),
|
ChildNumber::from_normal_idx(1000000000).unwrap(),
|
||||||
|
@ -975,10 +979,7 @@ mod tests {
|
||||||
let numbers: Vec<ChildNumber> = path.clone().into();
|
let numbers: Vec<ChildNumber> = path.clone().into();
|
||||||
let path2: DerivationPath = numbers.into();
|
let path2: DerivationPath = numbers.into();
|
||||||
assert_eq!(path, path2);
|
assert_eq!(path, path2);
|
||||||
assert_eq!(
|
assert_eq!(&path[..2], &[ChildNumber::ZERO_HARDENED, ChildNumber::ONE_NORMAL]);
|
||||||
&path[..2],
|
|
||||||
&[ChildNumber::from_hardened_idx(0).unwrap(), ChildNumber::from_normal_idx(1).unwrap()]
|
|
||||||
);
|
|
||||||
let indexed: DerivationPath = path[..2].into();
|
let indexed: DerivationPath = path[..2].into();
|
||||||
assert_eq!(indexed, DerivationPath::from_str("0h/1").unwrap());
|
assert_eq!(indexed, DerivationPath::from_str("0h/1").unwrap());
|
||||||
assert_eq!(indexed.child(ChildNumber::from_hardened_idx(2).unwrap()), path);
|
assert_eq!(indexed.child(ChildNumber::from_hardened_idx(2).unwrap()), path);
|
||||||
|
@ -1166,11 +1167,11 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
pub fn encode_decode_childnumber() {
|
pub fn encode_decode_childnumber() {
|
||||||
serde_round_trip!(ChildNumber::from_normal_idx(0).unwrap());
|
serde_round_trip!(ChildNumber::ZERO_NORMAL);
|
||||||
serde_round_trip!(ChildNumber::from_normal_idx(1).unwrap());
|
serde_round_trip!(ChildNumber::ONE_NORMAL);
|
||||||
serde_round_trip!(ChildNumber::from_normal_idx((1 << 31) - 1).unwrap());
|
serde_round_trip!(ChildNumber::from_normal_idx((1 << 31) - 1).unwrap());
|
||||||
serde_round_trip!(ChildNumber::from_hardened_idx(0).unwrap());
|
serde_round_trip!(ChildNumber::ZERO_HARDENED);
|
||||||
serde_round_trip!(ChildNumber::from_hardened_idx(1).unwrap());
|
serde_round_trip!(ChildNumber::ONE_HARDENED);
|
||||||
serde_round_trip!(ChildNumber::from_hardened_idx((1 << 31) - 1).unwrap());
|
serde_round_trip!(ChildNumber::from_hardened_idx((1 << 31) - 1).unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1356,8 +1356,8 @@ mod tests {
|
||||||
let fprint = sk.fingerprint(secp);
|
let fprint = sk.fingerprint(secp);
|
||||||
|
|
||||||
let dpath: Vec<ChildNumber> = vec![
|
let dpath: Vec<ChildNumber> = vec![
|
||||||
ChildNumber::from_normal_idx(0).unwrap(),
|
ChildNumber::ZERO_NORMAL,
|
||||||
ChildNumber::from_normal_idx(1).unwrap(),
|
ChildNumber::ONE_NORMAL,
|
||||||
ChildNumber::from_normal_idx(2).unwrap(),
|
ChildNumber::from_normal_idx(2).unwrap(),
|
||||||
ChildNumber::from_normal_idx(4).unwrap(),
|
ChildNumber::from_normal_idx(4).unwrap(),
|
||||||
ChildNumber::from_normal_idx(42).unwrap(),
|
ChildNumber::from_normal_idx(42).unwrap(),
|
||||||
|
|
Loading…
Reference in New Issue