pub use light_compressed_account::instruction_data::data::NewAddressParams;
pub use light_compressed_account::instruction_data::data::NewAddressParamsPacked as PackedNewAddressParams;
#[cfg(feature = "v2")]
pub use light_compressed_account::instruction_data::data::{
NewAddressParamsAssigned, NewAddressParamsAssignedPacked, PackedReadOnlyAddress,
ReadOnlyAddress,
};
pub use light_sdk_types::address::AddressSeed;
pub mod v1 {
use light_sdk_types::address::AddressSeed;
use crate::Pubkey;
pub fn derive_address_seed(seeds: &[&[u8]], program_id: &Pubkey) -> AddressSeed {
light_sdk_types::address::v1::derive_address_seed(seeds, &program_id.to_bytes())
}
pub fn derive_address(
seeds: &[&[u8]],
address_tree_pubkey: &Pubkey,
program_id: &Pubkey,
) -> ([u8; 32], AddressSeed) {
light_sdk_types::address::v1::derive_address(
seeds,
&address_tree_pubkey.to_bytes(),
&program_id.to_bytes(),
)
}
}
#[cfg(feature = "v2")]
pub mod v2 {
use light_sdk_types::address::AddressSeed;
use solana_pubkey::Pubkey;
pub fn derive_address_seed(seeds: &[&[u8]]) -> AddressSeed {
light_sdk_types::address::v2::derive_address_seed(seeds)
}
pub fn derive_address_from_seed(
address_seed: &AddressSeed,
address_tree_pubkey: &Pubkey,
program_id: &Pubkey,
) -> [u8; 32] {
light_sdk_types::address::v2::derive_address_from_seed(
address_seed,
&address_tree_pubkey.to_bytes(),
&program_id.to_bytes(),
)
}
pub fn derive_compressed_address(
account_address: &Pubkey,
address_tree_pubkey: &Pubkey,
program_id: &Pubkey,
) -> [u8; 32] {
derive_address(
&[account_address.to_bytes().as_ref()],
address_tree_pubkey,
program_id,
)
.0
}
pub fn derive_address(
seeds: &[&[u8]],
address_tree_pubkey: &Pubkey,
program_id: &Pubkey,
) -> ([u8; 32], AddressSeed) {
light_sdk_types::address::v2::derive_address(
seeds,
&address_tree_pubkey.to_bytes(),
&program_id.to_bytes(),
)
}
}
#[cfg(test)]
mod test {
use solana_pubkey::pubkey;
use super::v1::*;
use crate::instruction::AddressTreeInfo;
#[test]
fn test_derive_address_seed() {
let program_id = pubkey!("7yucc7fL3JGbyMwg4neUaenNSdySS39hbAk89Ao3t1Hz");
let address_seed = derive_address_seed(&[b"foo", b"bar"], &program_id);
assert_eq!(
address_seed,
[
0, 246, 150, 3, 192, 95, 53, 123, 56, 139, 206, 179, 253, 133, 115, 103, 120, 155,
251, 72, 250, 47, 117, 217, 118, 59, 174, 207, 49, 101, 201, 110
]
.into()
);
let address_seed = derive_address_seed(&[b"ayy", b"lmao"], &program_id);
assert_eq!(
address_seed,
[
0, 202, 44, 25, 221, 74, 144, 92, 69, 168, 38, 19, 206, 208, 29, 162, 53, 27, 120,
214, 152, 116, 15, 107, 212, 168, 33, 121, 187, 10, 76, 233
]
.into()
);
}
#[test]
fn test_derive_address() {
let address_tree_info = AddressTreeInfo {
tree: pubkey!("11111111111111111111111111111111"),
queue: pubkey!("22222222222222222222222222222222222222222222"),
};
let program_id = pubkey!("7yucc7fL3JGbyMwg4neUaenNSdySS39hbAk89Ao3t1Hz");
let seeds: &[&[u8]] = &[b"foo", b"bar"];
let expected_address_seed = [
0, 246, 150, 3, 192, 95, 53, 123, 56, 139, 206, 179, 253, 133, 115, 103, 120, 155, 251,
72, 250, 47, 117, 217, 118, 59, 174, 207, 49, 101, 201, 110,
];
let expected_address = pubkey!("139uhyyBtEh4e1CBDJ68ooK5nCeWoncZf9HPyAfRrukA");
let address_seed = derive_address_seed(seeds, &program_id);
assert_eq!(address_seed, expected_address_seed.into());
let (address, address_seed) = derive_address(seeds, &address_tree_info.tree, &program_id);
assert_eq!(address_seed, expected_address_seed.into());
assert_eq!(address, expected_address.to_bytes());
let seeds: &[&[u8]] = &[b"ayy", b"lmao"];
let expected_address_seed = [
0, 202, 44, 25, 221, 74, 144, 92, 69, 168, 38, 19, 206, 208, 29, 162, 53, 27, 120, 214,
152, 116, 15, 107, 212, 168, 33, 121, 187, 10, 76, 233,
];
let expected_address = pubkey!("12bhHm6PQjbNmEn3Yu1Gq9k7XwVn2rZpzYokmLwbFazN");
let address_seed = derive_address_seed(seeds, &program_id);
assert_eq!(address_seed, expected_address_seed.into());
let (address, address_seed) = derive_address(seeds, &address_tree_info.tree, &program_id);
assert_eq!(address_seed, expected_address_seed.into());
assert_eq!(address, expected_address.to_bytes());
}
}