Address Lookup Tables in Practice
Use Address Lookup Tables (ALTs) with versioned (v0) transactions to fit more accounts in one transaction without exceeding packet size limits.
Search across all documentation pages
Use Address Lookup Tables (ALTs) with versioned (v0) transactions to fit more accounts in one transaction without exceeding packet size limits.
Quick-reference recipe card - copy-paste ready.
solana address-lookup-table create
solana address-lookup-table extend <ALT_ADDRESS> <PUBKEY1> <PUBKEY2>
solana address-lookup-table freeze <ALT_ADDRESS>When to reach for this:
solana config set --url devnet
solana airdrop 2
# Create lookup table (returns table address)
solana address-lookup-table create
ALT="<LOOKUP_TABLE_ADDRESS>"
solana address-lookup-table extend "$ALT" \
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA \
YOUR_PROGRAM_ID
# Wait for slot activation (~1 slot) then use in v0 tx from client
solana address-lookup-table get "$ALT"import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc(process.env.RPC_URL!);
const alt = await rpc
.getAddressLookupTable(address("ALT_PUBKEY"))
.send();
console.log("addresses:", alt.value?.data.addresses.length);What this demonstrates:
AddressLookupTableProgram manages create/extend/deactivate/close.addressTableLookups field populated.| Step | Action |
|---|---|
| Create | Allocate table account |
| Extend | Append pubkeys (authority) |
| Activate | Wait ~1 slot before use |
| Freeze | Optional immutability |
| Deactivate | Cooldown before close |
// @solana/kit 7.0.0 supports versioned transaction building
// Fetch ALT accounts with getAddressLookupTable before compile| Alternative | Use When | Don't Use When |
|---|---|---|
| Fewer accounts / merge ix | Simple programs | Unavoidable large metas |
| Multiple transactions | Non-atomic acceptable | Atomic swap required |
| Jito bundle atomicity | Multi-tx atomic landing | Single v0 sufficient |
| Remaining accounts pattern | On-chain dynamic metas | Client size still large |
Large capacity per table - extend in batches; multiple tables per tx allowed within limits.
Rent-exempt lamports for table account proportional to stored pubkeys plus tx fees.
Authority set at creation - often deployer multisig.
Same workflow - essential before mainnet large txs.
Modern wallets support versioned transactions - test wallet matrix early.
Independent - size savings enable landing; fees still needed under congestion.
Deactivate then close after cooldown to reclaim rent.
Programs do not embed ALT - client supplies lookup in transaction message.
Use kit transaction message builders with fetched lookup table accounts.
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.
Reviewed by Chris St. John·Last updated Jul 19, 2026