Work with address lookup tables to optimize transaction size and costs
Address Lookup Tables (ALTs) are a Solana feature that allows you to reference frequently used addresses in a compact format, reducing transaction size and costs. This guide shows two examples of working with ALTs.
This example retrieves all lookup tables controlled by a specific authority:
package software.sava.examples;import software.sava.core.accounts.PublicKey;import software.sava.core.accounts.SolanaAccounts;import software.sava.core.accounts.lookup.AddressLookupTable;import software.sava.core.rpc.Filter;import software.sava.rpc.json.http.client.SolanaRpcClient;import java.net.URI;import java.net.http.HttpClient;import java.util.List;public final class FetchTablesByAuthority { public static void main(final String[] args) { final var rpcEndpoint = "https://mainnet.helius-rpc.com/?api-key="; // Add your API key final var authority = PublicKey.fromBase58Encoded(""); // Add authority address try (final var httpClient = HttpClient.newHttpClient()) { final var rpcClient = SolanaRpcClient.createClient(URI.create(rpcEndpoint), httpClient); final var tableAccountInfoList = rpcClient.getProgramAccounts( SolanaAccounts.MAIN_NET.addressLookupTableProgram(), List.of( Filter.createMemCompFilter(AddressLookupTable.AUTHORITY_OFFSET, authority) ) ).join(); for (final var accountInfo : tableAccountInfoList) { final var table = AddressLookupTable.read(accountInfo.pubKey(), accountInfo.data()); System.out.println(table); } } }}
final var rpcEndpoint = "https://mainnet.helius-rpc.com/?api-key=YOUR_KEY";final var authority = PublicKey.fromBase58Encoded("AUTHORITY_ADDRESS");final var rpcClient = SolanaRpcClient.createClient(URI.create(rpcEndpoint), httpClient);
Creates an HTTP RPC client. Use a custom RPC endpoint with your API key for better rate limits.
final var tableAccountInfoList = rpcClient.getProgramAccounts( SolanaAccounts.MAIN_NET.addressLookupTableProgram(), List.of( Filter.createMemCompFilter(AddressLookupTable.AUTHORITY_OFFSET, authority) )).join();
Fetches all accounts owned by the ALT program where:
The authority field matches the specified public key
AUTHORITY_OFFSET is the byte position where the authority is stored in the account data
for (final var accountInfo : tableAccountInfoList) { final var table = AddressLookupTable.read(accountInfo.pubKey(), accountInfo.data()); System.out.println(table);}
Iterates through all matching lookup tables and parses their data.
While these examples focus on reading lookup tables, here’s how you’d use them in transactions:
import software.sava.core.tx.TransactionSkeleton;import software.sava.core.accounts.lookup.AddressLookupTable;// Create a transaction with lookup table supportAddressLookupTable lookupTable = // ... fetched from above examples// Reference addresses by index instead of including full 32-byte addresses// For example, if lookupTable.addresses().get(5) is your target account:// The transaction can reference it with just index 5 (1 byte) instead of 32 bytes
Use the authority filter to track tables you control:
final var myAuthority = PublicKey.fromBase58Encoded("YOUR_WALLET_ADDRESS");// Fetch all your lookup tablesfinal var myTables = rpcClient.getProgramAccounts( SolanaAccounts.MAIN_NET.addressLookupTableProgram(), List.of( Filter.createMemCompFilter(AddressLookupTable.AUTHORITY_OFFSET, myAuthority) )).join();