light_compressed_account/
address.rs

1use light_hasher::hash_to_field_size::hashv_to_bn254_field_size_be_const_array;
2
3use crate::{CompressedAccountError, Pubkey};
4
5/// A seed used to derive compressed account addresses.
6#[derive(Debug, PartialEq, Clone, Copy)]
7pub struct AddressSeed(pub [u8; 32]);
8
9impl From<[u8; 32]> for AddressSeed {
10    fn from(value: [u8; 32]) -> Self {
11        AddressSeed(value)
12    }
13}
14
15impl From<AddressSeed> for [u8; 32] {
16    fn from(address_seed: AddressSeed) -> Self {
17        address_seed.0
18    }
19}
20
21pub fn derive_address_legacy(
22    merkle_tree_pubkey: &Pubkey,
23    seed: &[u8; 32],
24) -> Result<[u8; 32], CompressedAccountError> {
25    let slices = [merkle_tree_pubkey.as_ref(), seed.as_ref()];
26    let hash = hashv_to_bn254_field_size_be_const_array::<3>(&slices)?;
27    Ok(hash)
28}
29
30pub fn derive_address(
31    seed: &[u8; 32],
32    merkle_tree_pubkey: &[u8; 32],
33    program_id_bytes: &[u8; 32],
34) -> [u8; 32] {
35    let slices = [
36        seed.as_slice(),
37        merkle_tree_pubkey.as_slice(),
38        program_id_bytes.as_slice(),
39    ];
40    hashv_to_bn254_field_size_be_const_array::<4>(&slices)
41        .expect("hashv_to_bn254_field_size_be_const_array::<4> should be infallible for Keccak")
42}