Solana
Close Solana Address Lookup Tables and Recover the Rent
Address lookup tables are the accounts transaction tooling creates to squeeze more addresses into one transaction — trading bots, bundlers and deploy scripts make them by the dozen and almost never clean them up. Each one holds a rent deposit that stays locked until the table is closed. This scans your wallet for every table it is the authority of, shows how long each has sat untouched, and walks the close — including the one wrinkle the chain enforces: an active table must be deactivated first, then waits about three minutes before it can be closed.
The exact total — platform fee plus the real network cost — is quoted in the console before anything is signed.
Why closing takes two steps
The chain refuses to close a table that is still active, because a transaction already in flight might reference it. Deactivating a table starts a cooling-off period of 512 slots — about three minutes at today’s block times — during which anything already using it keeps working, and after which the close is allowed. The console runs both steps as one flow: one approval closes everything already eligible and deactivates the rest, a counter shows the unlock, and the second approval collects the newly eligible ones. Leaving mid-wait is safe — the unlock continues on-chain, and the next scan picks up exactly where you left off.
Know which tables are actually abandoned
Here is the truth the chain enforces, which we verified against live transactions: Solana records when a table is WRITTEN — created, extended, deactivated — but never when it is merely read by a transaction. No index anywhere holds "last used". So the scan shows each active table’s real last-write date, linked to the transaction, labelled as exactly that. And for the question that actually decides things — is anything still loading this table? — every active row carries a check: it reads the recent history of the addresses the table stores and looks for transactions that loaded the table through it. A hit is definitive proof of use, with the exact time. Finding nothing is only "no loads recently" — which is why every deactivation still asks for its own explicit confirmation.
What a close returns
The whole account balance — the rent paid when the table was created and extended — goes back to the wallet that owns it, in full. The figure on each row is read live from the account, never estimated from a rate. The service fee is 5% of the SOL a close actually returns; deactivating is free, because nothing comes back at that step. One permanent fact travels with the numbers: a closed table’s address can never be recreated, so anything still configured with it must be updated to a new table.
The honest limits
The Solana CLI closes lookup tables for free, one address at a time, and if you have three tables and know their addresses it is all you need. What it will not do is find them: a busy trading wallet can hold thousands of tables — the largest we measured holds eighty-seven thousand — and this scan lists them all, oldest first, and batches the closes into signing sessions of ninety-six. Also out of reach for everyone: a frozen table has no authority left, so nobody can ever close it, and its rent is permanently on-chain.
Questions
- How much rent does a lookup table hold?
- It depends on how many addresses it stores — the account is 56 bytes plus 32 per address, all rent-exempt. A small table holds roughly 0.002 SOL; a full one holds about 0.06 SOL. The mainnet average sits near 0.003 SOL, which adds up fast for the tooling wallets that made hundreds of them.
- Why do I have to wait three minutes?
- The wait is the chain’s safety rule, not ours: a deactivated table stays usable for 512 slots so transactions already built against it cannot break mid-flight. Once that window passes, the close is allowed. The console counts it down and picks the tables up automatically when they become eligible.
- Can someone else close my tables?
- No. The program checks that the signer is the table’s recorded authority and refuses anyone else — we verified that against the live program before building this. The refund also has nowhere else to go in the transactions built here: your wallet is the recipient, and you can read that in the transaction before approving it.
- What if one of my tables is still in use?
- Use the check on its row before deciding: it inspects the recent transactions of the addresses the table stores and reports any that actually loaded the table — with the exact time of the latest one. A found load is proof the table is live; do not deactivate it, because your systems would break about three minutes later. Finding no loads is bounded evidence, not proof — reads are not recorded on-chain — so every deactivation still asks for its own explicit confirmation.
- Is closing reversible?
- The SOL comes back, but the table’s address never does — the chain blocks recreating a table at the same address by design. If anything still references the old address, it needs a new table and a config update. Deactivating is one-way too — there is no reactivate instruction — but nothing is lost by it: the rent stays yours, waiting at the close.