Transparency

Methodology

FreezeWatch indexes stablecoin blacklist events directly from public blockchain data. This page explains exactly how we collect, process, and display that data — including every assumption we make and every limitation you should be aware of.

Data sources

All data displayed on FreezeWatch is derived exclusively from on-chain event logs emitted by the official stablecoin smart contracts on Ethereum mainnet. We do not use any off-chain data feeds, issuer APIs, or third-party databases. Every record is verifiable by anyone on a public block explorer.

USDC (Ethereum Mainnet)

Contract0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Event sourceERC-20 event logs: Blacklisted, UnBlacklisted
IssuerCircle Internet Financial

USDT (Ethereum Mainnet)

Contract0xdAC17F958D2ee523a2206206994597C13D831ec7
Event sourceERC-20 event logs: AddedBlackList, RemovedBlackList
IssuerTether Limited

FreezeWatch currently covers Ethereum mainnet only. USDT on Tron, Solana, BNB Chain, and other networks is not indexed. See Known limitations for details.

Event types we index

We listen to four distinct event signatures — two per token. Each event is stored with its block number, block timestamp, transaction hash, the affected address, and the USDC/USDT balance held by that address at the time of the event.

USDC

Blacklistedfreeze

Emitted when Circle's blacklister calls blacklist(address). The target address can no longer send or receive USDC.

UnBlacklistedunfreeze

Emitted when Circle calls unBlacklist(address). Full USDC access is restored to the address.

USDT

AddedBlackListfreeze

Emitted when Tether's owner calls addBlacklist(address). The target address is frozen and cannot transact with USDT.

RemovedBlackListunfreeze

Emitted when Tether calls removeBlacklist(address). The address is restored to normal USDT functionality.

Note: USDC's wipeFrozenAddress function (which permanently destroys a blacklisted address's balance) does not emit a dedicated event in the contract's ABI. We do not track wipe events separately; they appear only as an on-chain state change visible via balance queries.

Wallet status logic

A wallet's current blacklist status is derived from its most recent event per token — not from a live on-chain query. Specifically:

Currently blacklisted

The most recent event for this address on a given token is a freeze-type event (Blacklisted or AddedBlackList), ordered by block number descending, then by event ID descending for same-block tie-breaking.

Previously blacklisted (removed)

The most recent event is an unfreeze-type event (UnBlacklisted or RemovedBlackList). The address was once frozen but access has since been restored.

Never blacklisted

No blacklist events exist for this address in our database. The address has a clean on-chain record on Ethereum mainnet.

Address matching is case-insensitive. Entering an address in any mix of upper or lower case will return the same result. ENS names are not resolved — enter the raw hex address.

Balance tracking

When a blacklist event is detected, we query the stablecoin contract for the balance held by the affected address at that block height and store it alongside the event. This snapshot-at-freeze-time approach is used for all balance figures displayed on FreezeWatch.

Important: Displayed balances represent the amount held at the time of the freeze, not the current live balance. An address may have received additional stablecoins before being frozen, or had its balance wiped by wipeFrozenAddress. The displayed figure should be treated as an approximation of the frozen amount, not a guaranteed exact current balance.

Balances are stored in raw token units (6 decimals for both USDC and USDT) and converted to a human-readable USD-equivalent figure for display. Because both tokens maintain a 1:1 peg with the U.S. dollar, no external price oracle is used — 1 USDC = $1.00 and 1 USDT = $1.00 for all balance calculations.

Metrics & calculations

All aggregated metrics shown across FreezeWatch are computed directly from theblacklist_eventstable in our PostgreSQL database. Below is how each key metric is defined.

Total frozen (USD)

Sum of balance_formatted for all freeze-type events across all time. Each freeze event contributes its snapshot balance once. Addresses that were frozen, unfrozen, and re-frozen contribute their balance on each individual freeze event.

Wallets ever frozen

Count of distinct addresses that have ever appeared in a freeze-type event, regardless of whether the freeze is still active.

Currently frozen

Count of distinct addresses whose most recent event (per token) is a freeze-type event. This is a live count of actively blacklisted wallets.

Reversal rate

Percentage of wallets ever frozen whose current status is unfrozen (i.e., the most recent event is an unfreeze). Calculated as: (wallets currently unfrozen) ÷ (wallets ever frozen) × 100.

Cumulative frozen supply chart

Monthly totals of freeze-type event balances, accumulated over time per token. Months with no events are forward-filled with the previous month's cumulative value. Values are expressed in millions of USD.

Top wallets

Ranked by the peak balance_formatted value across all freeze-type events for that address. If a wallet was frozen multiple times, the highest balance snapshot is used. Current status (active/removed) reflects the most recent event.

Median days frozen

For wallets that have been both frozen and later unfrozen, we compute the duration in days between the first freeze timestamp and the first subsequent unfreeze timestamp. The median across all such wallets is reported.

Freeze size distribution

Count of freeze-type events bucketed by balance_formatted: $0, <$1K, $1K–$10K, $10K–$100K, $100K–$1M, >$1M.

Data freshness

FreezeWatch combines server-side caching with near-real-time event indexing to balance performance with accuracy.

On-chain indexing

Near real-time

Our indexer monitors the Ethereum blockchain for new blacklist events and writes them to the database shortly after each block is confirmed. New events typically appear in the database within a few minutes of the on-chain transaction.

Home page & statistics

60-second cache

Aggregate statistics and charts are revalidated every 60 seconds using Next.js Incremental Static Regeneration (ISR). You may see data up to 60 seconds behind the latest indexed event.

Wallet checker

On demand

Wallet status lookups query the database live on each request, subject to API rate limiting. Results reflect the most recently indexed event for the queried address.

Blacklist explorer

On demand

The full blacklist table is queried live on each page load and filter change, also subject to rate limiting.

Known limitations

We aim to be fully transparent about what FreezeWatch does not cover and where the data may be incomplete or imprecise.

Ethereum mainnet only

We index USDC and USDT events on Ethereum mainnet only. USDT on Tron (where the majority of USDT freezes historically occur), USDT on BNB Chain, USDC on Base, Arbitrum, Solana, and other deployments are not currently indexed. Statistics on this site are therefore a subset of global blacklist activity.

Balances are snapshots, not live

The USD balance shown for each freeze event is a snapshot of the balance at the time of indexing, not a live on-chain query. Subsequent wipes (wipeFrozenAddress / destroyBlackFunds) are not reflected in the stored balance figure.

Wipe events are not separately tracked

The wipeFrozenAddress (USDC) and destroyBlackFunds (USDT) functions do not emit a standardized event that we currently index. Fund destruction is not counted as a separate event type in our database.

ENS and label resolution

We store and display raw hex addresses. We do not resolve ENS names, exchange labels, or any other off-chain identity layer. Contextual information about who an address belongs to is not provided.

No attribution to legal reasons

We do not know — and do not speculate about — the legal reason behind any specific freeze. Reasons may include sanctions compliance, law enforcement requests, fraud, or error. We present on-chain facts only.

Historical completeness

Our index begins from the genesis of each token contract. However, there may be minor gaps if our indexer experienced downtime and events were missed during reindexing. We periodically backfill to ensure completeness.

Our principles

All data is sourced from public blockchains. We present what is on-chain — nothing more.

We do not speculate about the identity or motivation of any flagged address.

We do not accept payment to add or remove addresses from our index.

We are not affiliated with Circle, Tether, or any stablecoin issuer.

If you believe a record in our index is factually incorrect, contact us.

Explore the data

Every event in our index is publicly verifiable on Etherscan. Browse the full blacklist or check any wallet address.