> For the complete documentation index, see [llms.txt](https://docs.j.tools/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.j.tools/tools/secure/freeze-account.md).

# Freeze Solana Token Accounts in One Batch

[Freeze Account](https://j.tools/en/tools/freeze-account) locks SPL token holder accounts for one mint in bulk, straight from your browser wallet on Solana mainnet. You load the holders, protect any wallets you want to keep untouched, confirm you hold the freeze authority, and freeze the rows you select. Freezing blocks transfers for that holder until you thaw the account again. It never moves tokens or changes total supply.

## What it is

Freeze Account is a batch tool for the SPL Token `freeze_account` action. It builds and signs one freeze transaction per selected holder and reports a per-row status so you can see which accounts froze and which need a retry.

It works only on a mint where your connected wallet currently holds the **freeze authority**, and only on classic SPL Token and [Token-2022](/concepts/spl-vs-token2022.md) mints that have a freeze authority set. Freezing is reversible by the same authority with [Unfreeze Account](/tools/secure/unfreeze-account.md).

## Why use this tool

If you hold the freeze authority and need to lock more than one or two holders, doing it by hand gets painful fast. You would script `spl-token freeze` per account, query and parse the holder list yourself, track which calls succeeded, and re-run the failures.

The tool scans the on-chain holders for the mint, sorts them by balance, and confirms whether your wallet is the freeze authority before it lets you run anything. It is built for token issuers and operators: teams running a compliance or incident-response action, projects pausing wallets during a staged rollout or vesting window, and anyone who needs to lock many holder accounts at once. New to the term? The [Glossary](/getting-started/glossary.md) and the [authorities](/concepts/authorities.md) page explain how the freeze authority differs from mint authority.

## How it works (under the hood)

When you click **Freeze All**, the tool builds one transaction per selected holder. The core of each transaction is a `freeze_account` instruction on the **SPL Token program** (or the **Token-2022 program**, detected from the mint). That instruction targets one specific holder token account for your mint and flips it to the frozen state. Once a token account is frozen, the program rejects any transfer in or out of it until it is thawed. No balance moves, no supply changes, and no other holder is affected.

The instruction only succeeds if the signer is the mint's current freeze authority. The page reads that authority from chain after you load holders and compares it to your connected wallet. If it does not match, **Freeze All** stays disabled, and any execution returns "Connected wallet is not the freeze authority." The token program enforces this on chain, so even setting aside the UI check, a freeze cannot land from the wrong wallet.

Because each holder account is its own freeze, each is its own transaction. Selecting 50 rows means 50 transactions and 50 wallet approvals; there is no packing and no batch size that changes that. The platform fee is attached as a separate transfer instruction to the first freeze transaction that actually confirms. If the first row fails, the fee moves to the next attempt; if every row fails, no platform fee is collected. A 50-holder freeze records a single platform fee, not fifty.

## When to use it (and when not to)

Use it when:

* You hold the freeze authority on a mint and need to lock holder accounts.
* A compliance or incident-response situation calls for pausing specific wallets.
* You are running a staged rollout or vesting plan where transfers must stay paused for now.
* You want to freeze many holders in one pass rather than running one-off scripts.

Do not use it when:

* You do not hold the freeze authority. There is no way around this; the chain will reject the freeze.
* The mint has no freeze authority set. Those mints can never be frozen, by design.
* You want to permanently give up the freeze authority. That is a different action, [Revoke Freeze](/tools/secure/revoke-freeze.md), and it cannot be undone.
* You want to remove tokens or burn supply. Freezing does neither; look at the relevant supply tools instead.

## Before you start

* A connected wallet that is the **current freeze authority** of the target mint. If it is not, **Freeze All** stays disabled and execution returns "Connected wallet is not the freeze authority."
* The mint must have a freeze authority set. Mints with no freeze authority cannot be frozen.
* The token's mint address (CA). Pick it with the built-in token selector.
* Enough SOL for the network fees plus the platform fee.
* An RPC that can enumerate holders. Very large mints need an indexed endpoint, or the scan reports `FULL_HOLDER_SCAN_UNAVAILABLE`.

{% hint style="warning" %}
Freezing locks a holder's account so they cannot transfer or interact with that token until it is thawed. Only the freeze authority can reverse it. It does **not** change balances or total supply; it only blocks transfers.
{% endhint %}

## Step by step

{% stepper %}
{% step %}

### Connect the freeze authority

Connect the wallet that holds the freeze authority for the mint. The page checks this against the chain and only enables **Freeze All** when it matches.
{% endstep %}

{% step %}

### Load holders

Enter the mint address (CA) and click **Load Holders**. J Tools scans on-chain token accounts, sorts them by balance, and reports the freeze authority plus whether your connected wallet holds it.
{% endstep %}

{% step %}

### Protect wallets (optional)

Paste any wallets into the **Session Whitelist**, one per line. Matching holder rows are marked protected and forced off, so they cannot be frozen. The parser shows valid, invalid and duplicate line counts.
{% endstep %}

{% step %}

### Select the rows to freeze

Use the per-row checkbox, **Select All**, or **Clear Selection**. Already-frozen and protected rows cannot be selected. Review the stats panel before you run.
{% endstep %}

{% step %}

### Freeze and confirm

Click **Freeze All**. For each selected row, the tool builds a freeze transaction (auto-detecting classic SPL Token vs Token-2022), you sign it in your wallet, and the row updates to Success or Failed. Every selected row is its own transaction, so expect one wallet approval per row.
{% endstep %}

{% step %}

### Retry any failures

If some rows fail, click **Retry Failed** to re-run only those rows. Successful and idle rows are skipped.
{% endstep %}
{% endstepper %}

[**Open Freeze Account in the app →**](https://j.tools/en/tools/freeze-account)

{% hint style="info" %}
**About wallet warnings.** Some tools bundle several instructions into one transaction, for example creating a token and its metadata together. Phantom can show a caution banner for these transactions. The banner is expected here and does not mean something is wrong. Read what you are signing, then approve.
{% endhint %}

## The options, explained

* **Token Mint Address (CA):** The SPL mint to manage. The page reads holders, decimals and the freeze authority from chain for this mint. Required.
* **Load Holders:** Scans on-chain token accounts for the mint, drops any account with a zero balance, sorts the rest by balance, and shows the freeze authority and whether your wallet holds it. An empty token account for this mint will never appear in the table, so it cannot be frozen from here.
* **Session Whitelist:** Wallets to protect for this session, one per line. Matching rows are marked protected and deselected so they cannot be frozen. Shows total, active, valid, invalid and duplicate counts. Not saved between visits.
* **Per-row select:** A checkbox on each holder row. Adds that one account to the batch. Protected and already-frozen rows cannot be selected.
* **Select All:** Adds every eligible (non-frozen, non-protected) row to the batch at once.
* **Clear Selection:** Deselects every row so you can start the selection over.
* **Freeze All:** Runs the freeze transactions for the selected eligible rows. Disabled unless your wallet is the mint's freeze authority.
* **Retry Failed:** Re-runs only the rows that failed in the previous batch. Successful and idle rows are skipped.
* **Load More:** Appears only when the scan was truncated. The first Load Holders returns up to 10,000 rows; each Load More adds another 10,000, up to a hard ceiling of 50,000 rows, after which the button is disabled. Rows are kept by balance, so beyond the ceiling you are seeing the 50,000 largest holders, not all of them.

{% hint style="info" %}
The whitelist is **per session only** and is not saved. Re-enter the wallets you want to protect on every visit before you run a batch.
{% endhint %}

## Fees and costs

{% hint style="warning" %}
**About fees.** Every action has two costs: the Solana **network fee** paid to validators, and the **J Tools platform fee**. The platform fee always shows in the app before you confirm, and nothing is charged until you sign. Fees can change over time, so trust the in-app summary rather than a number you saw once.
{% endhint %}

**Current platform fee: 0.01 SOL.**

| Cost                 | Amount                                                                     |
| -------------------- | -------------------------------------------------------------------------- |
| J Tools platform fee | 0.01 SOL                                                                   |
| Solana network fee   | a small amount paid to validators, plus rent for any new on-chain accounts |

The platform fee is charged once per batch run, not once per holder, and it rides on the first transaction of the run that confirms. Retry Failed does not charge a second fee: the collected state carries over, so a retry only pays the fee if the original run never landed one. On top of that you pay the standard Solana network fee for every freeze transaction, which is a few thousand lamports each, so a larger batch costs slightly more in network fees overall. There is no per-account rent for freezing, since the holder token accounts already exist. The in-app fee summary combines the per-row network estimate with the platform fee before you sign, and the same numbers appear on the [Fee schedule](/reference/fee-schedule.md).

## Common mistakes and troubleshooting

* **Connected wallet is not the freeze authority.** Freeze All is disabled or execution stops. Connect the wallet that holds the freeze authority for this mint.
* **No freeze authority on the mint.** A mint with no freeze authority cannot be frozen. There is nothing to do here.
* **Holder scan truncated.** Compare **Total Found** against **Loaded** in the stats panel. If they differ, use **Load More** to extend the scan before assuming full coverage.
* **`FULL_HOLDER_SCAN_UNAVAILABLE`.** Your RPC could not enumerate all holders for a large mint. Use an indexed endpoint that supports paginated account scans.
* **Some rows failed.** Click **Retry Failed** to re-run only those rows. Idle and already-successful rows are skipped.
* **Ran out of SOL mid-batch.** Unlike the revoke tools, this page does not pre-check your balance and does not disable the run when it is low. Fund the signing wallet for the platform fee plus a network fee per selected row before you start, or the run will begin and then start failing rows partway through.

For the full list, see the [Error codes reference](/reference/error-codes.md).

## Advanced tips

* **Snapshot first.** Run [Token Snapshot](/tools/utilities/token-snapshot.md) before a freeze to capture the holder list and balances, so you have a record of who was locked and when.
* **Whitelist your own infrastructure.** Add team, LP, treasury, and CEX deposit wallets to the **Session Whitelist** before you select, so a Select All never catches an account you meant to leave open.

## Related tools

Working with the freeze authority? These pair naturally with this tool.

{% content-ref url="/pages/AnXiSeLCVZ7RYJxrfzEo" %}
[Unfreeze Token Accounts](/tools/secure/unfreeze-account.md)
{% endcontent-ref %}

{% content-ref url="/pages/3mfyP8upN3tiDTB59aRi" %}
[Revoke Freeze Authority](/tools/secure/revoke-freeze.md)
{% endcontent-ref %}

{% content-ref url="/pages/IkDuDGRTPYj2wcjtbIre" %}
[Token Holder Snapshot](/tools/utilities/token-snapshot.md)
{% endcontent-ref %}

{% hint style="success" %}
**J Tools is non-custodial.** We never store or transmit your private keys and never ask for your seed phrase. Every transaction is signed in your own browser, and nothing about a key ever reaches our servers. A few multi-wallet tools do let you paste private keys for throwaway hot wallets, which stay in your browser tab and are used only to sign locally. Never paste a key tied to long-term holdings, and if a page ever asks for your seed phrase, stop and close it.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.j.tools/tools/secure/freeze-account.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
