light_sdk/
program_merkle_context.rs1use anchor_lang::{prelude::AccountInfo, Key};
2
3use crate::merkle_context::{AddressMerkleContext, PackedAddressMerkleContext};
4
5pub fn pack_address_merkle_contexts(
6 address_merkle_contexts: &[AddressMerkleContext],
7 remaining_accounts: &[AccountInfo],
8) -> Vec<PackedAddressMerkleContext> {
9 address_merkle_contexts
10 .iter()
11 .map(|x| {
12 let address_merkle_tree_pubkey_index = remaining_accounts
13 .iter()
14 .position(|account| account.key() == x.address_merkle_tree_pubkey)
15 .unwrap() as u8;
16 let address_queue_pubkey_index = remaining_accounts
17 .iter()
18 .position(|account| account.key() == x.address_queue_pubkey)
19 .unwrap() as u8;
20 PackedAddressMerkleContext {
21 address_merkle_tree_pubkey_index,
22 address_queue_pubkey_index,
23 }
24 })
25 .collect::<Vec<_>>()
26}
27
28pub fn pack_address_merkle_context(
29 address_merkle_context: AddressMerkleContext,
30 remaining_accounts: &[AccountInfo],
31) -> PackedAddressMerkleContext {
32 pack_address_merkle_contexts(&[address_merkle_context], remaining_accounts)[0]
33}
34
35pub fn unpack_address_merkle_contexts(
36 address_merkle_contexts: &[PackedAddressMerkleContext],
37 remaining_accounts: &[AccountInfo],
38) -> Vec<AddressMerkleContext> {
39 address_merkle_contexts
40 .iter()
41 .map(|x| {
42 let address_merkle_tree_pubkey =
43 remaining_accounts[x.address_merkle_tree_pubkey_index as usize].key();
44 let address_queue_pubkey =
45 remaining_accounts[x.address_queue_pubkey_index as usize].key();
46 AddressMerkleContext {
47 address_merkle_tree_pubkey,
48 address_queue_pubkey,
49 }
50 })
51 .collect::<Vec<_>>()
52}
53
54pub fn unpack_address_merkle_context(
55 address_merkle_context: PackedAddressMerkleContext,
56 remaining_accounts: &[AccountInfo],
57) -> AddressMerkleContext {
58 unpack_address_merkle_contexts(&[address_merkle_context], remaining_accounts)[0]
59}