solana_runtime/bank/
address_lookup_table.rs1use {
2 super::Bank,
3 solana_sdk::{
4 address_lookup_table::error::AddressLookupError,
5 clock::Slot,
6 message::{
7 v0::{LoadedAddresses, MessageAddressTableLookup},
8 AddressLoaderError,
9 },
10 transaction::AddressLoader,
11 },
12 solana_svm_transaction::message_address_table_lookup::SVMMessageAddressTableLookup,
13};
14
15fn into_address_loader_error(err: AddressLookupError) -> AddressLoaderError {
16 match err {
17 AddressLookupError::LookupTableAccountNotFound => {
18 AddressLoaderError::LookupTableAccountNotFound
19 }
20 AddressLookupError::InvalidAccountOwner => AddressLoaderError::InvalidAccountOwner,
21 AddressLookupError::InvalidAccountData => AddressLoaderError::InvalidAccountData,
22 AddressLookupError::InvalidLookupIndex => AddressLoaderError::InvalidLookupIndex,
23 }
24}
25
26impl AddressLoader for &Bank {
27 fn load_addresses(
28 self,
29 address_table_lookups: &[MessageAddressTableLookup],
30 ) -> Result<LoadedAddresses, AddressLoaderError> {
31 self.load_addresses_from_ref(
32 address_table_lookups
33 .iter()
34 .map(SVMMessageAddressTableLookup::from),
35 )
36 .map(|(loaded_addresses, _deactivation_slot)| loaded_addresses)
37 }
38}
39
40impl Bank {
41 pub fn load_addresses_from_ref<'a>(
44 &self,
45 address_table_lookups: impl Iterator<Item = SVMMessageAddressTableLookup<'a>>,
46 ) -> Result<(LoadedAddresses, Slot), AddressLoaderError> {
47 let slot_hashes = self
48 .transaction_processor
49 .sysvar_cache()
50 .get_slot_hashes()
51 .map_err(|_| AddressLoaderError::SlotHashesSysvarNotFound)?;
52
53 let mut deactivation_slot = u64::MAX;
54 let mut loaded_addresses = LoadedAddresses::default();
55 for address_table_lookup in address_table_lookups {
56 deactivation_slot = deactivation_slot.min(
57 self.rc
58 .accounts
59 .load_lookup_table_addresses_into(
60 &self.ancestors,
61 address_table_lookup,
62 &slot_hashes,
63 &mut loaded_addresses,
64 )
65 .map_err(into_address_loader_error)?,
66 );
67 }
68
69 Ok((loaded_addresses, deactivation_slot))
70 }
71}