Skip to main contentSkip to data table
Pharos
PHAROSlive stablecoin signals

Blacklist Tracker Changelog

Full version history of Blacklist Tracker methodology decisions, from v1.0 to v3.997.

Latest Version

v3.997Jun 6, 2026

Same-cycle freeze snapshot capture

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

Impact Snapshot

  • 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.997Jun 6, 2026

Same-cycle freeze snapshot capture

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
Details

Impact Notes

  • 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
Commit provenance not recorded
    v3.996Jun 6, 2026

    Fresh price-cache valuation gate

    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
    Details

    Impact Notes

    • 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
    Commit provenance not recorded
      v3.995May 25, 2026

      Full unfreezable set re-audit

      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
      Details

      Impact Notes

      • 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
      Commit provenance not recorded
        v3.994May 24, 2026

        Four-status FreezeWatch exposure model

        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
        Details

        Impact Notes

        • 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
        Commit provenance not recorded
          v3.993May 12, 2026

          FreezeWatch rebrand and primary-nav promotion

          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)
          Details

          Impact Notes

          • 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
          Commit provenance not recorded
            v3.992May 11, 2026

            Public contract clarification

            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
            Details

            Impact Notes

            • 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`
            Commit provenance not recorded
              v3.991May 5, 2026

              Public transparency and snapshot semantics

              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
              Details

              Impact Notes

              • 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
              Commit provenance not recorded
                v3.99Apr 21, 2026

                Same-run Tron ledger reconciliation

                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`
                Details

                Impact Notes

                • 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`
                Commit provenance not recorded
                  v3.98Apr 20, 2026

                  USDA destroy-event correction

                  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
                  Details

                  Impact Notes

                  • 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
                  Commit provenance not recorded
                    v3.97Apr 19, 2026

                    Status amount-gap tolerance

                    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
                    Details

                    Impact Notes

                    • 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
                    Commit provenance not recorded
                      v3.96Apr 18, 2026

                      Gentle amount-gap recovery acceleration

                      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
                      Details

                      Impact Notes

                      • 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
                      Commit provenance not recorded
                        v3.95Apr 17, 2026

                        Tier-1 coverage expansion

                        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
                        Details

                        Impact Notes

                        • 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
                        Commit provenance not recorded
                          v3.94Apr 17, 2026

                          Correctness + efficiency + minor coverage gaps

                          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
                          Details

                          Impact Notes

                          • 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
                          Commit provenance not recorded
                            v3.93Apr 16, 2026

                            Backlog-safe scanner guardrails

                            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
                            Details

                            Impact Notes

                            • 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
                            Commit provenance not recorded
                              v3.92Apr 16, 2026

                              Amount attribution: Tron ledger mirror + derived-zero recovery

                              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
                              Details

                              Impact Notes

                              • 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
                              Commit provenance not recorded
                                v3.91Apr 16, 2026

                                Coverage quality + USDP addition

                                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
                                Details

                                Impact Notes

                                • 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
                                Commit provenance not recorded
                                  v3.9Apr 15, 2026

                                  Direct EVM coverage wave

                                  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
                                  Details

                                  Impact Notes

                                  • 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
                                  Commit provenance not recorded
                                    v3.8Apr 15, 2026

                                    First-wave CeFi coverage expansion

                                    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
                                    Details

                                    Impact Notes

                                    • 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
                                    Commit provenance not recorded
                                      v3.7Apr 8, 2026

                                      Balance recovery accuracy and provider resilience

                                      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)
                                      Details

                                      Impact Notes

                                      • 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)
                                      Commit provenance not recorded
                                        v3.6Mar 27, 2026

                                        Freeze-ledger quarter attribution for the public chart

                                        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
                                        Details

                                        Impact Notes

                                        • 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
                                        Commit provenance not recorded
                                          v3.5Mar 27, 2026

                                          Persistent freeze-ledger snapshots and bootstrap reconciliation

                                          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
                                          Details

                                          Impact Notes

                                          • 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
                                          Commit provenance not recorded
                                            v3.4Mar 27, 2026

                                            Active frozen-total ledger and Tron current-balance separation

                                            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
                                            Details

                                            Impact Notes

                                            • 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
                                            Commit provenance not recorded
                                              v3.3Mar 24, 2026

                                              pyUSD and USD1 blacklist tracking coverage

                                              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
                                              Details

                                              Impact Notes

                                              • 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
                                              Commit provenance not recorded
                                                v3.2Mar 24, 2026

                                                Provenance-aware rows and explicit amount semantics

                                                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
                                                Details

                                                Impact Notes

                                                • 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
                                                Commit provenance not recorded
                                                  v3.1Feb 25, 2026Reconstructed

                                                  API-error-aware sync cursor protection

                                                  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
                                                  Details

                                                  Impact Notes

                                                  • 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
                                                  Reconstructed from git commit history.1 commit
                                                  • d40060a
                                                  v3.0Feb 25, 2026Reconstructed

                                                  Indexer-lag safety margins for cursor advancement

                                                  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
                                                  Details

                                                  Impact Notes

                                                  • 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
                                                  Reconstructed from git commit history.1 commit
                                                  • e6de7eb
                                                  v2.2Feb 18, 2026Reconstructed

                                                  Precision and integrity hardening

                                                  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)
                                                  Details

                                                  Impact Notes

                                                  • 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)
                                                  Reconstructed from git commit history.3 commits
                                                  • c6c1391
                                                  • 7bc5361
                                                  • e950f76
                                                  v2.1Feb 18, 2026Reconstructed

                                                  Pre-block balance sampling and zero-amount recovery

                                                  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
                                                  Details

                                                  Impact Notes

                                                  • 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
                                                  Reconstructed from git commit history.1 commit
                                                  • d7e0ad4
                                                  v2.0Feb 12, 2026Reconstructed

                                                  L2 balance reliability and budgeted full-scan loop

                                                  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
                                                  Details

                                                  Impact Notes

                                                  • 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
                                                  Reconstructed from git commit history.6 commits
                                                  • 58c4f05
                                                  • 77dad70
                                                  • 28a7ead
                                                  • add68dc
                                                  • fb7e7d6
                                                  • 7d9e677
                                                  v1.2Feb 11, 2026Reconstructed

                                                  Coverage expansion: USDT0 and gold contract families

                                                  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
                                                  Details

                                                  Impact Notes

                                                  • 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
                                                  Reconstructed from git commit history.5 commits
                                                  • b257569
                                                  • 9281531
                                                  • eeb92e9
                                                  • 2fd5065
                                                  • 29a4759
                                                  v1.1Feb 11, 2026Reconstructed

                                                  Ingestion-time enrichment and backfill foundation

                                                  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
                                                  Details

                                                  Impact Notes

                                                  • 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
                                                  Reconstructed from git commit history.1 commit
                                                  • 1dec7aa
                                                  v1.0Feb 9, 2026Reconstructed

                                                  Initial Blacklist Tracker release

                                                  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
                                                  Details

                                                  Impact Notes

                                                  • 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
                                                  Reconstructed from git commit history.4 commits
                                                  • 093c11e
                                                  • ea9dbab
                                                  • 5158601
                                                  • ac0d823