On-Chain Metrics Explained: SOPR, Realized Cap, HODL Waves and What They Mean
On-chain metrics explained from first principles: SOPR, realized cap, HODL waves, active addresses and exchange flows, what each one measures, how it is computed from UTXOs, and how to read it. Informational only, not advice.
By the BitcoinDatabase team
June 2026 · 11 min read
On-chain metrics explained: what the ledger actually measures
On-chain metrics are statistics computed directly from the Bitcoin ledger rather than from price feeds or exchange order books. Because every transaction, output and address is public and verifiable, you can measure things about the network that no off-chain source can see: how old the coins moving today are, what price they last moved at, how many addresses were active, and how much value flowed toward exchanges. This article explains the most cited metrics, where each number comes from, and how to read it. Everything here is informational and analytical. None of it is financial or investment advice, and on-chain metrics are descriptive, not predictive.
The building block: UTXOs
Almost every meaningful metric is built on the unspent transaction output, or UTXO. Bitcoin does not store account balances; it stores discrete coins called outputs. When you spend, you consume whole outputs as inputs and create new outputs. Each UTXO carries an amount, the block it was created in, and (because the ledger is timestamped) the rough price at that time. That last fact, a creation height and an implied historical price, is what makes the richer metrics possible.
-- coins that have not moved in over a year ("old supply")
SELECT sum(value_btc) AS old_supply_btc
FROM outputs
WHERE spent = false
AND created_at < now() - interval '1 year';
SOPR: Spent Output Profit Ratio
SOPR asks a simple question of every coin that moves: was it sold for more or less than it was acquired for? For each spent output, divide the value at the moment it is spent by the value when it was created. Average that across all outputs spent in a period and you have SOPR.
A SOPR above 1 means coins are, on average, moving at a profit relative to when they last moved. Below 1 means they are moving at a loss. A reading right around 1 is often where coins move at break-even. Analysts watch it as a behavioral indicator of whether the market is realizing gains or losses, but it describes what holders have already done, it does not forecast what they will do next.
Realized cap and realized price
Market cap multiplies every coin by today's price. Realized cap does something more grounded: it values each UTXO at the price when it last moved, then sums those values. In effect it is the aggregate cost basis of the entire supply, a measure of how much real capital is stored in the network rather than a snapshot of speculative value.
Divide realized cap by the circulating supply and you get realized price, an approximation of the average price at which all coins last changed hands. Because it weights by actual movement, realized cap reacts slowly and is far less jumpy than market cap.
-- realized cap = sum of each unspent output valued at its last-moved price
SELECT sum(value_btc * price_at_creation_usd) AS realized_cap_usd
FROM outputs
WHERE spent = false;
HODL waves
HODL waves slice the entire supply into age bands, how long ago each coin last moved, and chart what share of supply sits in each band over time. Bands typically run from "less than a day" up through "1 to 2 years", "3 to 5 years" and beyond.
Reading them is intuitive: when older bands swell, a large share of supply is sitting still and dormant. When younger bands expand, older coins are waking up and moving. HODL waves are a vivid way to see the balance between long-term holding and active circulation across the network's history. They are a description of coin age, nothing more.
Active addresses
Active addresses counts the distinct addresses that appeared as an input or output in a given window, usually a day. It is a rough proxy for network usage. A caveat worth stating plainly: one person can control many addresses, and one address can represent many people (an exchange's hot wallet), so the count tracks activity, not unique users. Treat it as a directional signal of engagement, not a headcount.
-- distinct active addresses per day, last 14 days
SELECT day, count(DISTINCT address) AS active_addresses
FROM address_activity
WHERE day >= current_date - 14
GROUP BY day
ORDER BY day;
Exchange flows
Exchange flows measure how much BTC moves into and out of addresses labeled as belonging to exchanges. Net inflows mean more coins are arriving at exchanges; net outflows mean coins are leaving, often toward self-custody. These metrics depend on entity labeling, the imperfect art of clustering addresses and tagging them to a known service, so they carry real uncertainty. Labels are estimates, and any flow figure inherits the limits of the labeling behind it.
Reading metrics responsibly
On-chain metrics are powerful precisely because they are computed from a transparent, verifiable ledger. But they describe behavior, not the future. They depend on assumptions (especially anything built on entity labels), and a single metric in isolation rarely tells a complete story. Use them to understand what has happened on the network, and keep clear that understanding history is not the same as predicting price.
Get started
BitcoinDatabase computes these metrics over a fully-indexed copy of the chain and exposes them through the REST API, SQL, and ready-made dashboards. You can recreate every query above against live data, or open the Query Console and explore SOPR, realized cap and HODL waves yourself in a few seconds. The numbers are there for you to read and verify.
Hit Run to query the fully-indexed Bitcoin blockchain.
BTC
30-day trend
informational on-chain data · not financial advice
Query the Bitcoin blockchain yourself
Pull balances, UTXOs, transactions, on-chain metrics and fund flows from the fully indexed Bitcoin blockchain by REST API, SQL and dashboards. Indexed since 2009, new blocks within seconds, no node to run.