Back to Blog
Solana

How to Revoke Token Permissions on Solana

S
Sol Slugs Team
Sol Incinerator

Revoking permissions is well-trodden ground on Ethereum, where unlimited ERC-20 approvals have drained a lot of wallets. Solana has an equivalent mechanism, it works differently, and it is worth understanding what it can and cannot do to you.

How do you revoke token permissions on Solana?

Connect to the revoke tool. It scans every token account you own, shows which addresses you have approved to move tokens out of them, and clears those approvals in one batch. There is no fee — revoking reclaims no rent, so you pay only the network fee. From the CLI it is spl-token revoke <TOKEN_ACCOUNT_ADDRESS>.

What a Solana delegate actually is

When you approve something on Solana, you are setting a delegate on one specific token account. The Approve instruction records two things on that account: the delegate's address, and a delegated amount.

The delegate can then transfer or burn up to that amount from that one account, without asking you again. It cannot touch your other token accounts, cannot exceed the delegated amount, and cannot move your SOL.

This is a genuine authority and worth taking seriously — a delegate with an allowance over your token account can move those tokens. But the blast radius is meaningfully smaller than the Ethereum equivalent, for three structural reasons.

Why Solana approvals are narrower than Ethereum's

Ethereum approvalSolana delegate
ScopeEvery token you hold of that contractOne token account
AmountFrequently unlimitedA fixed cap you set
Multiple at onceYes, they accumulate per spenderNo — one delegate per account
Cleared byAn explicit revoke transactionA revoke, or closing the account

The third row is the important one. On Ethereum, approvals pile up: you can hand out allowances to a dozen contracts on the same token, each one persisting quietly until revoked. Years of DeFi use leaves a long tail of forgotten unlimited approvals, which is exactly why revoke tools became essential there.

On Solana, each token account holds at most one delegate. Setting a new one overwrites the previous one. There is no accumulating list — a token account either has a single delegate right now, or it does not.

This is why Solana never developed the same revoke-tool culture as Ethereum. The exposure is real but bounded, and it clears itself in the ordinary course of using your wallet.

Where delegates come from

Most delegates on your accounts are not sinister — they are how normal Solana features work:

  • NFT marketplace listings. Listing an NFT typically delegates it to the marketplace program so the sale can execute when a buyer appears. This is also why a listed NFT cannot be burned until you delist it: your wallet no longer holds unilateral authority over it.
  • Staking and vault programs. Depositing into a protocol often uses a delegate rather than transferring custody.
  • Programmable NFTs. pNFTs are held frozen with a delegated authority as part of enforcing royalties.
  • Malicious approvals. The one to actually worry about: a phishing site presents a transaction that looks like a claim, and what you sign is an Approve handing a delegate authority over your tokens.

The one thing a revoke cannot clear

Everything above is about the account-level delegate — a field on your own token account, which you own and can therefore clear.

Token-2022 introduced a separate, stronger authority: a permanent delegate, set on the mint rather than on your account. A mint with one gives that address transfer and burn authority over every account holding that token, with no cap, and there is nothing the holder can do about it. It is a property of the token itself, not a permission you granted, so Revoke does not touch it and neither does any tool.

Some legitimate tokens use it deliberately — regulated stablecoins that need a clawback path, for example. But it means the honest scope of any Solana revoke tool, ours included, is approvals you granted on your own accounts.

If a token's mint has a permanent delegate, the only way to remove that exposure is to stop holding the token. Check the mint on an explorer before assuming a clean revoke means nobody can move a given balance.

How to check what has a delegate

Wallets do not surface this. Phantom and Solflare show you balances, not the delegate field sitting on each token account, so an approval you granted two years ago is invisible in the interface you use every day.

Three ways to see it:

  • The revoke tool. Connect your wallet and it scans every token account across both the SPL Token and Token-2022 programs, listing each delegate, the mint it applies to, and the size of the allowance. The scan is read-only — no signature, nothing to approve just to look.
  • A block explorer. Look up your wallet address, open the individual token accounts, and check the delegate field. It is displayed when one is set. Workable for one account, tedious for a hundred.
  • The spl-token CLI. spl-token account-info <TOKEN_ACCOUNT_ADDRESS> reports the delegate and delegated amount.

If the delegate is a marketplace you recognize and the NFT is currently listed, that is expected — delist it and the delegate clears.

Watch the allowance column. Approvals frequently set it to the maximum possible value rather than the amount actually needed, which the tool displays as Unlimited. A legitimate listing usually delegates exactly one NFT; an unlimited allowance on a token you hold a lot of is worth a second look.

How to revoke

From the tool, connect at sol-incinerator.com/revoke, review the list, and sign. Everything selected is batched into as few transactions as possible, so a wallet with thirty stale delegates is not thirty signatures.

There is no fee. Revoking releases no rent, so there is nothing for a fee to come out of — you pay the network transaction fee and nothing else.

From the CLI, against a specific token account:

spl-token revoke <TOKEN_ACCOUNT_ADDRESS>

This calls the SPL Token program's Revoke instruction, which requires only the token account and your signature as its owner. It clears the delegate field outright. It cannot fail partially, and it does not affect your balance.

From a wallet UI, the usual route is indirect: cancel or delist whatever created the delegate in the first place. Delisting an NFT from the marketplace you listed it on removes that marketplace's delegate as part of the cancel instruction.

Revoking a marketplace's delegate on a listed NFT effectively delists it — the marketplace can no longer complete a sale. That is the correct behavior, but if you intend to keep something listed, leave its delegate alone.

Why can't I revoke a frozen account?

Because Solana will not let you. The SPL Token program rejects a revoke against a frozen token account outright, returning AccountFrozen — freezing an account blocks authority changes, not just transfers.

This matters more than it sounds, because frozen and delegated tend to go together. Programmable NFTs are held frozen with a delegate as part of enforcing royalties, and many staking programs freeze what they hold. So the delegates you are most likely to find are often exactly the ones that cannot be cleared directly.

The tool leaves these out of the list, because in practice a frozen account with a delegate is usually working as intended — a pNFT enforcing royalties, or an asset you deliberately staked — not something you need to act on.

If you do want one cleared, the account has to be thawed first. Unstake, delist, or complete whatever action froze it; once thawed, the delegate revokes normally.

Burning is not a workaround. A frozen account rejects burns for the same reason it rejects revokes — the freeze blocks the operation, not just transfers — so you cannot destroy your way out of a frozen delegate while the asset is still in there. Only the freeze authority can thaw it.

There is a practical reason the tool will not simply try anyway: revokes are batched into as few transactions as possible, so a frozen account would take down every other delegate sharing its transaction. Leaving it out is what lets the rest succeed.

The complete version: close the account

Here is the part that often gets missed. The delegate is a field stored on the token account. No account, no delegate.

So if the token in question is something you do not want anyway — a spam token, a dead memecoin, a scam airdrop that talked you into signing something — burning it and closing its account removes the delegate permanently as a side effect. You are not revoking the permission so much as deleting the thing the permission applied to. And unlike a bare revoke, closing the account returns the ~0.00204 SOL rent deposit it was holding.

That makes cleanup the more thorough response for any token you have no intention of keeping:

ActionDelegate clearedToken keptSOL returned
RevokeYesYesNo
Burn + close accountYesNo0.002 SOL

Revoke when you want to keep the token. Burn and close when you do not.

If you believe you signed a malicious transaction, revoking is not sufficient on its own. A delegate is only one of several things an attacker may have obtained, and if your seed phrase was exposed no on-chain action will help. Move your valuable assets to a fresh wallet first, then deal with the compromised one.

The realistic threat model

For most people the honest summary is: check your delegates if you have signed something you regret, delist anything you no longer want listed, and clear out the junk tokens that malicious approvals tend to attach themselves to.

Solana's design means you are not carrying years of accumulated unlimited approvals the way an Ethereum wallet does. What you probably are carrying is a few hundred abandoned token accounts, each holding a refundable deposit — which is worth actual money and takes about a minute to recover.

Revoke Delegates

Revoke Delegates

Scan your wallet for account-level delegates you have approved, and clear them. No fee — you pay only the network fee.

Try it now

Related Reading

Frequently Asked Questions

How do you revoke token permissions on Solana?

Use the SPL Token program's Revoke instruction against the token account that has a delegate set. It requires only the token account and your signature as owner. From the command line it is spl-token revoke followed by the token account address.

What is a delegate on a Solana token account?

A delegate is an address you have authorized to transfer or burn up to a set amount from one specific token account. Marketplaces use delegates for NFT listings and staking programs use them for deposits. Each token account can have only one delegate at a time.

Are Solana approvals as risky as Ethereum approvals?

They are narrower. A Solana delegate is scoped to a single token account with a fixed amount cap, and approving a new delegate replaces the old one rather than stacking. Ethereum approvals are per token contract, frequently unlimited, and accumulate indefinitely.

Does closing a token account remove its delegate?

Yes, completely. The delegate is a field stored on the token account itself, so when the account is closed the delegate ceases to exist along with it. Burning an unwanted token and closing its account removes any delegate as a side effect.

How do I know if a token account has a delegate set?

Look up your address on a block explorer and inspect the individual token accounts, where the delegate field is shown if one is set. The spl-token CLI also reports it, and any wallet displaying raw account data will surface the same field.

Why can I not revoke a frozen token account?

The SPL Token program rejects a revoke against a frozen account and returns an AccountFrozen error, because freezing blocks authority changes and not just transfers. Programmable NFTs and staked assets are commonly frozen. The account has to be thawed before its delegate can be cleared, and burning is not a way around it because a frozen account rejects burns too.

Can a revoke remove a Token-2022 permanent delegate?

No. A permanent delegate is set on the mint rather than on your token account, and it grants transfer and burn authority over every account holding that token. It is a property of the token itself, so no revoke instruction can clear it. The only way to remove that exposure is to stop holding the token.