gmsol_solana_utils/
address_lookup_table.rs1use std::collections::{HashMap, HashSet};
2
3use solana_sdk::{address_lookup_table::AddressLookupTableAccount, pubkey::Pubkey};
4
5#[derive(Debug, Clone, Default)]
7pub struct AddressLookupTables {
8 pub(crate) luts: HashMap<Pubkey, Vec<Pubkey>>,
9}
10
11impl AddressLookupTables {
12 pub fn addresses(&self) -> HashSet<Pubkey> {
14 self.luts
15 .values()
16 .flatten()
17 .copied()
18 .collect::<HashSet<_>>()
19 }
20
21 pub fn is_empty(&self) -> bool {
23 self.luts.is_empty()
24 }
25
26 pub fn len(&self) -> usize {
28 self.luts.len()
29 }
30
31 pub fn add(&mut self, lut: &AddressLookupTableAccount) {
33 self.luts.insert(lut.key, lut.addresses.clone());
34 }
35
36 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}