light_compressed_account/
address.rs1use light_hasher::hash_to_field_size::hashv_to_bn254_field_size_be_const_array;
2
3use crate::{CompressedAccountError, Pubkey};
4
5#[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}