aztec_crypto/
address.rs

1//! Address derivation utilities.
2
3use aztec_core::hash::compute_address;
4use aztec_core::types::{CompleteAddress, Fr};
5use aztec_core::Error;
6
7use crate::keys::derive_keys;
8
9/// Derive a complete address from a secret key and partial address.
10pub fn complete_address_from_secret_key_and_partial_address(
11    secret_key: &Fr,
12    partial_address: &Fr,
13) -> Result<CompleteAddress, Error> {
14    let derived = derive_keys(secret_key);
15    let address = compute_address(&derived.public_keys, partial_address)?;
16    Ok(CompleteAddress {
17        address,
18        public_keys: derived.public_keys,
19        partial_address: *partial_address,
20    })
21}
22
23#[cfg(test)]
24#[allow(clippy::expect_used)]
25mod tests {
26    use super::*;
27    use aztec_core::types::AztecAddress;
28
29    #[test]
30    fn complete_address_from_secret_key() {
31        let sk = Fr::from(8923u64);
32        let partial_address = Fr::from(243523u64);
33        let complete = complete_address_from_secret_key_and_partial_address(&sk, &partial_address)
34            .expect("address derivation");
35        let expected = AztecAddress(
36            Fr::from_hex("0x2e54c8067c410d03d417dddd51e1cad76cece48ff39fa0fe908782b93a209a52")
37                .expect("valid hex"),
38        );
39        assert_eq!(complete.address, expected);
40        assert_eq!(complete.partial_address, partial_address);
41        assert!(!complete.public_keys.is_empty());
42    }
43}