Skip to main content
A stablecoin issuer’s most important number is its collateralization ratio: is every token in circulation backed by reserves? Today that assurance usually arrives as a quarterly attestation PDF. Between reports, holders, treasurers, and risk teams are flying blind. This guide replaces the PDF with a live signal. Turbo tracks circulating supply as it changes; Compose continuously checks it against custodial reserves and attests the result on-chain, the monitoring and verification counterpart to the NAV oracle publisher.

What you get

  • Real-time circulating supply per token and per chain, from mint/burn events.
  • A continuous collateralization ratio: onchain supply checked against off-chain reserves on a schedule.
  • An automatic alert (and optional pause) the moment backing slips below a threshold.
  • Treasury analytics: velocity, holder concentration, and float in your warehouse.

How it works

Step 1: Stream supply changes with Turbo

TIP-20 emits explicit Mint, Burn, SupplyCapUpdate, and RewardDistributed events. Decode them from raw_logs to build a supply ledger.
supply-monitor.yaml
For standard ERC-20 stablecoins that mint and burn via transfers to and from the zero address, use the curated erc20_transfers dataset (tip20_transfers on Tempo) and detect sender = '0x0000000000000000000000000000000000000000' (mint) or recipient = '0x0000000000000000000000000000000000000000' (burn) instead of decoding custom events.
Circulating supply is then a running total of mints minus burns. Maintain it incrementally with the PostgreSQL aggregate sink, or as a view:
For deeper treasury analytics (velocity, holder concentration, per-chain float), route the same stream to ClickHouse or your warehouse.

Step 2: Attest collateralization with Compose

A scheduled Compose task closes the loop: read on-chain supply, fetch reserves, compare, and act. Running it in a TEE means the attestation proves the exact reconciliation logic ran.
src/tasks/reserve-check.ts
Schedule it in compose.yaml:
On-chain reads go through wallet.readContract (see Smart Contracts). View calls return the decoded value directly and cost no gas, so the read reuses the same sponsored wallet. That wallet’s writes are gas-sponsored (sponsorGas: true), so the attestor never needs funding.

Step 3: Publish the feed (optional)

To expose reserves to other applications with a Chainlink-compatible interface and an operator kill-switch, follow the multi-chain NAV oracle guide. It is the publishing complement to the monitoring in this guide: this task decides whether reserves are healthy; the NAV oracle broadcasts the figure to every chain that needs it.

Circuit breaker pattern

Because the check runs continuously, you can wire the breach branch to a real control instead of just an alert: pause the token via PAUSE_ROLE, halt a payout keeper, or throttle minting. Compose’s durable execution guarantees the breaker actually fires and completes even through transient failures, and the whole sequence is traced for the post-incident review.

Business outcomes

  • Continuous assurance replaces a quarterly PDF. Collateralization is a live number, attested on-chain.
  • Regulatory readiness. Reserve monitoring and attestation map directly onto stablecoin reserve-reporting regimes.
  • Faster incident response. A breach triggers an alert (or a pause) in minutes, with a full audit trail.
  • One source of treasury truth. Supply, velocity, and reserves live in your own database and warehouse.

Resources

Can’t find what you’re looking for? Reach out to us at support@goldsky.com for help.