gmsol_solana_utils/
address_lookup_table.rs

1use std::collections::{HashMap, HashSet};
2
3use solana_sdk::{address_lookup_table::AddressLookupTableAccount, pubkey::Pubkey};
4
5/// Address Lookup Tables.
6#[derive(Debug, Clone, Default)]
7pub struct AddressLookupTables {
8    pub(crate) luts: HashMap<Pubkey, Vec<Pubkey>>,
9}
10
11impl AddressLookupTables {
12    /// Returns unique addresses.
13    pub fn addresses(&self) -> HashSet<Pubkey> {
14        self.luts
15            .values()
16            .flatten()
17            .copied()
18            .collect::<HashSet<_>>()
19    }
20
21    /// Returns whether the LUT list is empty.
22    pub fn is_empty(&self) -> bool {
23        self.luts.is_empty()
24    }
25
26    /// Returns the number of LUTs.
27    pub fn len(&self) -> usize {
28        self.luts.len()
29    }
30
31    /// Add a LUT.
32    pub fn add(&mut self, lut: &AddressLookupTableAccount) {
33        self.luts.insert(lut.key, lut.addresses.clone());
34    }
35
36    /// Returns an iterator of accounts.
37    pub fn accounts(&self) -> impl Iterator<Item = AddressLookupTableAccount> + '_ {
38        self.luts
39            .iter()
40            .map(|(key, addresses)| AddressLookupTableAccount {
41                key: *key,
42                addresses: addresses.clone(),
43            })
44    }
45}
46
47impl FromIterator<(Pubkey, Vec<Pubkey>)> for AddressLookupTables {
48    fn from_iter<T: IntoIterator<Item = (Pubkey, Vec<Pubkey>)>>(iter: T) -> Self {
49        Self {
50            luts: FromIterator::from_iter(iter),
51        }
52    }
53}