luts 0.1.1

Address Lookup Table wrapper with deduplication and readiness tracking
Documentation
use crate::codama_rust_luts::instructions::CreateAddressLookupTableBuilder;
use crate::common::pda::{derive_address_lookup_table, get_user_address_lookup_table_pda};
use crate::LUTS_ID;
use mollusk_helper::{MolluskContextHelper, ADDRESS_LOOKUP_TABLE_PROGRAM_ID};
use solana_pubkey::Pubkey;

pub fn create_context() -> MolluskContextHelper {
    let elf = std::fs::read("../../target/deploy/luts.so")
        .expect("Failed to read luts.so - run `anchor build` first");

    let alt_elf = std::fs::read("tests/fixtures/address_lookup_table.so")
        .expect("Failed to read address_lookup_table.so - download from mainnet");

    let mut ctx = MolluskContextHelper::new(&LUTS_ID, &elf);
    ctx.add_program(&ADDRESS_LOOKUP_TABLE_PROGRAM_ID, &alt_elf);

    ctx
}

pub fn create_lut(
    ctx: &mut MolluskContextHelper,
    signer: &Pubkey,
    id: u64,
    recent_slot: u64,
) -> (Pubkey, Pubkey) {
    ctx.warp_to_slot(recent_slot);
    ctx.warp_to_slot(recent_slot + 1);

    let (user_address_lookup_table, _) = get_user_address_lookup_table_pda(signer, id);
    let (address_lookup_table, _) =
        derive_address_lookup_table(&user_address_lookup_table, recent_slot);

    let instruction = CreateAddressLookupTableBuilder::new()
        .signer(*signer)
        .address_lookup_table(address_lookup_table)
        .user_address_lookup_table(user_address_lookup_table)
        .recent_slot(recent_slot)
        .id(id)
        .instruction();

    let result = ctx.process_instruction(&instruction);
    assert!(
        result.is_ok(),
        "CreateAddressLookupTable should succeed: {:?}",
        result
    );

    (user_address_lookup_table, address_lookup_table)
}