---
title: "Blacklist Tracker Changelog"
canonical: "https://pharos.watch/methodology/blacklist-tracker-changelog/"
description: "Blacklist Tracker Changelog - Pharos methodology version history."
---

# Blacklist Tracker Changelog

## v3.9972 - Actionable data-quality warning scope

**Effective:** 2026-07-01

Scopes FreezeWatch data-quality warnings to actionable degraded conditions instead of treating permanent historical limitations, deferred coverage inventory, or old resolved ledger snapshots as stale failures.

- Resolved freeze-ledger snapshots keep their age diagnostics in `freezeLedgerMeta` without opening the stale warning banner solely because the snapshot is old
- Permanently unavailable amount rows remain visible as audit limitations but no longer count as warning-level amount gaps
- Deferred coverage configs remain exposed in coverage metadata without degrading the public FreezeWatch summary by themselves

## v3.9971 - Legacy derived-zero retry ceiling

**Effective:** 2026-06-23

Bounds historical amount recovery for legacy derived-zero EVM rows so unrecoverable rows stop consuming provider backfill budget every sync-blacklist run.

- Legacy derived-zero EVM rows are selected for recovery only while below the three-attempt ceiling
- Rows that still cannot be recovered on the final attempt are marked `permanently_unavailable` while retaining the legacy amount/source for audit context
- The regular recoverable/provider/ambiguous amount-gap lane remains unchanged and still runs before legacy derived-zero retries

## v3.997 - Same-cycle freeze snapshot capture

**Effective:** 2026-06-06

Captures freeze-ledger snapshots for blacklist events seen in the same cron batch even when a later unblacklist event is also ingested.

- Same-batch blacklist -> unblacklist sequences now still fetch a current-balance snapshot for the freeze ledger
- Later unblacklist rows remain non-deleting release markers, preserving the existing historical ledger semantics
- The change is scoped to rows observed in the current ingestion/repair batch and does not backfill older transient freezes by itself

## v3.996 - Fresh price-cache valuation gate

**Effective:** 2026-06-06

Requires non-USD blacklist ledger USD conversions to use a fresh price-cache row instead of silently reusing stale cached prices.

- A7A5, EURC, BRZ, EURI, TGBP, EURCV, JPYC, PAXG, XAUT, and XAUM freeze-ledger USD values now require a positive `price_cache` row newer than the 6-hour replay budget
- Stale or malformed conversion prices leave `amountUsd` unresolved so existing amount-gap status and remediation paths remain visible
- Current-balance snapshots, duplicate-row repair, fresh ingestion, and admin amount-gap remediation share the same freshness gate through the blacklist price-cache reader

## v3.995 - Full unfreezable set re-audit

**Effective:** 2026-05-25

Re-audits every active stablecoin that resolved to `No` after the four-status FreezeWatch migration, correcting direct freeze, possible-control, and upstream reserve/redemption exposure.

- M by M0, ISC, and USG move from `No` to `Yes` based on Solana freeze authority or arbitrary holder-burn evidence
- DLLR, FXD, CJPY, USDQ, and USDK move to `Possible` where mutable proxy, pause, manager-burn, or protocol-control paths exist without confirmed active blacklist functions
- JUSD, SILK, NXUSD, LUAUSD, KRWO, and BNUSD move to `Upstream` through stablecoin reserves, DAI collateral, Open Voucher redemption rails, or Stability Fund stablecoin collateral
- Curated upstream reviews are honored even for centralized assets when no direct holder-token freeze surface is identified and the exposure sits in backing or redemption rails

## v3.994 - Four-status FreezeWatch exposure model

**Effective:** 2026-05-24

Removes the Dilutable bucket from FreezeWatch so the surface reports holder-freeze, upstream-block, possible-control, and no-resolved-freeze exposure only. Privileged mint authority remains available through the separate Mint Authority review.

- The public `/freezewatch` exposure summary now uses Yes, Upstream, Possible, and No
- Freezable market-cap totals no longer include pure admin-mint dilution risk
- Former Dilutable assets are re-reviewed under freeze-only semantics and retain supply-control context in Mint Authority

## v3.993 - FreezeWatch rebrand and primary-nav promotion

**Effective:** 2026-05-12

Promotes the Blacklist Tracker surface to a primary navigation hero under the FreezeWatch name, adding three issuer-sovereignty visualizations (Freezable Supply Meter, Intervention Seismograph, Sovereignty Lattice) above the existing intervention ledger. Event ingestion, status resolution, and the underlying coverage manifest are unchanged.

- Page moved from `/blacklist/` to `/freezewatch/` with a 301 redirect; sitemap priority raised to 0.85
- Primary navigation gains a 7th entry (`FreezeWatch`), replacing the `Blacklist` entry in the TRACK group
- User-facing copy on the surface refers to freeze interventions and issuer freezes; internal data model, table names, cron jobs, and API endpoints continue to use the `blacklist` term
- Three new client-side components render above the legacy intervention ledger: Freezable Supply Meter (sovereignty headline), Intervention Seismograph (quarterly cadence), Sovereignty Lattice (issuer × chain coverage grid)
- Analytics page identifier changed from `blacklist` to `freezewatch` for filter, sort, and search events emitted by the page

## v3.992 - Public contract clarification

**Effective:** 2026-05-11

Clarifies the public blacklist contract without changing event ingestion: `/blacklist` status charts use the five-status model, CSV export covers the currently loaded table page, `/api/blacklist-summary` distinguishes legacy active-state fields from tracked freeze-ledger fields, coverage counts are manifest-derived, and chain identifiers are documented as `chainId` response/join fields rather than the `chain` display-name filter.

- The blacklist exposure model is documented as Yes, Dilutable, Upstream, Possible, and No
- Reserve, backing, custody, parent-asset, and CEX/custody-rail exposure resolve to Upstream through the any-reserve policy instead of Possible
- `/blacklist` CSV export is documented as the current server-returned page after filters, sorting, search, and pagination
- `/api/blacklist-summary` consumers are directed to `trackedAddressCount`, `trackedFrozenTotal`, and `trackedAmountGapCount`; legacy `active*` fields remain for local net-active state-machine compatibility
- Coverage docs now treat deferred config counts as runtime-manifest-derived and document the required coverage fields, including `chainId`

## v3.991 - Public transparency and snapshot semantics

**Effective:** 2026-05-05

Clarifies public API artifacts, UI provenance, and freeze-ledger snapshot semantics without changing event ingestion. `/api/blacklist` integration examples now use uppercase tracker symbols, frozen totals are labeled as last-known successful snapshots, and Tron missing-balance behavior is documented as provider-missing rather than false zero.

- OpenAPI/Postman document `/api/blacklist?stablecoin=` as an uppercase blacklist-tracker symbol filter
- Blacklist UI/CSV surfaces amount source/status plus contract/config/event provenance
- Public frozen totals are presented as last-known successful freeze-ledger snapshots, with provider failures preserving the previous successful value
- New freeze-ledger snapshots are described as contract/config scoped, with legacy symbol/chain/address fallback for older rows
- Tron missing account/token-balance data remains null/provider-missing instead of being converted to zero

## v3.99 - Same-run Tron ledger reconciliation

**Effective:** 2026-04-21

Reapplies the Tron freeze-ledger mirror after current-balance cache writes so newly ingested Tron blacklist rows resolve in the same `sync-blacklist` cycle, and aligns admin recovery guidance away from destructive sync resets for generic amount-gap warnings.

- Fresh Tron blacklist/unblacklist rows no longer wait for the next 6-hour cron cycle before `current_balance_snapshot` amounts appear on matching event rows
- The admin current-balance backfill action now re-applies the Tron ledger mirror after rebuilding `blacklist_current_balances`
- Blacklist-gap recommendations now prioritize balance backfill, sync-state inspection, and targeted remediation ahead of `reset-blacklist-sync`

## v3.98 - USDA destroy-event correction

**Effective:** 2026-04-20

Narrows Avalon USDa event tracking to the two events its verified contract actually emits: AddedBlackList(address) and RemovedBlackList(address). USDa remains directly freezable and role-burnable, but it no longer subscribes to Tether's DestroyedBlackFunds(address,uint256) topic because the verified USDa ABI/source does not expose that event.

- USDA blacklist/unblacklist event ingestion remains unchanged
- USDA no longer advertises or scans a non-existent DestroyedBlackFunds event in CONTRACT_CONFIGS
- The report-card and blacklistability metadata still mark USDA as directly freezable because isBlackListed gates transfers and manager-controlled add/remove blacklist functions exist
- Role-gated burn(address,uint256) is documented as a privileged destroy capability, but not mapped to blacklist-tracker destroy rows without a dedicated destroy event

## v3.97 - Status amount-gap tolerance

**Effective:** 2026-04-19

Keeps isolated recent blacklist amount gaps below the incident threshold so a single unresolved provider/parser miss among thousands of events remains visible in diagnostics without degrading `/status` or `/admin` health.

- Recent amount gaps now need at least 5 rows in the 24-hour monitoring window before data quality degrades
- The stale threshold remains unchanged at 25 recent gaps or a 2% missing-amount ratio
- The ratio-based degraded threshold remains 1%, so broad amount-attribution failures still surface promptly

## v3.96 - Gentle amount-gap recovery acceleration

**Effective:** 2026-04-18

Unblocks the EVM amount recovery lane by excluding Tron rows that are owned by the separate Tron ledger mirror, and raises the per-run recovery cap from 50 to 100 rows while staying inside the 6-hour sync cadence, D1 batch helper, rate limiters, and 900-subrequest run budget.

- EVM historical amount gaps no longer wait behind recent Tron pending rows in the per-row recovery selection
- Amount recovery now processes up to 100 rows per 6-hour sync-blacklist run instead of 50
- The acceleration remains bounded by the existing 7-minute sync runtime budget, 900-subrequest cap, and shared D1 batch chunking

## v3.95 - Tier-1 coverage expansion

**Effective:** 2026-04-17

Adds eleven new tracked stablecoins across four new event families and six existing families. TUSD joins through a new TRUEUSD_EVENT_FAMILY that discriminates blacklist vs unblacklist via the bool at data slot 0 through the new BlacklistEventDef.eventTypeFromDataBoolIndex extension. JPYC adds CENTRE_BLOCKLISTED_FAMILY (Blocklisted/UnBlocklisted), FRXUSD adds FRAX_FREEZE_FAMILY (AccountFrozen/AccountThawed with non-indexed address), EURCV adds SOCGEN_FREEZE_FAMILY (batch AddressesFrozen/AddressesUnFrozen), NUSD adds NEUTRL_DENYLIST_FAMILY, and FIDD adds FIDELITY_RESTRICTION_FAMILY (TransferRestrictionImposed/Removed). USDA joins through legacy AddedBlackList/RemovedBlackList signatures, while USAT, AEUR, XUSD, and XAUM reuse existing families. Several BSC/Avalanche/Base deployments remain deferred pending block-explorer API access, and apxUSD is intentionally deferred because the verified ABI exposes no direction discriminator.

- Added TUSD on Ethereum (TRUEUSD_EVENT_FAMILY with bool-discriminator Blacklisted(address,bool) + DestroyedBlackFunds)
- Added NUSD on Ethereum (NEUTRL_DENYLIST_FAMILY: AddedToDenylist / RemovedFromDenylist)
- Added EURCV on Ethereum (SOCGEN_FREEZE_FAMILY: batch AddressesFrozen(address[]) / AddressesUnFrozen(address[]))
- Added USDA on Ethereum using legacy AddedBlackList / RemovedBlackList signatures; USAT on Ethereum reusing USDT0 family; AEUR on Ethereum reusing DUAL_INDEX_FREEZE family
- Added XUSD on Ethereum + BSC reusing the Circle USDC blacklist family; XAUm on Ethereum + BSC reusing the USDT0 family
- Added JPYC on Ethereum + Polygon (CENTRE_BLOCKLISTED_FAMILY: Blocklisted / UnBlocklisted)
- Added FRXUSD on Ethereum (FRAX_FREEZE_FAMILY: AccountFrozen / AccountThawed with addressDataIndex=0)
- Added FIDD on Ethereum (FIDELITY_RESTRICTION_FAMILY: TransferRestrictionImposed / TransferRestrictionRemoved)
- BSC / Avalanche / Base deployments for TUSD, USDA, AEUR, JPYC, AID, TGBP deferred pending Etherscan v2 free-tier contract-creation coverage for those chains
- apxUSD deferred: verified ABI emits a single event without a direction discriminator

## v3.94 - Correctness + efficiency + minor coverage gaps

**Effective:** 2026-04-17

Worker correctness fixes (Gnosis dRPC 9k-block scan cap, dual-index-freeze family split from WLFI destroy events, TronGrid failure propagation to the circuit breaker, EURC mirror-zero rows locked to permanently_unavailable, address[] expansion capped, Tron maxBlock cursor init), five D1 migrations (derived-row reset, sync_state dedup, EURC mirror-zero stamp, blacklist_events index adjustments, amount-status backfill), summary endpoint rewritten to aggregate in SQL with post-fetch counters inlined, frontend polish (data-driven stats strip, amount-status badge, per-coin stat border, CSV column split, page-clamp + filter-reset coverage), and minor chain-coverage additions (Polygon USDQ, Arbitrum AID, Polygon TGBP; Base AID plus Base/BSC TGBP remain deferred).

- Gnosis BRZ scans now stay within the dRPC free-tier 10k-block cap and drain the ~12.5M-block backlog that previously masked 2 missed events
- FDUSD / EURI / AEUR configs use DUAL_INDEX_FREEZE_EVENT_FAMILY without inheriting WLFI FrozenAccountDrained / FrozenFundsReallocated topics they cannot emit
- TronGrid outages now throw through the per-config circuit breaker instead of silently returning empty arrays
- EURC rows flagged as circle_mirror_zero_balance are stamped amount_status='permanently_unavailable' and no longer re-enter the recoverable-pending backfill pool
- Batch address[] events (USDtb, AID, EURCV) apply a per-log row cap so a single malformed payload cannot blow out the write batch
- Tron sync cursor initialises from max(block_number) for legacy configs that were left at 0
- Five D1 migrations applied: 0100 dedup mixed-case blacklist_sync_state keys, 0101 reset legacy derived amount rows, 0102 Gnosis BRZ cursor reseed, 0103 backfill + API composite indexes, 0104 stamp EURC mirror-zero rows as permanently_unavailable
- /api/blacklist-summary aggregates quarterly chart points and per-coin counts in SQL, dropping summary-endpoint memory from ~5-10MB to a few KB per cache miss
- Frontend: data-driven stats strip + amount-status badge, per-coin stat border rendered via inline style, CSV splits native / unit / USD / status columns, page-clamp + zero-total + filter-reset covered by tests
- Three new chain-coverage rows for existing coins: Polygon USDQ, Arbitrum AID, and Polygon TGBP; Base AID plus Base/BSC TGBP remain deferred

## v3.93 - Backlog-safe scanner guardrails

**Effective:** 2026-04-16

Keeps EVM sync cursors pinned when the subrequest budget is exhausted before every configured event topic is scanned, marks budget-exhausted runs as degraded, and lowers the duplicate-row check chunk below D1's practical SQL-variable ceiling.

- Partial multi-topic EVM scans no longer advance cursors past unscanned topics
- Runs that skip configs after exhausting the subrequest budget now surface as degraded instead of ok
- Duplicate-row checks use smaller D1-safe chunks for high-row event batches

## v3.92 - Amount attribution: Tron ledger mirror + derived-zero recovery

**Effective:** 2026-04-16

Introduces current_balance_snapshot amount source for Tron freeze-ledger mirroring, widens backfill to include legacy derived-zero EVM rows, and adds provenance badge for snapshot-sourced amounts.

- Tron USDT blacklist/unblacklist rows receive amounts from the freeze-ledger snapshot (~6,921 rows)
- Legacy derived-zero EVM rows re-enter the backfill pool (~4,381 rows)
- Snapshot badge renders on amounts sourced from current_balance_snapshot

## v3.91 - Coverage quality + USDP addition

**Effective:** 2026-04-16

Extends wlfi-freeze family with FrozenAccountDrained/FrozenFundsReallocated destroy events (USD1/U/FDUSD/EURI), adds USDP Paxos coverage on Ethereum, and corrects Arbitrum FDUSD/AUSD/BUIDL startBlocks.

- Added FrozenAccountDrained + FrozenFundsReallocated destroy tracking for USD1/U/FDUSD/EURI
- Added USDP (Pax Dollar) Ethereum coverage via Paxos freeze family (65 existing events)
- Corrected Arbitrum startBlocks for FDUSD/AUSD/BUIDL to actual deployment blocks

## v3.9 - Direct EVM coverage wave

**Effective:** 2026-04-15

Adds direct EVM blacklist/freeze coverage for FDUSD, BRZ, AUSD, MNEE, EURI, USDQ, USDO, USDX, AID, TGBP, and EURC, plus BUIDL seize-only tracking. Introduces indexed amount-topic parsing, explicit data-slot extraction for omnibus seize events, EURC mirror-zero suppression, and expanded non-USD valuation.

- Added FDUSD Ethereum/BSC/Arbitrum dual-index Freeze/Unfreeze tracking
- Added BRZ Ethereum/Gnosis, AUSD Arbitrum/Base, EURI Ethereum/BSC, USDQ Ethereum, USDO Ethereum/Base, USDX Ethereum, AID Ethereum, TGBP Ethereum/Avalanche, and EURC Ethereum/Base/Avalanche event coverage
- Added MNEE Ethereum freeze/unfreeze plus confiscation/burn tracking with indexed amount extraction
- Extended price-cache USD conversion to EURC, BRZ, EURI, and TGBP
- Added suppression metadata so Circle mirror-zero EURC rows stay auditable without entering public aggregates
- Added BUIDL Securitize Seize/OmnibusSeize tracking as destroy/seized-value events

## v3.8 - First-wave CeFi coverage expansion

**Effective:** 2026-04-15

Expands blacklist/freeze tracking to first-wave centralized issuers with verified event surfaces: USDG, RLUSD, U, USDtb, and A7A5. Adds batch address-array parsing and non-USD A7A5 price-cache valuation while keeping clawback, allowlist/KYC, and non-EVM surfaces out of this release.

- Added USDG Ethereum FreezeAddress/UnfreezeAddress/FrozenAddressWiped coverage using the Paxos pattern
- Added RLUSD Ethereum AccountPaused/AccountUnpaused coverage; clawback remains out of scope until transaction-input classification exists
- Added U Ethereum and BSC Freeze/Unfreeze coverage using the dual-indexed address pattern
- Added USDtb Ethereum AccountsBlocked/AccountsUnblocked coverage with one row per address in batch events
- Added A7A5 Ethereum Blacklisted/DeBlacklisted/DestroyedBlackFunds coverage with price-cache USD conversion for the RUB-pegged token

## v3.7 - Balance recovery accuracy and provider resilience

**Effective:** 2026-04-08

Remediates 16 audit findings across the balance recovery pipeline, freeze-ledger cache, and aggregation layer. Eliminates silent wrong-data paths, adds Ethereum mainnet dRPC/chain-RPC fallback, and fixes gold stablecoin USD conversion in all enrichment paths.

- Invalid block tags now return null instead of silently querying latest balance (Critical)
- Ethereum mainnet historical balance lookups now fall through dRPC and chain-RPC before Etherscan (Critical)
- Tron REST API returns null for missing token entries instead of false zero (Major)
- PAXG/XAUT events now receive USD conversion in enrichment and backfill paths (Major)
- Zero-balance override restricted to gold stablecoins only, preventing false non-zero cache entries (Major)
- XAUT now uses its own price entry instead of PAXG price (Major)
- Destroyed records excluded from activeFrozenTotal (Major)
- New Tron blacklist/unblacklist events immediately marked permanently_unavailable (Major)

## v3.6 - Freeze-ledger quarter attribution for the public chart

**Effective:** 2026-03-27

The public blacklist chart now buckets the persistent freeze ledger by blacklist quarter instead of summing raw event-time blacklist rows, so the quarterly bars explain the same tracked frozen total shown in the summary cards.

- The `/api/blacklist-summary` chart now draws from `blacklist_current_balances` rather than raw `blacklist_events` intake amounts
- Each tracked balance is attributed to the latest recorded blacklist event for the same stablecoin/chain/address identity so re-blacklisted rows follow the active freeze cycle represented in the ledger
- Rows without a local blacklist timestamp fall back to the latest related event timestamp, then snapshot observation time, so tracked ledger value is not silently dropped from the chart

## v3.5 - Persistent freeze-ledger snapshots and bootstrap reconciliation

**Effective:** 2026-03-27

The public frozen-total summary now uses a persistent freeze ledger instead of treating snapshot balances as a live current-state cache. Historical ETH/USDC, ETH/USDT, and TRON/USDT freeze rows were reconciled from the kyc.rip / stables.rip bootstrap so seized-and-burned balances remain visible after later unblacklist or destroy actions.

- Added tracked freeze-ledger metrics (`trackedAddressCount`, `trackedFrozenTotal`, `trackedAmountGapCount`) to blacklist summary responses
- Snapshot rows are now preserved across later unblacklist events instead of being deleted as if they were only live current balances
- Destroy events now persist their seized amount into the freeze ledger so burned balances remain counted
- Historical freeze-ledger bootstrap was reconciled against the external kyc.rip / stables.rip dataset for ETH USDC, ETH USDT, and TRON USDT

## v3.4 - Active frozen-total ledger and Tron current-balance separation

**Effective:** 2026-03-27

Blacklist summary now distinguishes event-time amounts from active frozen balances, adds a dedicated current-balance cache for active blacklist records, and stops treating legacy Tron derived event amounts as authoritative history.

- Added `blacklist_current_balances` for current active blacklist balance snapshots
- Blacklist summary gained active-record metrics (`activeAddressCount`, `activeFrozenTotal`, `activeAmountGapCount`)
- Active Tron totals now prefer current TRC20 balances for active blacklist rows and destroy-event amounts when funds were seized and burned
- Legacy Tron `derived` blacklist/unblacklist event amounts are reset instead of being reused as event-time history

## v3.3 - pyUSD and USD1 blacklist tracking coverage

**Effective:** 2026-03-24

Extended blacklist tracker to cover pyUSD (PayPal/Paxos) on Ethereum and Arbitrum, and USD1 (World Liberty Financial) on Ethereum, BSC, and Tron. Introduced configurable address topic index for two-indexed-address events.

- Added pyUSD FreezeAddress/UnfreezeAddress/FrozenAddressWiped event tracking (Paxos PaxosTokenV2 pattern)
- Added USD1 Freeze/Unfreeze event tracking with addressTopicIndex=2 for dual-indexed events
- EVM parser now supports configurable topic index for affected address extraction
- Tron parser extended with tronResultKey for non-standard event parameter names
- Aggregation layer (chart, summary stats) made dynamic to accommodate new stablecoins

## v3.2 - Provenance-aware rows and explicit amount semantics

**Effective:** 2026-03-24

Blacklist rows now persist emitting-contract provenance and explicit native/USD amount status fields so reprocessing and public consumers no longer rely on implicit inference.

- Rows now store config/contract provenance plus event signature metadata
- Amount semantics split into token-native and USD-at-event fields with explicit source/status flags
- Gap monitoring now tracks recoverable attribution failures rather than nullable amounts alone

## v3.1 - API-error-aware sync cursor protection

**Effective:** 2026-02-25

EVM scanning now distinguishes API failure from genuine no-event ranges so cursors do not advance on unreliable reads.

- EVM log fetching differentiates API failures (`null`) from valid empty responses (`[]`)
- On API failure, sync state is held and retried on the next cycle instead of advancing
- Metadata now reports `apiErrors` for operational observability

Commits: `d40060a`

## v3.0 - Indexer-lag safety margins for cursor advancement

**Effective:** 2026-02-25

Head advancement added explicit safety buffers to prevent permanently skipping late-indexed explorer events.

- EVM no-event advancement now uses `head - safetyMargin` instead of raw head
- Tron no-event advancement now uses `now - 15m` instead of wall-clock `now`
- Reduces permanent event loss when explorer indexing lags chain tip

Commits: `e6de7eb`

## v2.2 - Precision and integrity hardening

**Effective:** 2026-02-18

Amount math and log parsing were hardened to reduce silent corruption and improve sync telemetry.

- Token amounts switched to BigInt-safe decimal conversion to avoid large-value precision loss
- Malformed EVM logs (invalid block/timestamp) are discarded instead of being inserted
- Sync now emits structured run metadata (`itemCount`, `contractsSkipped`, budget usage)

Commits: `c6c1391`, `7bc5361`, `e950f76`

## v2.1 - Pre-block balance sampling and zero-amount recovery

**Effective:** 2026-02-18

Balance attribution moved to pre-event block semantics, and backfill began explicitly reprocessing suspicious zero blacklist amounts.

- Balance enrichment samples `blockNumber - 1` for blacklist, unblacklist, and destroy
- Backfill now re-attempts rows with `amount = 0` for blacklist events
- Reduces same-block ordering artifacts that previously produced false zeros

Commits: `d7e0ad4`

## v2.0 - L2 balance reliability and budgeted full-scan loop

**Effective:** 2026-02-12

Major tracking architecture shift for L2 correctness and deterministic scan coverage under strict subrequest budgets.

- Introduced shared per-run subrequest budgeting with least-synced-first config ordering
- L2 balance sourcing evolved from Etherscan-only to RPC/dRPC archive-aware historical balance fetches
- Backfill moved ahead of incremental scan and EVM head caching reduced redundant rescans

Commits: `58c4f05`, `77dad70`, `28a7ead`, `add68dc`, `fb7e7d6`, `7d9e677`

## v1.2 - Coverage expansion: USDT0 and gold contract families

**Effective:** 2026-02-11

Expanded event coverage beyond legacy USDT/USDC patterns and fixed multiple cross-chain parsing mismatches.

- Added USDT0 event signatures and indexed-address parsing for upgraded Tether contracts
- Added PAXG and XAUT contract/event support with contract-specific mappings
- Per-contract decimals and Tron `0x -> 41` address normalization improved amount fidelity

Commits: `b257569`, `9281531`, `eeb92e9`, `2fd5065`, `29a4759`

## v1.1 - Ingestion-time enrichment and backfill foundation

**Effective:** 2026-02-11

Blacklist rows began storing balance context during ingestion, with a companion path for retroactive recovery of missing amounts.

- Blacklist/unblacklist rows are enriched with token balances before insert
- Backfill pipeline introduced for historical rows missing amount values
- Set groundwork for later destroy-event amount recovery hardening

Commits: `1dec7aa`

## v1.0 - Initial Blacklist Tracker release

**Effective:** 2026-02-09

Launched multi-chain blacklist event ingestion, persistence schema, public API, and dashboard surface.

- Initial incremental EVM + Tron event sync for major fiat-backed stablecoins
- Introduced `blacklist_events` and `blacklist_sync_state` tables
- Exposed tracker data through `/api/blacklist` and frontend event views

Commits: `093c11e`, `ea9dbab`, `5158601`, `ac0d823`
