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
use anchor_lang::prelude::*;
use solana_address_lookup_table_program as solana_alt;
use solana_program::pubkey::Pubkey;

pub fn addresses(table: &[u8]) -> &[Pubkey] {
    bytemuck::try_cast_slice(&table[solana_alt::state::LOOKUP_TABLE_META_SIZE..]).unwrap()
}

pub fn contains(table: &[u8], pubkey: &Pubkey) -> bool {
    addresses(table).iter().any(|&addr| addr == *pubkey)
}

pub fn cpi_extend<'info>(
    lookup_table_ai: AccountInfo<'info>,
    authority_ai: AccountInfo<'info>,
    payer_ai: AccountInfo<'info>,
    signer_seeds: &[&[&[u8]]],
    new_addresses: Vec<Pubkey>,
) -> std::result::Result<(), ProgramError> {
    let instruction = solana_alt::instruction::extend_lookup_table(
        lookup_table_ai.key(),
        authority_ai.key(),
        Some(payer_ai.key()),
        new_addresses,
    );
    let account_infos = [lookup_table_ai, authority_ai, payer_ai];
    solana_program::program::invoke_signed(&instruction, &account_infos, signer_seeds)
}