light_sdk/
program_merkle_context.rs

1use 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}