Data sources
Every number on ICPWatch has a known source and a timestamp. On-chain reads come first. Where a third-party source is used it sits behind an adapter, is labeled as such, and is listed here.
Lifeline
| Source | Covers | Confidence | Cadence |
|---|---|---|---|
SNS root get_sns_canisters_summary (certified update call) | Every canister of every SNS: root, governance, ledger, index, swap, archives, dapps. Cycles, idle burn, freezing threshold, memory, controllers, module hash. | Measured | Hourly |
NNS root canister_status (certified update call) | Everything NNS root controls: ICP ledger, index, and archives, all ck token suites, and community ledgers that added NNS root as a controller. | Measured | Hourly |
Canister /metrics via http_request query | Self-reported cycle balance of DFINITY ledger, index, and archive canisters. | Measured | 10 minutes |
Blackhole canister_status | Canisters that list the public ninegua blackhole as a controller. It does not return idle burn. CycleOps blackholes refuse outside callers, so they are not a source. | Measured | Hourly |
| Query probe to a known method | Liveness of ledgers, indexes, and archives. A frozen canister answers with IC0207. | Probed | Hourly |
| Update-call probe to a method that does not exist | Liveness of any canister at all. The ingress filter answers before method lookup: frozen IC0207, stopped IC0508, missing IC0301. Costs the target one ingress fee, about a millionth of a trillion cycles. | Probed | Hourly |
read_state (certified) | Controllers, module hash, subnet for any canister. | Measured | On discovery |
Ledger icrc3_get_archives and archives | Archive discovery for every ledger. | Measured | Hourly |
One thing worth knowing: a controller can report a canister as running while it is frozen, because freezing is a function of balance and threshold, not of run status. Lifeline derives frozen state from the balance and from probes, never from that field alone.
Balance queries skip per-node signature verification to stay inside our CPU budget. Controller status reads are update calls and are verified against the NNS root key.
Markets
| Source | Covers | Kind |
|---|---|---|
ICPSwap ICP/ckUSDC pool metadata | ICP price in USD from sqrtPriceX96, assuming ckUSDC is one dollar. Cross-checked against the REST price every run. | On-chain |
Ledger icrc1_total_supply, icrc1_fee, icrc1_decimals | Supply and token parameters, per ledger. | On-chain |
| SNS aggregator canister, SNS-W, ck ledger suite orchestrator | Token registry: every SNS, every ck token, with their canister ids. | On-chain |
| ICPSwap info API | Pools, reserves, 24h and 7d volume, hourly and daily candles. ICPSwap's own on-chain info canisters are stopped, so this REST feed is the only source for volume. | Third party |
| ICRC ledger API (DFINITY) | Top holders and the large-transfer feed. No canister can enumerate holders, so the only alternative is replaying every block, which is planned. | Third party |
DEX coverage. As verified in September 2026, ICPSwap is the only ICP DEX with meaningful volume. KongSwap has removed every pool and its API is offline, Sonic has not traded since early August, and ICDex trades about a dollar a day. The aggregation layer takes any number of DEX adapters, so new venues slot in when they have liquidity worth counting.
TVL. A pool only counts if one side is ICP, ckBTC, ckETH, ckUSDC, or ckUSDT, and it is valued from that side. Pools of two illiquid tokens priced against each other inflate naive TVL sums into the billions.
Network
| Source | Covers | Kind |
|---|---|---|
NNS governance list_proposals | Proposals, tallies, deadlines, outcomes. | On-chain |
| IC public API (DFINITY) | Block rate, message rate, cycle burn rate, per-subnet metrics, canister counts. These rates have no on-chain source. | Third party |
Per-canister burn is private. Nobody can rank every canister on a subnet by burn: balances are visible only to controllers. Subnet pages therefore rank the canisters Lifeline can measure, and say so.