1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use anchor_lang::{prelude::AccountInfo, Key};

use crate::merkle_context::{AddressMerkleContext, PackedAddressMerkleContext};

pub fn pack_address_merkle_contexts(
    address_merkle_contexts: &[AddressMerkleContext],
    remaining_accounts: &[AccountInfo],
) -> Vec<PackedAddressMerkleContext> {
    address_merkle_contexts
        .iter()
        .map(|x| {
            let address_merkle_tree_pubkey_index = remaining_accounts
                .iter()
                .position(|account| account.key() == x.address_merkle_tree_pubkey)
                .unwrap() as u8;
            let address_queue_pubkey_index = remaining_accounts
                .iter()
                .position(|account| account.key() == x.address_queue_pubkey)
                .unwrap() as u8;
            PackedAddressMerkleContext {
                address_merkle_tree_pubkey_index,
                address_queue_pubkey_index,
            }
        })
        .collect::<Vec<_>>()
}

pub fn pack_address_merkle_context(
    address_merkle_context: AddressMerkleContext,
    remaining_accounts: &[AccountInfo],
) -> PackedAddressMerkleContext {
    pack_address_merkle_contexts(&[address_merkle_context], remaining_accounts)[0]
}

pub fn unpack_address_merkle_contexts(
    address_merkle_contexts: &[PackedAddressMerkleContext],
    remaining_accounts: &[AccountInfo],
) -> Vec<AddressMerkleContext> {
    address_merkle_contexts
        .iter()
        .map(|x| {
            let address_merkle_tree_pubkey =
                remaining_accounts[x.address_merkle_tree_pubkey_index as usize].key();
            let address_queue_pubkey =
                remaining_accounts[x.address_queue_pubkey_index as usize].key();
            AddressMerkleContext {
                address_merkle_tree_pubkey,
                address_queue_pubkey,
            }
        })
        .collect::<Vec<_>>()
}

pub fn unpack_address_merkle_context(
    address_merkle_context: PackedAddressMerkleContext,
    remaining_accounts: &[AccountInfo],
) -> AddressMerkleContext {
    unpack_address_merkle_contexts(&[address_merkle_context], remaining_accounts)[0]
}