use crate::common::SolanaRpcClient;
use anyhow::Result;
use solana_message::AddressLookupTableAccount;
use solana_sdk::pubkey::Pubkey;
pub async fn fetch_address_lookup_table_account(
rpc: &SolanaRpcClient,
lookup_table_address: &Pubkey,
) -> Result<AddressLookupTableAccount, anyhow::Error> {
let account = rpc.get_account(lookup_table_address).await?;
if account.data.len() < 56 {
return Err(anyhow::anyhow!("Address lookup table account data too short"));
}
let mut addresses = Vec::new();
let mut offset = 56;
while offset + 32 <= account.data.len() {
let addr_bytes: [u8; 32] = account.data[offset..offset + 32].try_into()?;
if addr_bytes != [0u8; 32] {
addresses.push(Pubkey::from(addr_bytes));
}
offset += 32;
}
let address_lookup_table_account = AddressLookupTableAccount {
key: *lookup_table_address,
addresses,
};
Ok(address_lookup_table_account)
}