solana_runtime/bank/
address_lookup_table.rs

1use {
2    super::Bank,
3    crate::accounts_db::LoadZeroLamports,
4    solana_address_lookup_table_program::error::AddressLookupError,
5    solana_sdk::{
6        feature_set::return_none_for_zero_lamport_accounts,
7        message::{
8            v0::{LoadedAddresses, MessageAddressTableLookup},
9            AddressLoaderError,
10        },
11        transaction::AddressLoader,
12    },
13};
14
15impl AddressLoader for &Bank {
16    fn load_addresses(
17        self,
18        address_table_lookups: &[MessageAddressTableLookup],
19    ) -> Result<LoadedAddresses, AddressLoaderError> {
20        if !self.versioned_tx_message_enabled() {
21            return Err(AddressLoaderError::Disabled);
22        }
23
24        let load_zero_lamports = if self
25            .feature_set
26            .is_active(&return_none_for_zero_lamport_accounts::id())
27        {
28            LoadZeroLamports::None
29        } else {
30            LoadZeroLamports::SomeWithZeroLamportAccount
31        };
32
33        let slot_hashes = self
34            .sysvar_cache
35            .read()
36            .unwrap()
37            .get_slot_hashes()
38            .map_err(|_| AddressLoaderError::SlotHashesSysvarNotFound)?;
39
40        Ok(address_table_lookups
41            .iter()
42            .map(|address_table_lookup| {
43                self.rc.accounts.load_lookup_table_addresses(
44                    &self.ancestors,
45                    address_table_lookup,
46                    &slot_hashes,
47                    load_zero_lamports,
48                )
49            })
50            .collect::<Result<_, AddressLookupError>>()?)
51    }
52}