Glossary

What each metric means, its exact formula, the API request behind it, and why it can differ from other explorers.

Guides, help and developer docs: docs.taoswap.org

For AI agents: llms-full.txt

Price & valuation

1H / 24H / 7D / 30D / 90D %

How much the price has moved over the trailing window: current spot against the closing price at the start of the window.

Formula((spot − baseline) / baseline) × 100. Baseline for 1H and 24H = the last minute close inside the one-hour slot that ends an hour (respectively a day) ago; for 7D / 30D / 90D = the last close of the UTC day N days ago

Anchored by clock time, not by block, and the two families anchor differently, so 7D is not a rolling 7 × 24 h. The baseline is never searched for outside its own slot: if no candle exists in that hour, or on that day, or the window starts before the current subnet of a recycled netuid registered, the figure is empty rather than measured against another price or shown as 0%; an empty change reads as a dash and sorts last. It compares a noisy live spot against a candle close, which is why it can differ from explorers doing spot-to-spot. Root is served as 0 and hidden in the table.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].price_evolution_{h_1,h_24,d_7,d_30,d_90}

7D Trend (sparkline)

The inline 7-day price line drawn in the table.

Formulathe last hourly close of each 4-hour UTC bucket over the trailing 7 days (~42 points, oldest → newest, 6 significant digits)

null when the subnet has fewer than two points in the window, which is the exact "too little history to draw a line" condition. Buckets are aligned on the clock (00:00, 04:00, 08:00 UTC), not on "exactly 7 days ago", so the first and last are partial and you usually get 43 points rather than 42.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].sparkline_7d

FDV

Fully Diluted Valuation: what the subnet would be worth if every alpha token that can ever exist had already been emitted.

Formula21,000,000 α × the EMA moving price, spot when the EMA is 0

Every subnet has the same 21M alpha hard cap as TAO itself, so FDV is always ≥ market cap. The cap is compiled into the runtime rather than stored as a parameter, so unlike most chain numbers it cannot be changed by governance, and the chain really does stop emitting a subnet's alpha when its issuance reaches it. Same EMA-vs-spot gap as market cap; root falls back to spot, and FDV 21,000,000 τ is the right reading for it since root's "alpha" is TAO. Burned alpha still counts against the cap, since a burn does not reduce what the chain considers issued.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].fdv (fdv_usd for the USD value)

Market Cap

Value of the alpha actually in circulation: what sits in the pool plus what is staked, minus what has been burned and minus what the protocol itself holds, priced at the smoothed (EMA) price.

Formula(α in the pool + max(α held outside the pool − α this subnet burned − α the protocol itself holds, 0)) × the EMA moving price, spot when the EMA is 0

It differs from other explorers in three ways: the price is the EMA moving price (spot only as a fallback, which is what happens on root, whose EMA is 0); the base is circulating alpha, not the 21M cap (that is FDV); and two stocks nobody can sell are subtracted, burned alpha and the alpha the protocol itself holds. Both stay inside the staked figure on-chain: a burn destroys the tokens without removing them from it, and the protocol's alpha, bought with a subnet's excess TAO emission, sits on no wallet and is never sold. Recycled alpha is not subtracted again, because the chain already removed it. Supply, below, keeps both stocks, so on burn-heavy subnets supply × price sits above market cap. Only what this subnet burned itself is subtracted: the chain keys its burn counter to the subnet number and never clears it when that number passes to a new subnet, so the part inherited from an earlier holder of the number is removed. The daily series on /tools/compare applies this same definition day by day, priced at the day's last block, so its last point can trail the live figure; days from before the chain kept a record of its own alpha subtract the burn only.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].market_cap

Moving Price

A slow-moving average of the price, used as the basis for market cap and FDV so a single trade cannot move a valuation.

Formulachain EMA, once per block: new = a × min(spot, 1 τ) + (1 − a) × previous, where a = the smoothing factor × blocks since the subnet's first emission / (those blocks + the subnet's ramp length)

Computed on-chain, not by Taoswap. The chain feeds the EMA min(spot, 1 τ), so the moving price can never exceed 1 τ even if spot does. Both knobs are chain parameters a governance call can move, so treat the usual figures (a smoothing factor of 0.000003 per block, roughly 30 days to close half the gap to spot) as today's values and not as constants; the ramp in particular is set per subnet. Until a young subnet finishes ramping, its effective smoothing is a fraction of that factor, so its EMA moves slower than the headline number suggests. It freezes entirely while a subnet is outside the emission set: never started, subtoken disabled, or registration closed. Careful with root: the field is served as 0 for it, which is why market cap and FDV fall back to spot there, while the chain itself treats root as 1 τ. It should match any explorer reading the same chain value; small gaps come from the ~2-min snapshot block.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].moving_price

Price ($)

The same spot price, converted to dollars.

Formulaprice × the TAO/USD rate the app polls from CoinGecko every minute

Two different dollar rates exist on this site and they are not interchangeable: figures converted in-app (this one) use the rate the app polls every minute (the API's stored rate after 15 minutes without an answer), while figures the API already returns in dollars (FDV, 24h volume, depth) were converted server-side against a rate refreshed every 15 minutes. On a fast move the two disagree for a few minutes, and the gap is the rate, not the metric.

Data source
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].price

USD = price × the live TAO/USD rate.

Price (τ)

What one alpha token is worth in TAO right now, quoted by the subnet's own liquidity pool.

Formulathe chain's own spot price for the pool: (α weight / τ weight) × TAO reserve / α reserve. Root (SN0) is pegged to 1 τ instead

Served straight from the chain rather than divided in-app, and the weights matter: the pool is a weighted (Balancer) automated market maker, an AMM: the contract that holds both sides and takes the other end of every trade, with no order book and no counterparty to find. So the plain ratio of the two reserves is only exact while the weights are equal. In practice they are, to within a tiny drift, but the chain only guarantees each side stays above 1%, and it rewrites the weights whenever an emission injection would push the pool out of balance. Root is the exception: it has no AMM, so the chain quotes it at 1 τ and the two In Pool figures are empty for it. This is the spot price, not the EMA moving price behind market cap and FDV, so explorers that display the EMA read differently.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].price

TAO all-time high

The highest daily TAO dollar price on record, with its date, and how far below it the price stands now.

Formulaall-time high = the highest daily price of the series, a daily price being the last CoinGecko reading of that UTC day and today's the live price; the % under it = (live price − all-time high) / all-time high × 100

A daily close, not the highest trade: a peak inside a day that faded before the day's last reading is not in it, so sources quoting the highest traded price read higher. The record starts in June 2022, before TAO's peak, so this is the all-time high and not just the top of a window. No low is shown beside it, because the series' first day is the edge of the record, not a market bottom.

Data source
GET https://api.taoswap.org/price-history/

Response fieldresults[].price

The highest price of the series, with its date; today counts at the live price.

TAO price change (1D / 7D / 30D / 1Y)

How much the TAO dollar price has moved, as the /price page shows it under its Price figure: over the last day, and against the daily price 7, 30 and 365 days back.

Formula1D = CoinGecko's own change over the trailing 24 hours. 7D / 30D / 1Y = (live price − baseline) / baseline × 100, baseline = the series' last daily price on or before the UTC day 7, 30 or 365 days before today, a daily price being the last CoinGecko reading of that day

Two kinds of window side by side: 1D rolls over 24 hours, while 7D, 30D and 1Y are anchored on UTC days, so 7D spans six full days plus today so far rather than a rolling 7 × 24 h. A missing day falls back to the closest earlier one instead of leaving the figure empty, unlike the subnet price changes (see 1H / 24H / 7D / 30D / 90D %). Explorers measuring from the previous close, or from exchange candles like the chart below, will differ slightly.

Data source
GET https://api.taoswap.org/price-history/

Response fieldresults[].price

The live price and the 1D change come from CoinGecko's simple price endpoint, which the browser polls every minute; once CoinGecko has been unreachable for 15 minutes, the latest row of this series stands in and the 1D change is hidden.

TAO volume 24H ($)

The dollar value of all the TAO traded over the last 24 hours on the markets CoinGecko tracks: the 24h volume figure of the /price page.

FormulaCoinGecko's trailing 24-hour trading volume for TAO, in USD, as of the last fetch, every 15 minutes; each past UTC day keeps the reading of its last fetch. The 1D change under it = (this volume − the previous day's) / the previous day's × 100

A market-wide figure, not Taoswap's own: it is neither the subnet Volume 24H, the TAO going through one subnet pool, nor the chart's volume bars, which are exchange candles counted in TAO. The 1D change compares two trailing 24-hour readings taken at different times, the latest and the previous day's last, which overlap almost entirely early in the UTC day, when it reflects only the last few hours of trading. The figure trails CoinGecko by up to about 25 minutes (a fetch every 15 minutes, then a 10-minute response cache). A dash means the latest row has no volume: the first minutes of each UTC day, before its first fetch, or a CoinGecko answer without one; the 1D change is then hidden too.

API request
GET https://api.taoswap.org/price-history/?limit=1&order=desc

Response fieldresults[0].volume

The /price page reads the whole series and takes its last row; ?currency=eur serves euros.

Volume 24H

TAO traded through the subnet's pool over the last 24 hours.

FormulaΣ of the TAO leg of every pool-touching stake and unstake on the subnet over the trailing 24 h (τ); the USD figure is server-converted

Counted on one side only, in TAO, so it reads far below what an exchange would print for the same activity, since exchanges count both legs of a trade. Protocol chain buys are excluded: the coinbase moves the reserves directly without ever emitting a trade. Swaps and cross-subnet moves contribute each of their legs to the pool it touches, while same-subnet hotkey or validator rebalances are excluded, because they never touch the pool, and so are the refunds paid out when a subnet is dissolved. Burns and recycles never count. The window rolls from now, but it is recomputed at most once an hour, so it steps rather than glides. null for root (no pool); a 0 is a real zero. Note the chain has its own volume counter, but it only sees direct calls to the swap pallet, a small fraction of real activity, so this is built from the stake events instead.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].volume_24h (volume_24h_usd for the USD value)

Emission

Burn

The share of the miner reward pool that never reaches independent miners, because it was directed at the owner's own neurons and then destroyed.

Formulathe share of the miner reward pool aimed at owner neurons: Σ (owner neurons' incentive) × 100, the incentive vector already being normalised by the chain, weighted by the emission split between mechanisms on multi-mechanism subnets

The owner does not pocket this emission. The chain withholds any incentive aimed at an owner or "immune" hotkey and then either burns or recycles it, depending on the subnet's setting, and the value is deliberately identical either way. That withheld share matters because the chain scales the subnet's TAO emission allocation by (1 − burn), so a high burn actively costs the subnet, though its alpha emission is untouched. An "owner neuron" is any neuron whose coldkey is the subnet owner, plus the subnet owner hotkey. Below 100% means at least one independent miner is earning. The figure is recomputed from the live metagraph rather than read from the chain's own per-tempo ratio; the two agree closely, and they can drift on subnets the chain has stopped emitting to, where the chain's ratio falls back to zero while this figure still reflects the last distribution.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].emission_miner_burn

Chain Buys (Excess TAO emission)

TAO the protocol spends buying alpha on the open pool, rather than injecting it as fresh liquidity. It is real buy pressure paid by the network.

Formulathe TAO the protocol actually spent buying alpha in the pool on the last block (the swap's executed amount, not the allocated one), in τ/block, shown ×7200 for τ/day. Equivalently: the subnet's allocated TAO emission minus the TAO it managed to inject as liquidity

Each block the chain wants to inject the subnet's TAO emission as matching TAO + alpha liquidity, but the alpha side is capped at the root proportion × the block's alpha emission, priced at spot. As a subnet ages its alpha issuance grows, that cap falls, and the TAO that can no longer be paired is spent buying alpha in the pool instead. That is the whole mechanism, and it is why older subnets drift from liquidity injection towards chain buys. Post-halving values are exactly what the chain wrote, with no rescaling applied. This figure replaced an earlier estimate (a τ/day price proxy), so older history values diverge sharply. null for root, and 0 means no chain buy on that block (the chain stores it unsigned, so it is never negative). The field records what actually executed, so on a rare partial-injection block the two legs sum below the allocated emission. One stale-value trap: the chain only clears this counter for subnets it is currently emitting to, so a subnet that leaves that set keeps its last value instead of dropping to 0.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].excess_tao_emission

Chain Buys %

This subnet's share of all the chain buying happening across the network.

Formulathis subnet's chain buys / the total chain buys across every non-root subnet × 100

A normalised share, so it sums to 100 across non-root subnets. There is no smoothing whatsoever: the chain clears the underlying counter every block, so the value is whatever one block happened to do, which makes it very spiky. It is also a sample rather than a live reading, since the sync does not read every block. Use the history series for a stable view.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].excess_tao_emission_percent

EMA %

The subnet's share of realized per-block emission. It is the same number as Emission %: the name is legacy, and no EMA is involved any more.

Formulaidentical to Emission %

Two names for one metric, equal to within rounding. The name is a leftover from when emission followed net stake flows smoothed over 30 days; it now follows price, and no averaging is involved. What it tracks is the chain emission share, which the chain builds from the moving price × (1 − miner burn), renormalised over the emission-enabled non-root subnets. Root (SN0) is null. One real difference: this figure is recomputed on every request over every subnet on record, while Emission % is frozen at the last chain sync over the subnets alive at that moment, so a destroyed subnet can still weigh on this one.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].emission_ema_percent

Emission %

The share of the network's per-block TAO emission that goes to this subnet. Across emission-enabled subnets it adds up to ~100%.

Formula(TAO injected as liquidity + TAO spent on chain buys) / the same sum over every non-root subnet × 100, per block

It is a share, not an absolute amount, so the halving cancels out of it entirely. EMA % is the same number under an older name. A subnet reads 0 when emission is switched off for it (its share is redistributed on-chain), and a freshly registered subnet starts switched off until it is enabled. A subnet is also skipped entirely while registration is closed on it or its subtoken is disabled. Switching emission off only stops the TAO side: the subnet keeps emitting alpha to its miners and validators, so a subnet at 0% here is not a dead subnet. Root (SN0) is null. Since the chain records what was actually injected, rare partial-injection blocks read slightly low.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].emission_percent

Root Proportion

Root (SN0) stakers' share of this subnet's validator emission on the default split: root is paid that amount off the top of the validator slot whatever split the owner sets, and the subnet's alpha stakers share the rest.

Formulaγ·R / (γ·R + the subnet's alpha issuance), a fraction in [0, 1], ×100 for display. R = TAO staked on root, γ = the chain tao weight (~0.18, read from the chain at each sync), alpha issuance = α in the pool + α held outside it + the protocol alpha reserve

The denominator is the subnet's whole alpha issuance, the pool side included; netting it against the staked side alone overstates the proportion by several points. The third term is protocol liquidity the AMM could not inject without pushing the pool weights out of range: it is zero on every subnet today and drains as soon as an injection fits, so in practice the value is set by the two alpha stocks. The proportion falls as a subnet ages and its own alpha issuance grows, which is also what shifts the subnet from liquidity injection to chain buys (see Chain Buys). Whether that root share actually reaches root stakers is conditional: when the network-wide moving prices sum below 1 the chain recycles it instead of paying it out. Root is paid min(validator slot, 0.41 × this value) of the alpha paid out each block, whatever split the owner sets: where the validator slot is not the default 41%, root's share of it is 0.41 × this value / the slot. It is a fraction, not a percentage. null for root only; with no data it reads 0, not null. On a brand-new or emptied subnet, where alpha issuance is 0, the served value is a floor rather than the chain's own answer. Do not confuse γ with the owner's share shown under Conviction, 0.18 by default but set per subnet, which is unrelated.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].root_proportion

Liquidity & depth

ADR (Alpha Distribution Ratio)

How much alpha holders own compared with how much the pool holds. Above 1, holders own more than the pool can absorb, so a rush for the exit sells at a steep discount. Below 1, the pool cushions exits.

Formulamax(α held outside the pool − α this subnet burned − α the protocol itself holds, 0) / α in the pool (unitless, pivot at 1.0)

Burned alpha and the protocol's own alpha both stay inside the outside-the-pool figure on-chain, so they are subtracted here exactly as in market cap; the two can only disagree for a single sync cycle, if a chain read fails. Neither can rush for the exit: burned alpha is destroyed, and the protocol's alpha sits on no wallet and is never sold. Only what this subnet burned itself is subtracted: the chain's burn counter is keyed to the subnet number and survives that number passing to a new subnet, so the part inherited from an earlier holder is removed. The numerator still includes the owner's own locked and self-staked alpha, so it is not purely holder-owned. Older history nets less: rows from before the chain kept a burn counter hold the raw ratio, rows from before it recorded its own alpha subtract the burn only, and on a re-registered number the rows before its registration describe the subnet that held it then. null for root or an empty pool.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].adr

Depth ±2% / ±5%

How much TAO it takes to push the price up (+, buying) or down (−, selling) by 2% or 5%. Bigger numbers mean a deeper, harder-to-move pool.

Formulaup = TAO reserve × (√(1+δ) − 1) / (1 − fee), a gross input with the fee on top; down = TAO reserve × (1 − √(1−δ)), the net TAO leaving the pool. δ = 2% or 5%, fee = 33/65535 ≈ 0.0504%

The down side reads slightly larger than the up side, and that is arithmetic rather than a bug: since √ is concave, the same percentage move needs marginally more TAO on the way down. Because the up leg carries the fee and the down leg does not, the fee narrows that gap instead of widening it: as served, the down side is 0.95% larger at ±2% and 2.5% larger at ±5%. Computed on the plain constant-product curve, which matches the chain while the pool weights are equal, as they are today. Two caveats: the fee is applied as one global constant, whereas the chain stores it per subnet and governance can move it on any single subnet, so a subnet whose fee has been changed would be priced with the wrong one here; and there is no concentrated liquidity to model, because user-provided liquidity is disabled on-chain. Root (SN0) is null, having no pool, and an empty pool reads 0.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].depth_{up,down}_{2,5}pct (+ *_usd)

In Pool (τ) / (α)

The two sides of the subnet pool: how much TAO and how much alpha it currently holds.

Formulathe two pool reserves, straight from the chain

Their ratio is the spot price while the pool weights are equal (see Price (τ)). These reserves hold protocol liquidity only. User-provided liquidity is not thin here, it is impossible: the chain rejects every add/remove-liquidity call outright. Both are null for root, which has no pool.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].root_in_pool / results[].alpha_in_pool

Supply

Burned

The best-known amount of alpha this subnet has destroyed for good, valued in TAO. Most of it is not somebody choosing to burn tokens: it is miner rewards the chain destroys automatically, block after block.

Formulathe larger of (α this subnet burned through every path, since the chain started counting them) and (α it burned by explicit burn calls since genesis), × the EMA moving price, spot when the EMA is 0

Two overlapping sources, neither complete on its own: the chain-wide counter covers every burn path but only from the date the chain introduced it, while the explicit-burn total reaches back to genesis and misses the other paths. Taking the larger gives a lower bound, not the real total, since the two cover different periods and different paths. Read the size before reading intent: most of it is the miner incentive the chain destroys every block when a subnet directs its rewards at its own neurons (which is why unrelated subnets can show nearly identical totals), and deliberate burns, the ones somebody actually called, are rare. Burning is not recycling: a burn destroys the tokens while leaving both the alpha held outside the pool and the issuance counter untouched, whereas recycling reduces both, and recycled alpha is not counted here. Both sources are keyed to the subnet number rather than to the subnet, and the chain never clears them when a number passes to a new subnet, so the part inherited from an earlier holder is measured at the block each subnet was registered and removed from both terms: this figure is the current occupant's own burns.

Data source
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].alpha_burned_counter, results[].total_alpha_burned

The larger of the two, valued at the EMA moving price (spot when the EMA is 0).

Supply

All the alpha in circulation for this subnet: what sits in the pool plus what is held outside it.

Formulaα in the pool + α held outside the pool

Burned alpha is deliberately not removed here: on-chain a burn destroys the tokens but leaves the outside-the-pool figure untouched, and it is tracked separately (see Burned). Market cap, by contrast, removes it, along with the alpha the protocol itself holds, which is why supply × price sits above market cap on burn-heavy subnets. Recycled alpha is already excluded, because recycling does reduce that figure, and the issuance counter with it. Supply and market cap both stop at those two stocks, leaving out the protocol alpha reserve that the chain folds into its own issuance figure (see Root Proportion): liquidity waiting to be injected, owned by nobody, and zero on every subnet today. Note that "held outside the pool" is not the same as "staked by holders": it also contains the orphaned alpha of past burns and alpha the protocol bought through chain buys. Root is a special case, since its alpha is TAO, so the figure is served while its two components are not. Explorers that also net burns, or that show the 21M cap (which is the FDV base), will differ.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].total_supply

Concentration

Challenger stake

What the leading challenger has actually put at risk: the realizable TAO value of the alpha they have locked. Bigger means a more committed challenger.

Formulathe leader's total locked alpha, perpetual and decaying, estimated in TAO as a single sale through the pool (constant product, flat 0.05% fee) rather than at spot

Shown at realizable value on purpose, because face value overstates the commitment on a thin pool. Only meaningful when the leader is an outsider, which is served alongside as a flag. The field is named after the owner but carries the leader's position, and the leader is not always the owner.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].conviction.owner_locked_value.tao_slippage

Conviction

How much of the subnet the current leader of the ownership race has locked up, as a share of supply. Locking alpha is how a key stakes its claim to owning the subnet.

Formulathe leader's conviction (an alpha mass weighted by maturation and decay) / the subnet's alpha supply × 100

This is the leader's position, and the leader (the "king") is not always the owner: the king_is_owner flag served alongside says which, while comparing the king (a hotkey) with the owner (a coldkey) cannot tell. Conviction is an alpha mass, not an abstract score, which is what makes it comparable to supply at all. It decays over time, but the chain does not keep it up to date on its own: the stored value only moves when something touches the lock, so the figure served here is rolled forward to a recent block every few minutes. Perpetually locked alpha never loses mass and its conviction converges upward to that mass instead. Two half-lives drive it, one for the unlock schedule and one for maturation; both are governance parameters and the maturation one has already been moved off its default, so read the two half-life fields served alongside. This gauge is measured against total supply, while the takeover gate below is measured against the eligible alpha (what is held outside the pool, minus the protocol's own and the burned alpha): two neighbouring bars, two different denominators.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].conviction.owner_conviction_pct_supply

HHI (concentration)

How concentrated the holders are, on a 0 to 100% scale. 0% means the stake is spread perfectly evenly, 100% means one holder owns everything. Lower is healthier.

FormulaHHI = Σ(each holder wallet's share of the staked alpha)², owner self-stake removed; then normalised (HHI − 1/N) / (1 − 1/N), clamped 0..1, ×100 for display. N = the holder wallets left

Shares are per wallet, summed across every validator that wallet delegates to. The owner exclusion is per position, not per wallet: a position drops out only when the holder, the validator it is staked to and the subnet owner are the same coldkey, so the owner's delegations to outside validators are still counted. Most explorers publish the raw HHI rather than this min-normalised form, so the numbers are not comparable. Returns 0 below 2 holders. Recomputed on a 2-hourly cycle, so it can lag the live table, and if that read fails it holds its last good value rather than dropping to zero.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].hhi_normalized

Locked (conviction)

The alpha locked across every participant in the ownership race, shown both at face value and at what it would actually fetch if sold.

Formulalocked alpha = perpetual mass + decaying mass. Face value = α × spot price; realizable = an estimate of selling that α in one go through the pool, constant product on the reserves, with a flat 0.05% fee.

A perpetual lock keeps its alpha until its owner switches it to decaying; decaying locks give it back gradually. Realizable values are single AMM exits, so per-holder figures do not add up to the subnet total: use the subnet-level value for "everything sold at once". The fee used is a flat 0.05% rather than the subnet's own, which the chain stores per subnet and governance can change, so on a subnet whose fee has been moved the realizable figure is slightly off.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].conviction.total_locked, .total_locked_value

Nakamoto coefficient

The smallest number of top holders who together own more than half of the stake. Lower means more concentrated.

Formulathe smallest k whose k largest holder wallets together hold more than 50% of the staked alpha, owner self-stake removed (integer)

Same owner exclusion as HHI. Returns 0 (not 1) for an empty or single-holder subnet.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].nakamoto_coefficient

Stake (α)

All the alpha staked on the subnet, i.e. everything held outside the pool.

Formulaall the alpha the subnet has issued that is not sitting in its pool (α)

Careful with the word reserve: the pool's alpha reserve is the other figure (see In Pool). This one is everything outside the pool, and it is broader than "what holders own": it includes the owner's locked and self-staked alpha, the alpha orphaned by past burns (a burn does not shrink it), and alpha the protocol itself bought through chain buys. Locking changes nothing here either, since a lock only blocks withdrawal and moves no tokens. The owner-excluded distribution behind HHI / Nakamoto / Top 10% is a separate calculation.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].alpha_stake

Takeover gate (Threshold met)

Two conditions must both hold before the chain will hand a subnet to the conviction leader: the subnet must be over a year old, and the leader alone must hold more than 18% of the eligible alpha in conviction. Threshold met is how full that second condition is.

Formulaage ≥ 2,629,800 blocks (7200 × 365 + 1800 ≈ 365.25 d) and the leading hotkey's own conviction (α) > 18% of the eligible alpha, where eligible = alpha held outside the pool − protocol-owned alpha − burned alpha. Threshold met = that leader's conviction (α) / the 18% bar × 100.

Only the leader is measured, never the sum of the lockers: a coalition has to lock onto the challenger's own hotkey to count. The comparison is strict, so exactly 18% loses, and both conditions are evaluated together once per epoch rather than every block. The 18% is fixed in the runtime, not a governance parameter, but the bar it sets moves with the eligible alpha, and mostly downwards: issuance raises it every day, while burning alpha shrinks the eligible base faster. So a gauge that moves on its own while nobody touches a lock is the normal case, not a bug. The bar can read above 100% for a while when a decaying lock is near its peak, without the gate being durably reachable; see the ceiling described under Time to takeover. Whether the chain actually executes the flip depends on the runtime version, which takeover_enforced reports: while it is false the conditions are computed but nothing happens. Even then the flip is not automatic: the chain also requires the leader to resolve to a real wallet, whose coldkey is not already the owner's, and eligible to hold a slot on the subnet.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].conviction.threshold_used_pct

Takeover status

A one-word verdict on the ownership race: whether the gate can ever be reached with the locks as they stand, whether both gates are already satisfied, and whether the chain would act on it.

FormulaEligible = the age lock and the conviction lock both satisfied. Stalled = no ETA found within 3 years. Building = an ETA exists. Enforcement = whether the runtime actually executes the flip.

Stalled is not the same as "far away": it means waiting cannot get there, only a new lock can, either because the current locks plateau below the bar or because the bar climbs past a plateau that sits above it today. A subnet can sit above 100% on the Threshold met bar without being eligible: the age lock is then what holds it back. Even when eligible, the flip only happens at the next epoch, only if enforcement is on, and only if the leader is a different wallet from the current owner.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].conviction.gate_reachable, .takeover_eligible, .takeover_enforced

Time to takeover (ETA)

How long the current locks would need to put a single hotkey over the conviction gate, projected day by day. It is deliberately not proportional to the Threshold met bar: a subnet that looks fuller today can still show a longer ETA.

FormulaSmallest Δ, scanned in 1-day steps out to 3 years, where the best-placed hotkey's projected conviction passes the bar as it will stand on that day: the 18% gate plus the alpha issued into it since today. 0 means already there, none means never with the locks as they stand. Every hotkey is projected at every step and the maximum is taken, never the sum. The projection replays the chain maturation/decay math: existing conviction fades by exp(−Δ/maturity rate), perpetual mass matures into conviction by (1 − exp(−Δ/maturity rate)), decaying mass follows the chain's γ term, and owner masses are pinned to their locked mass.

It covers the conviction gate only and ignores the age gate, so a subnet less than a year old can show an ETA of 0 while still being years from eligible; read it next to the age. An ETA exists exactly when the gate is reachable. Only the best-placed hotkey counts, because the leader of that day is the one the chain would admit. Conviction converges towards the perpetually locked mass, because the decaying part matures and then melts away. That gives the gauge a ceiling, the leader's perpetually locked alpha / the bar × 100 (another holder's locks never mature into the leader's conviction), but that ceiling is measured against today's bar while the projection lets the bar climb, so a ceiling above 100% is necessary and not sufficient. With a ceiling below 100% the gate is never durably reachable and the status reads Stalled, even if a transient bump crosses it. The approach is concave, so a subnet with high conviction today but a ceiling barely above the gate reads slower than a less filled one with room to grow. The 3-year horizon is far enough out for the projection to settle, so "no crossing" really does mean never, with the locks as they stand. It assumes locks stay frozen and lets the bar rise with issuance alone, while burns and stake flows usually lower it, so the projection is deliberately on the pessimistic side; every sync recomputes it.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].conviction.gate_eta_days

Top 10 %

How much of the stake the ten largest holders own between them.

Formulacombined share of the 10 largest holder wallets in the staked alpha, owner self-stake removed. A fraction 0..1, ×100 for display

It is a fraction in 0..1, not a percentage, and it reads exactly 1 whenever the subnet has 10 holders or fewer. The denominator excludes the owner self-stake, so it measures the tradable distribution; the owner can still show up through its external delegations.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].top10_share

Lifecycle & risk

Deregistration risk

How exposed a subnet is to being removed from the network. The routine way a subnet dies is a new registration landing while the network is at its cap: the victim is then the non-immune subnet with the lowest price EMA.

Formulaprune_rank orders the non-immune subnets by price EMA, lowest first and oldest first on a tie; rank 1 is the one the next registration would remove. risk_level = immune, then critical (price EMA of 0, or rank ≤ 5), high (≤ 15), medium (≤ 40), low beyond that.

Immune subnets cannot be removed at all and carry no rank. A subnet whose owner never started emission has a price EMA frozen at 0, which puts it at the very front of the queue the moment its immunity ends. The bands are a presentation choice, not a chain concept: on-chain only rank 1 means anything, and since registrations tend to arrive about weekly the rank reads roughly as weeks of headroom. This routine removal only happens while the network is at its subnet cap; the envelope served alongside carries the current count, the cap and the exact subnet the next registration would take. Two things stop rank 1 from being a promise: governance can also dissolve a subnet outright, with no registration involved, and when the chain does prune, the incoming subnet is queued rather than created on the spot.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].dereg.risk_level, .prune_rank; envelope dereg_context

Immunity

A grace period after registration during which a subnet cannot be deregistered, whatever its price.

Formulaimmune while the current block is strictly below the registration block + the immunity period

The comparison is strict, so the subnet becomes prunable exactly on its end block, the same test the chain runs. Only the human-readable end date is dropped once immunity has lapsed; the end block keeps being served afterwards, as a past date, so its presence does not mean the subnet is still immune. The period is a chain parameter, served alongside: 432,000 blocks today, about 60 days.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].dereg.is_immune, .immunity_end_block, .immunity_ends_at

Price EMA (deregistration)

The value the chain compares when it has to pick which subnet to remove: the same smoothed moving price shown elsewhere, not the spot price.

Formulathe chain moving price (see Moving Price); the lowest non-immune subnet is the one removed, the older registration losing ties

Using the EMA rather than spot is deliberate: it makes the choice unforgeable by a single trade. A subnet that never started emission sits at 0 and is therefore always the first candidate, which is why the subnet detail also tells you whether a subnet has started. The freeze is not limited to those: any subnet the chain has stopped emitting to keeps its last EMA while the others keep moving, so it drifts down the ranking without anything happening to it.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].moving_price

Network activity

Holders

How many distinct wallets (coldkeys) hold any alpha of this subnet.

Formulathe number of distinct wallets holding a non-zero alpha position on this subnet, counted across every validator they stake to

There is no minimum or dust floor (any non-zero position counts), and unlike the concentration metrics this one does not exclude the owner. Nor does it require delegating to somebody else: a wallet staking to its own hotkey counts. The asymmetry with the concentration metrics is deliberate: this answers "how many wallets hold this alpha", while HHI, Nakamoto and Top 10% answer "how is the tradable float distributed". An explorer with a min-stake floor, or one counting per wallet-and-validator pair, will differ. Each day's history point snapshots this same live figure. Days rebuilt from chain history are the exception: they come from the delegate registry, which cannot see wallets staked to non-delegate hotkeys and sits a few percent lower, so do not read that small step in old points as a real move.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].holders_count

Mechs

How many mechanisms (sub-mechanisms) the subnet runs.

Formulathe chain's mechanism count for this subnet, 1 when it was never set

Each mechanism has its own metagraph, with its own UIDs, incentives and weights, and its own slice of the emission; when no split is recorded the alpha is divided equally between them. Almost every subnet runs one. It also explains the Miners count, which is per mechanism.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].mechanism_count

Miners

How many independent miners are currently earning something, excluding the owner's own neurons.

Formulathe number of distinct miner hotkeys earning something, excluding the owner's own

"Active" here means incentive strictly above 0, with no validator-permit, vtrust or stake threshold applied, so explorers using a permit or axon heuristic will report different numbers. It counts distinct miners, so one hotkey registered in several mechanisms counts once. An owner neuron is one whose wallet is the subnet's registration wallet or whose hotkey is the official owner hotkey, not just the former. A Burn below 100% implies at least one of these miners is earning.

API request
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].active_miners

Validators

APY / APR 7D (subnet)

What one alpha staked to this validator on this subnet earned over the last 7 days, annualised: the APR at a flat rate, the APY compounded every epoch, since alpha dividends are staked back into the pool.

Formular = the alpha paid into the hotkey's pool / that pool, per epoch, over the last 7 complete UTC days, every epoch the subnet ran counted (an unpaid one at zero); n = the epochs run per year at the window's pace (about 7,300 at a tempo of 360). APR = r × n × 100; APY = ((1 + r)^n − 1) × 100; both clamped to [0, 10000].

A rate in alpha, so moves in the alpha's price are not in it. Already net of the validator take and of what its childkey parents received, while a childkey take earned on other coldkeys' parents lifts it. Blank until the hotkey has a full window of history, and when it earned nothing on the subnet in the last 7 days. Some explorers show the APR under the name APY. The 30D and 90D figures are the same over 30 and 90 days.

API request
GET https://api.taoswap.org/subnets/{netuid}/validators/

Response fieldresults[].apy_7d / results[].apr_7d

Basket composition (Share / vs all)

What a validator's basket holds, one row per subnet under the donut on its page: the alpha, its value in τ and $, its share of the basket, and how far that share sits from the subnet's weight in all baskets combined.

FormulaValue τ = what selling the holding alone would fetch; Value $ = Value τ × the TAO price; Share = Value τ / basket value × 100; vs all = Share − the subnet's share of all baskets' value combined, in percentage points. The bar is scaled to the largest holding, its tick at that all-baskets share.

The holdings come live from the chain, so they can run ahead of the API's hourly copy, and the all-baskets weights from the API. vs all is a difference in points, not a ratio: 12% against an average of 8% reads +4. The TAO cash row counts τ instead of alpha and closes the table whatever the sort. The donut slices the same values, and the mark on each legend bar is the same all-baskets weight. Of all baskets on /validators is that weight; Average share beside it weighs every basket the same instead.

Data source
GET https://api.taoswap.org/v1/beta-baskets/subnets/

Response fieldresults[].nav_pct

The holdings and the basket value are read live from the chain (BetaBasketRuntimeApi get_validator_basket_summary); /v1/beta-baskets/{hotkey}/ serves its hourly copy as holdings[] and nav_tao.

Basket concentration cap

The ceiling on how much of one basket's value a single holding may reach through a trade. It is checked on buys only, so a holding that grows past it through prices or dividends is left alone: it can be sold down, not topped up.

FormulaA buy is legal while realizable_value(destination) × 65535 ≤ BasketConcentrationCap × the basket's guarded value after the trade, each holding counted there at min(realizable value, alpha × slow moving price). Minimum holdings for a basket built by trades = ceil(65535 / cap).

The cap is a governance parameter that the hourly basket sync reads back from the chain, so the field always carries the current value. It binds trades, not accumulation: uncurated baskets hold single positions well above the cap, and only a sale brings them down. Kusanagi's own target allocation is fitted under it, which is why its largest weights sit at the ceiling and the excess is spread over the tail.

API request
GET https://api.taoswap.org/v1/beta-baskets/

Response fieldmeta.basket_trading.concentration_cap_pct

Basket flows (Deposited / Redeemed)

Two lifetime counters the chain keeps for each basket, in TAO: Deposited, the value added by everything that came in, root dividends as well as purchases, and Redeemed, what its holders' claims took out. The Flows view of a validator page's history card draws both as cumulative curves.

FormulaDeposited = Σ over every dividend and every purchase of the value it added to the basket, at what the holdings would sell for, so a purchase counts net of pool fees and price impact; Redeemed = Σ of what every claim paid out. Neither is ever reset, and each history point carries both totals as of its hour or day.

Deposited climbs with every root payout, even in a basket nobody bought into: purchases alone, with what each buyer paid, are at /v1/beta-baskets/{hotkey}/deposits/. Neither counter measures performance: (value + Redeemed) / Deposited reads a basket seeded at launch, with no matching deposit, as a winner, which is why performance reads the share price. Between two points, Δvalue − ΔDeposited + ΔRedeemed is roughly what prices and rebalancing did to the holdings. On a validator page the curves end on the chain's live totals; on /validators the two columns wait in Customize.

API request
GET https://api.taoswap.org/v1/beta-baskets/{hotkey}/

Response fielddeposited_tao / redeemed_tao / history[].deposited_tao / history[].redeemed_tao

?resolution=day&days=365 covers a year of daily points, resolution=hour up to 30 days; /v1/beta-baskets/ serves the two totals for every basket.

Basket performance

How the share price of a validator's basket moved over fixed windows of 1, 7 and 30 days (Perf 1D, Perf 7D, Perf 30D) and since the oldest daily snapshot on record ("Since start" on /swap/funds, "Perf all time" on /validators). It is what one share bought then is worth now, in TAO.

Formulawindow = share price now / share price at the hourly point exactly 1, 7 or 30 days before the latest hourly reading (the nearest earlier one within 3, 7 or 30 hours when that hour is missing); since start = share price now / share price at the basket's first daily snapshot, over the days since then, served as performance_days. The tables print (ratio − 1) × 100. Per day (/validators, in Customize) = (since-start ratio) ^ (1 / those days) − 1.

Share price, not basket value against deposits: a dividend mints new shares at the current share price, so the basket's value grows while the price barely moves, only the slice the basket's own TAO earns lifting it. Every basket reads the same span or a dash, which keeps the windows comparable; Since start begins at each basket's first daily snapshot, not at its opening, so it can cover much less than the basket's life, and the days shown with it say how much. A validator page shows the 7D and 30D windows, each with its gap to all baskets, and the 24H change under its share price is computed in the app: the chain's live share price against the hourly point 24 hours earlier (within 2 hours), so it can differ from Perf 1D.

API request
GET https://api.taoswap.org/v1/beta-baskets/

Response fieldresults[].performance_1d / results[].performance_7d / results[].performance_30d / results[].performance

performance_days gives the span of performance; /v1/beta-baskets/{hotkey}/ serves the same fields for one basket.

Basket purchase (entry cost)

What the Buy shares card of a validator page estimates before you sign: the share of the basket the amount buys, what entering costs in pool fees and price impact, and what your new shares are worth once that is paid.

Formulashare = amount / (basket value + amount) × 100; entry cost = Σ over the holdings other than the TAO cash of amount × the holding's weight × the Price impact, fee included, of buying that slice with TAO in its pool; value of your shares = amount − entry cost; minimum = the larger of 0.002 τ, the chain's stake minimum, and 1.1 × the amount whose slice of every holding buys at least one rao of it, rounded up to 0.0001 τ.

Estimates at today's pool prices, as the card says: the chain shows no preview. It splits the amount over the holdings in proportion to their value and mints shares on the value that added, at most what the least-covered holding allows, so the shares received can fall short of the estimate; the Portfolio shows the exact count. A pool the app cannot price leaves the entry cost as a dash rather than skipping that holding. The chain refuses a purchase into the basket of a validator without a root seat, which is why /swap/funds lists only those. A bought share earns only its price moves, no root dividend; the network fee is charged apart.

Data source
GET https://api.taoswap.org/v1/beta-baskets/{hotkey}/

Response fieldholdings[].realizable_tao, holdings[].spot_tao, holdings[].alpha

The weights come from these hourly holdings, the basket value in the share from the chain, and each pool is priced as the swap page prices it. What a purchase really cost shows afterwards at /v1/beta-baskets/{hotkey}/deposits/?coldkey=<coldkey>: tao paid against value_tao added.

Basket trading

How a root validator changes what its basket holds: it sells one holding for TAO and buys another with it, in one trade. Dividends stay on the subnet that earned them and a purchase of shares buys the existing holdings in proportion, so only a trade changes the mix.

FormulaEach leg must fill within 2% of the strictest of the subnet's Moving Price, its fast moving price (a two-hour half-life) and its spot price: a buy at no more than 1.02 × the lowest of the three, a sale at no less than 0.98 × the highest. The TAO through the middle, at least a minimum governance sets, comes out of a bucket worth daily_turnover_cap_pct of the basket's guarded value (see Basket turnover budget) that refills over 7200 blocks. After a buy the destination may hold at most liquidity_cap_pct of the pool's alpha reserve, its purchases there, fading out over 7200 blocks, may not pass that share either, and its realizable value may not exceed concentration_cap_pct of the guarded value.

Validators no longer publish a weight vector to direct their dividends: the chain cleared every one and removed the call, and /v1/root-weights/ now answers 410 Gone. /v1/beta-baskets/composition/ and /v1/beta-baskets/subnets/ serve the holdings that replaced it, which is what the baskets page draws. Trades go through swap_basket behind a network-wide switch, and governance can freeze a single basket. Rebalances 7D on /validators counts each basket's trades over the last 7 days; the /swap/funds head counts the baskets with at least one ("N rebalanced in the last 7 days") and lists the three that moved the most TAO through the middle (Most rebalanced (7D)).

API request
GET https://api.taoswap.org/v1/beta-baskets/

Response fieldmeta.basket_trading

results[].swaps_7d and results[].swapped_tao_7d count each basket's trades over the last 7 days and the TAO they moved; /v1/beta-baskets/{hotkey}/swaps/ lists them, newest first.

Basket turnover budget

How much TAO a validator's basket may still trade right now. The chain caps each basket's rebalances at a daily share of its value, kept in a bucket that refills block by block, which also bounds the harm a leaked trading key can do: at most this budget a day.

Formulabudget_tao = daily_turnover_cap_pct × the guarded basket value, each holding at min(realizable value, alpha × slow moving price). Each trade takes its TAO through the middle out of the bucket, which regains budget_tao / refill_blocks per block (7200 blocks, about a day) up to budget_tao. available_tao is the bucket now.

Read hourly from the chain for each basket, then charged with that basket's trades since and refilled up to the newest indexed block, which as_of_block gives. Null when the hourly sync did not read it. Once the bucket is spent, a trade waits for the refill, whatever its size, and a single large rebalance can use up the whole budget in one block.

API request
GET https://api.taoswap.org/v1/beta-baskets/{hotkey}/

Response fieldturnover

Beta basket (fund)

A per-validator fund that keeps a root validator's dividends as alpha, on the subnets that paid them, instead of selling them, so part of a root staker's yield sits in alpha the staker does not pick. Root stakers hold redeemable shares of it, as does anyone who buys some with TAO, and its value is what all its holdings would sell for, in TAO, added together.

Formulabasket value = Σ over its holdings of what selling each one alone would fetch, in TAO, its TAO cash at face value. share price = basket value / shares. A holder owns its shares / shares of the basket.

Redeeming hands a holder its pro-rata slice of every holding, sold to TAO and staked back on root with the same validator (claim_root, or claim_root_with_hotkey for one validator); the dust slices a claim skips stay in the basket. The API names the value nav_tao, for net asset value; read it rather than spot_nav_tao, which marks every holding at its spot price and ignores depth, so no redemption could actually get it. Growth belongs to neither figure: a dividend mints new shares for the root stakers at the value of that moment, so a basket can grow several times over with its share price flat, and only the slice earned by the basket's own TAO, which mints nothing, lifts the price. A bought share earns no dividend, only its price moves. That is why the history card on a validator page opens on the share price, set against all baskets, with NAV and Flows as its other views, and why the yield beside it comes from neither. See "Root staking APY".

API request
GET https://api.taoswap.org/v1/beta-baskets/{hotkey}/

Response fieldnav_tao

Childkey take

The share a validator keeps of what the stake its childkey parents, hotkeys of other coldkeys, delegate to it earns on this subnet. Separate from the take it charges its own nominators.

Formulacharged take = max(the hotkey's own childkey take, the network minimum, the subnet owner's minimum), in parts of 65535, shown in %. Each epoch, each other-coldkey parent gets its stake-weighted share of the validator's dividend × (1 − take − the childkey burn), and the validator keeps the take.

Capped at 18%. A raise waits 216,000 blocks (about 30 days) after the previous change on that subnet; a cut applies at once. A take set below a minimum adopted later is charged at the minimum, and a parent of the same coldkey pays nothing. Served up to about 15 minutes behind the chain.

API request
GET https://api.taoswap.org/subnets/{netuid}/validators/

Response fieldresults[].childkey_take

Delegator / Validator Earnings per Day

What the validator paid out over one UTC day, across every hotkey it runs, in TAO: the first figure is what its delegators shared, the second what it kept as commission. The page labels them Del. Earn. 24h and Val. Earn. 24h, but they cover the last complete UTC day, which their tooltips name, not the last 24 hours.

FormulaOver that day: delegators = Σ (alpha + root dividends) × that subnet's closing price of the day; validator = Σ of those dividends × take/(1 − take), the take being read from the chain at every epoch

A single day, not a rate, so it moves with the stake behind the validator and with what its subnets emitted that day: a large validator out-earns a small one at the same APY. That day is yesterday, or the day before while the ledger trails midnight; without a complete day in the last two, both figures are empty rather than older. The dollar figure beside each converts it at today's TAO price, not that day's. The childkey-take slice is counted inside these figures, not on top of them. A validator running a 0% take reads 0 on its own line while still paying its delegators in full. Only the validator's own page carries them, so a list of validators compares yields instead.

API request
GET https://api.taoswap.org/v2/validators/{hotkey}/

Response fielddelegator_daily_earning / validator_daily_earning / daily_earning_date

?omit=monitoring,stakes,history,delegators serves the summary alone; childkey_daily_earning carries the childkey-take slice.

Delegators

How many delegators are staking to the validator.

Formulathe number of distinct wallets holding a non-zero position on any hotkey the validator owns, across every subnet

Wallets, not positions: the delegator table on the validator's page lists one line per wallet, hotkey and subnet, so it is always longer than this count. The validator's own wallet is counted too, since its self-stake is a position like any other. There is no dust floor. An explorer counting wallet-and-hotkey pairs, or applying a minimum stake, will differ.

API request
GET https://api.taoswap.org/validators/

Response fieldresults[].count_delegators

Divergence

How differently a validator votes from the rest of the subnet on the selected mechanism: 0% votes exactly like the stake-weighted pack, and the higher the figure, the further from it.

Formulapack share of a uid = Σ over the voters of their share of that uid × their stake / the voters' total stake; divergence = ½ × Σ over every uid either side names of |the validator's share − the pack's share| × 100.

Computed in the app from the last weight vectors the chain stores (the last revealed ones on a commit-reveal subnet), so it is not Yuma's consensus: no median, no clipping. The validator's own vote is inside the pack, so a heavy validator reads low by construction: one with 60% of the stake reads at most 40%. A dash means the hotkey has no stored vector on this mechanism, or that the Weights section further down the page, which the column is computed from, has not loaded yet. Root's validators table has no Divergence column, root's page having no Weights section.

Data source
GET https://api.taoswap.org/metagraph/{netuid}/weights/

Response fieldvoters[].entries[].share

?mechid= picks the mechanism; each voter's shares are weighted by voters[].stake.

Dominance

What proportion of all validator stake on the network this one validator controls.

Formulatotal_stake / the summed stake of the validators shown in the list (those at or above 1000 τ) × 100

Same exit-value pricing as Total Stake. The denominator is the visible set, not the whole chain, which is exactly why the column adds up to 100%. A validator's own page divides by that same total. Validators under 1000 τ are absent from the list but do have a page of their own, and it serves them a dominance computed the same way.

API request
GET https://api.taoswap.org/validators/

Response fieldresults[].dominance

Fees (take)

The commission the validator keeps out of its delegators' rewards.

Formulathe chain commission of the validator's largest hotkey, as a percentage (the raw value is a 16-bit fraction, divided by 65535 and ×100)

A percentage, not a fraction: 18 reads as 18%. The chain applies it to the hotkey's dividend before the remainder reaches its delegators, so every yield on this page is already net of it. It is read per hotkey and a validator can run several with different commissions; the figure shown is the one of the hotkey holding the most stake, which the validator's page labels Take (main hotkey). A 0% take is real and not unusual, but 0% is also what a newly seen hotkey shows until the next commission read, every two hours, and what the Take column of a validator's subnets table shows on a subnet where the sync does not count the hotkey as a validator: the commission is only read there for hotkeys with more than 1,000 α of stake weight and either a validator trust above 0.001 or weights set in the last 20,000 blocks, or for a validator permit holder earning no miner incentive.

API request
GET https://api.taoswap.org/validators/

Response fieldresults[].take

Per subnet, the Take column of a validator's subnets table is monitoring[].delegate_take of /v2/validators/{hotkey}/, and that of a subnet's validators table results[].take of /subnets/{netuid}/validators/.

Holders (basket)

How many accounts hold a claim on a validator's basket: its root stakers, whose dividends the basket keeps, and the buyers of its shares.

Formulathe number of distinct wallets that stake root on the validator's hotkey or ever bought its basket's shares

Not the subnet Holders count, which counts the wallets holding a subnet's alpha. A buyer still counts after redeeming everything: a claim redeems bought shares and dividends as one balance, so nothing marks the buyer's exit, and the figure can run above the accounts holding shares today. Root stakers count from any non-zero stake, with no dust floor, as of the last stake sync. It is the Holders column on /swap/funds.

API request
GET https://api.taoswap.org/v1/beta-baskets/

Response fieldresults[].holders_count

Nominators / Validator / Childkey 7D (τ)

The TAO one hotkey earned on one subnet over the last 7 days, as a row of a validator's subnets table shows it, split three ways: what went to its nominators, what it kept as commission, and the part that came from childkey take.

FormulaOver the last 7 complete UTC days, in TAO at each day's close. Nominators = the alpha dividends that subnet paid, net of the take. Validator = the take, on both the alpha and the root dividends earned there. Childkey = the childkey-take slice of the pre-take dividend.

Amounts, not rates: they scale with the stake behind the hotkey, which is why the APY sitting beside them can be high on a small line and modest on a large one. The two columns are not symmetric: the nominator side counts alpha dividends only, since what root stakers earned is reported on the root line, while the validator side counts the take on both. Root lines are not shown in this table at all. On a childkey row the three are the child hotkey's own, its operator keeping the take. Blank, not zero, when the ledger holds no payment to the hotkey on that subnet over those 7 days, and blanked with the yields once yields_as_of is older than the day before yesterday. The childkey figure is a slice of the other two, so adding all three double-counts it.

API request
GET https://api.taoswap.org/v2/validators/{hotkey}/

Response fieldmonitoring[].nominator_return_7d_tao / validator_return_7d_tao / childkey_return_7d_tao

/subnets/{netuid}/validators/ serves the same three for every validator of one subnet.

Overlap (basket)

How much of a basket's mix all baskets combined also hold: 100% is a basket holding exactly the average mix, a low figure one that bets apart from it.

FormulaΣ over the basket's holdings of min(the holding's share of the basket's value, the subnet's share of all baskets' value combined) × 100, every share taken at what the holdings would sell for

The combined mix is the Of all baskets column of the per-subnet table on /validators, the basket itself included, so the largest baskets pull the average toward themselves and read higher. The TAO cash counts as a holding like any subnet. Null for a basket without value or without a holding worth anything. In Customize on /swap/funds, and above the composition on a validator page.

API request
GET https://api.taoswap.org/v1/beta-baskets/

Response fieldresults[].mix_overlap_pct

Parent validators (Gives / Stake Weight / Delegated)

The validators that delegate stake to a hotkey on one subnet through childkeys, listed when its row of a validator's subnets table is unfolded: the share of its stake each one gives, that stake's weight, and the weight that reaches the child.

FormulaGives = the parent's proportion for this child on this subnet × 100. Stake Weight = the parent's alpha on this subnet (α) + γ × its root stake (τ), γ being the chain tao weight. Delegated = the proportion × Stake Weight, in α

Stake Weight is in this subnet's alpha units, root counting at γ as in Root weight (validator), so it compares within one subnet only, and a parent's root stake counts in full on every subnet it delegates on. It is rebuilt from the stake Taoswap indexes on the parent hotkey, its own and its nominators', pallet custody left out, rather than read from the chain, so Delegated approximates the weight the chain moves to the child. A pending parent shows the share its queued list gives (→ x%) and the wait until its block; a parent whose queued list leaves the child out shows its share → 0%. Parents are listed heaviest Stake Weight first, and the tooltip on Stake Weight splits it into root τ and alpha.

API request
GET https://api.taoswap.org/v2/validators/{hotkey}/

Response fieldmonitoring[].parents[].proportion / .stake_weight / .delegated_stake_weight

Each entry also carries alpha_stake, root_stake, status and pending_activation_block; /subnets/{netuid}/validators/?parents=true serves the same entries for one subnet.

Root APY / APR (validator)

What one TAO staked on root through this validator was paid over a trailing window, as a simple annual rate. It is the root staker's yield, not a blend of the validator's alpha pools, and on root APY and APR are the same number.

FormulaAPR = Σ over the window's days and the subnets the hotkey validates on of root dividends (valued in TAO at that subnet's close of the day) / the hotkey's mean root stake in TAO × 365 / D × 100, D being the days of the window's complete UTC days that have ledger data, clamped to [0, 10000]. Windows of 7, 30, 90, 180 and 365 days. APY = APR. The validator's page shows the 365-day figure, else the 180-day, else the 90-day, else the 30-day one.

Shown in four places: /validators offers 7, 30 and 90 days in its Customize menu, root's validators table (/subnets/0) opens on APR 7D per hotkey, the validator's page shows the longest window the hotkey's history fills (labelled Root APY 1Y, 180d, 90d or 30d, its tooltip naming the window's UTC days), and /swap/funds shows the 30-day APR of /validators as Root APR, a dash where that list has none. A validator's figure is its main hotkey's, the one holding the most stake, and it is what the chain actually paid, already net of the validator take and of childkey redistribution. Root payouts are queued and minted as basket shares, so the root TAO the rate is measured on never grows and nothing compounds: the APY is the APR. Exactly 10000 means the real figure was clamped (the app prints >10000%). Every window is null, not 0, for a hotkey paid no root dividend over the last 7 complete UTC days; a wider window stays null until the hotkey's root history covers it, or while the dividend ledger is being rebuilt. Stale values are never carried forward, and the app blanks them all once yields_as_of is older than the day before yesterday. On /validators an asterisk marks a validator with under 10 τ of root stake, where a day's noise annualises into hundreds of percent. It is neither the basket's Root staking APY, which values these payouts as fund shares, nor an alpha staker's yield: see APY / APR 7D (subnet), which the list's Alpha APY / APR columns average over the subnets the hotkey validates on, weighting each by the TAO value of its stake there.

API request
GET https://api.taoswap.org/validators/

Response fieldresults[].apr_{7d,30d,90d,180d,365d} (apy_* repeat them)

The validator's page reads the same fields from /v2/validators/{hotkey}/; yields_as_of is the last UTC day of every window.

Root registration

Taking one of root's 64 seats. A seat directs a stream of root dividends, so the chain makes registration costly and rate-limited.

FormulaRoot hyperparameters, all on netuid 0: min_burn 1000000000 rao, max_regs_per_block 1, target_regs_per_interval 2, immunity_period 7200 blocks.

Governance can change these values, and the request serves the current ones. Registering also makes each subnet owner's hotkey a childkey of the registered hotkey, in the same transaction, unless auto-delegation is turned off for it first. Only a seat earns root dividends, so for a stake on root the validator pickers hide a hotkey without one, unless validators with no yield are shown. When root is full, eviction skips seats still immune and breaks ties on registration block, then uid. Taoswap has no screen for root registration: it is a validator operation done with btcli.

API request
GET https://api.taoswap.org/v2/subnets/0/

Response fieldhyperparameters

Root stake / Alpha stake (validator)

The two halves of a validator's total stake: TAO staked on root, and alpha staked across subnets (valued in TAO).

Formularoot = Σ of the positions on root, TAO for alpha at 1:1 since root has no pool; alpha = Σ of every other position, each valued through its own subnet pool. The two add up to Total Stake by construction

The alpha half carries the same slippage-aware valuation as Total Stake, so it moves with pool depth as well as with price. The Allocation donut on the validator's page splits this same pair; its stake chart does not: the Root stake line matches at 1:1, but the Alpha stake line prices alpha at spot (alpha_stake_tao of /validators/{hotkey}/history/), from a snapshot taken every two hours, so it usually reads above this half. alpha_stake_tao_with_slippage is its exit-valued twin.

API request
GET https://api.taoswap.org/validators/

Response fieldresults[].total_stake_root / results[].total_stake_alpha

Root staking APY

What one TAO staked on root with this validator earned over the last 30 days (7 or 1 when the basket has no reading that far back), compounded to a year, each dividend valued at the moment it was paid. It is the reward itself and not the market value of what the basket holds: the two are different numbers, and they do not even rank validators in the same order.

FormulaAPY = (the staker return series now / its value at the hourly point N days before the latest reading) ^ (365 / N) − 1, N being the longest of 30, 7 and 1 with a valid earlier reading (the nearest point up to 30, 7 or 3 hours before when that hour is missing), served as yield_window_days; yield_daily = the same ratio ^ (1 / N) − 1. The series (staker_twr) is the chain's own: it starts at 1, and every dividend multiplies it by 1 + the value that dividend added per rao of root stake on the validator, priced when it landed.

Each dividend is valued once, when it lands, so what its alpha does afterwards stays out of the rate: that belongs to the share price, which a dividend barely moves since it mints shares at the basket's value of that moment. Never negative: a basket that took no dividend over the window reads 0%, and a window whose reading fell, which only a basket that emptied and restarted or a hotkey swap can produce, gives way to a shorter one, null when none is left. The API serves the 1-day window too; the app withholds anything measured over less than 7 days, a dash in the tables and no rate in the note, rather than annualize one day 365 times. It is Basket APY on /swap/funds, Validator APY in the portfolio's Root Staking dialog (hidden by default; its info mark names the last 30 days, and a row measured over a week shows 7D), and the rate in a validator page's Basket note, "Root staking with … keeps your τ and pays …% a year". The Root APR column beside it on /swap/funds is the validator's root APR over 30 days, another measure of the same rewards.

API request
GET https://api.taoswap.org/v1/beta-baskets/{hotkey}/

Response fieldyield_apy

yield_window_days gives the window and yield_daily the daily rate; /v1/beta-baskets/ serves all three for every basket.

Root weight (validator)

The validator's root stake counted the way the chain counts it for emission, where TAO on root does not weigh 1:1 against alpha.

Formularoot stake × γ, γ being the chain tao weight (about 0.18), re-read from the chain at every subnet sync

A scaled TAO amount, not a ratio and not a second stake bucket, so never add it to the stake columns yourself. Same γ as the subnet Root Proportion. The list does combine it with the alpha stake in its own Total Weight column, which is the figure to use when comparing against explorers that discount root the way the chain does. Do not confuse γ with the owner share shown under Conviction, 0.18 by default but set per subnet: a different parameter entirely.

API request
GET https://api.taoswap.org/validators/

Response fieldresults[].root_weight

Share (childkey)

On a validator's subnets table, the part of its stake on that subnet the validator delegates to a childkey, a hotkey of another coldkey that validates with that stake. A change the validator has queued reads as today's share → the share it takes, with the wait until the chain applies it.

Formulashare = the chain's parent-to-child proportion for that hotkey and subnet (in parts of 2^64 − 1) × 100; wait = (activation block − current block) × 12 s. A queued list replaces the parent's whole list at its block, so a child it leaves out goes to 0%, and a child with no active share yet starts from 0%.

Only childkey rows carry one; the validator's own hotkeys read a dash. When several of its hotkeys parent the same child, the row shows the largest active share and Parent validators lists each. The wait assumes the 12-second target block time; once the block has passed, the row reads Pending until the next syncs, every 15 minutes, fold the change in. Queued changes are only tracked for the 128 largest validators by stake. The wait is the chain's childkey cooldown, which governance sets, and has nothing to do with the 216,000 blocks a childkey take raise waits (see Childkey take). The chips above the table count rows, not subnets: chk the childkey rows, pending those with a queued change, infra the validator's own hotkeys that are not inactive, and inactive the rows whose last weights are over 50,000 blocks old (about a week), which the table dims; a click shows only those rows.

API request
GET https://api.taoswap.org/v2/validators/{hotkey}/

Response fieldmonitoring[].proportion, monitoring[].pending_activation_block

Rows whose ownership is external. A queued change is the parents[] entry with status PENDING of one of the validator's hotkeys; the wait is counted against the live chain head.

Stake share (validator)

The split of a validator's own stake between root and alpha, drawn as a bar. It says nothing about the validator's size relative to others, which is Dominance.

Formularoot % = root stake / total stake × 100; alpha % = the remainder
Data source
GET https://api.taoswap.org/validators/

Response fieldresults[].total_stake_root, results[].total_stake

The bar splits the same total into its root and alpha halves.

Top 3 (basket)

How concentrated a basket is: the share of its value sitting in its three largest holdings.

Formula(Σ of the three largest holdings, each at what selling it alone would fetch) / basket value × 100, the TAO cash counted as one holding

A reading of what the basket holds, not a rule: the chain's ceiling on a single holding is the Basket concentration cap, checked on buys only, so a basket that never trades can carry far more in one holding. Null for a basket without value or without a holding worth anything. Shown on /validators, above the composition on a validator page, and in Customize on /swap/funds.

API request
GET https://api.taoswap.org/v1/beta-baskets/

Response fieldresults[].top3_pct

Total Stake (validator)

Everything a validator has behind it, root stake plus alpha across every subnet, expressed in TAO.

FormulaΣ over every position the validator holds: root at 1:1; alpha at its pro-rata share of its holder's whole alpha of that subnet, across every validator, drained into the subnet pool in one sale (constant product on the live reserves, before the swap fee)

Alpha is valued at roughly what its holder would fetch on exit, not at flat spot and not at the moving price, so it reads lower than a naive Σ(alpha × price) for large holdings; it is still slightly optimistic, since the swap fee is not deducted. The Accounts table values alpha the same way, so the two are directly comparable, though each reads the pools at its own sync. A position on a subnet with no pool is left out of the total rather than valued at zero. It is a snapshot from the last sync. The stake chart on the validator's page is valued differently: its Total stake and Alpha stake lines price alpha at spot, from a snapshot taken every two hours, so their last point usually reads above this figure, by the slippage it leaves out; /validators/{hotkey}/history/ also serves the exit-valued pair as stake_tao_with_slippage and alpha_stake_tao_with_slippage.

API request
GET https://api.taoswap.org/validators/

Response fieldresults[].total_stake

Value of the baskets

The head figures of the basket pages: what the baskets listed are worth together, and how many there are.

FormulaValue of the baskets (/swap/funds) = Σ nav_tao over every basket the page carries, worth 0.01 τ or more with shares outstanding and, once the chain answers, a validator holding a root seat, shown in $ at the live TAO price with τ under it; its Baskets = how many. Total in baskets (/validators) = Σ nav_tao over every basket the API serves; its Baskets = the rows its table lists, those under 0.005 τ left out until Show empty baskets is on.

The /swap/funds sum includes the baskets under 10 τ its table hides by default. Each basket is valued as if it alone sold its holdings, so the total is more than all of them could fetch at once from the same pools. Baskets frozen appears on /validators only while governance holds at least one basket out of trading.

Data source
GET https://api.taoswap.org/v1/beta-baskets/

Response fieldresults[].nav_tao

Every page, up to 200 baskets a page. /swap/funds keeps the baskets whose validator holds a root seat, which it reads from the chain.

vs all baskets (7D / 30D)

How a basket's share price did against all baskets over the last 7 or 30 days: above zero it beat the average basket, below zero it trailed it. The average is the All baskets line, a value-weighted index of every basket's share price.

Formulavs all = (the basket's share-price ratio over the window / the line's growth over the same hourly points − 1) × 100. The line opens at 1 on the window's first hourly point; each later point multiplies it by the mean of every basket's share-price change since its previous point, weighted by the basket's value at that previous point, a change below ×0.5 or above ×2 being dropped as a bad read.

A ratio, not a difference: a basket up 10% while the line rose 5% reads +4.76%, not +5%. Deposits and redemptions mint or burn shares at the basket's value, so the line follows what the baskets hold, not the money flowing in and out. A dash when the basket has no reading for the window or the line misses either end. It reads vs all (7D) and vs all (30D) in the /swap/funds and /validators tables and vs all baskets under each Performance window of a validator page, whose history card draws the line as All baskets, both curves starting at 0% on the first point they share. The /swap/funds head gives the line's own move as All baskets (7D), its 30-day move under it, and lists the three baskets worth 10 τ or more furthest Ahead of all (30D) and Behind all (30D).

API request
GET https://api.taoswap.org/v1/beta-baskets/

Response fieldresults[].vs_market_7d / results[].vs_market_30d

The All baskets line itself: /v1/beta-baskets/market/?resolution=hour&days=30, points[].index; resolution=day reaches 365 days. The app prints (ratio − 1) × 100.

Accounts & wealth

Free

TAO sitting in the wallet, not staked anywhere.

Formulathe free balance at the snapshot block, as the chain reports it

Free means not staked, which is not quite the same as spendable: it still includes the small existential deposit and any locked portion. It also excludes TAO the chain holds as a deposit, for a proxy or an on-chain identity, and that TAO appears nowhere on this row, so Total under-counts a wallet that has one.

API request
GET https://api.taoswap.org/accounts/

Response fieldresults[].free

Global rank

Where the wallet sits in the network-wide wealth ranking, 1 being the largest.

Formulawallets sorted by total (free + root stake + claimable root rewards + alpha stake) descending, equal totals broken by the raw byte order of the address. The alpha ranking is the same sort on the alpha stake alone

Not a ranking of the whole chain. The population is every wallet that has ever staked, plus pure holders above a free-balance floor (1 τ today), so a small wallet that never staked is absent entirely rather than ranked last. Ranks and the balances shown next to them come from the same daily snapshot, which is what stops a partial sync from reshuffling the top of the table; a wallet missing from that snapshot can still vanish from a page it used to occupy. Alpha carries the same exit-value pricing as everywhere else, which can reorder large alpha-heavy wallets compared with a flat-price ranking.

API request
GET https://api.taoswap.org/accounts/

Response fieldresults[].rank (results[].rank_alpha for the alpha-only ranking)

Share (Free / Root / Alpha)

How a wallet splits its own holdings between free TAO, root stake with its claimable rewards, and alpha: the Free / Root / Alpha column of the Accounts table. It is the composition of that wallet, not its share of the network.

Formulaeach share = its own amount / the sum of the three × 100, root counting its claimable rewards. Same denominator throughout, so they add to 100 by construction, except on a zero-balance row where all three read 0

Easy to misread: a wallet showing "80% Alpha" holds 80% of its own balance in alpha. For the wallet's standing across the network, read the rank instead.

Data source
GET https://api.taoswap.org/accounts/

Response fieldresults[].free, results[].staked_tao + results[].root_rewards, results[].staked_alpha_in_tao

The three percentages come from the row itself.

Stake (root) / Stake (alpha)

TAO staked on root with its claimable rewards, and all alpha across subnets valued in TAO.

Formularoot: Σ of the wallet's root positions, TAO for alpha at 1:1, plus what its shares in the root validators' funds would pay if claimed. Alpha: for each position, the TAO its own subnet pool would pay out for that alpha alone, summed

The root figure includes the claimable rewards, which the chain holds as shares of the root validators' funds (shares bought there count too), so it reads above an explorer showing root stake alone. It excludes free TAO, which the Total column adds back. Alpha is valued at roughly what it would fetch on exit, so it reads lower than flat-price or EMA-based figures, though it is still a little optimistic because the swap fee is not deducted. A position on a subnet with no pool is skipped rather than valued at zero.

API request
GET https://api.taoswap.org/accounts/

Response fieldresults[].staked_tao + results[].root_rewards, results[].staked_alpha_in_tao

Total (account)

Everything the wallet is worth in TAO: free, root stake with its claimable rewards, and alpha stake.

Formulafree balance + root stake (1:1) + claimable root rewards (what a claim would pay) + alpha stake valued through the pools, all four from the same snapshot block
API request
GET https://api.taoswap.org/accounts/

Response fieldresults[].total_tao

Portfolio & PnL

APY (α / τ / $)

Your annualised return over a trailing window. α counts only the alpha you earned, τ adds what the alpha did against TAO, $ adds what TAO did against the dollar. The position tables show τ and $ as the window's own return, not annualised.

FormulaPer position, time-weighted: each day's growth is measured on the alpha held that day, so a buy or a sale inside the window never reads as yield, and τ follows the subnet's end-of-day price rather than the position's exit value. Portfolio-wide, α chains the same days across your positions, each valued at its subnet's price that day; τ and $ stay organic: (end value rebuilt as if you had never deposited or withdrawn − starting value) / starting value, the alpha leg of your own flows removed then repriced at the end of the window and the TAO leg removed at the amount that actually moved. Both annualise over the days actually observed: a gain linearly, × 365/days; a loss compounds, ((end / start)^(365/days) − 1), and reads exactly −100% only when the position is emptied.

The asymmetry is deliberate: a linear gain stays readable on a young position, while a compounded loss cannot print below −100%, which is the real floor. The starting point is not simply the first day you held something: it is the first day you held at least 1% of your peak alpha for that window, which is what stops a dust prefix from printing an astronomical return, and it is why "days observed" can be shorter than the window you picked. The three dimensions answer three different questions and diverge on purpose: a positive α with a negative τ means you earned tokens while their price fell. Empty cells have several causes, not one: an alpha return above 1000% blanks all three (the guard against emission-funded and faucet wallets, with the absolute change shown instead), a wallet holding only root, basket shares or free TAO has no α dimension portfolio-wide, so that one alone stays empty in the Returns card while the Staked TAO row still fills its own α cell (root α is τ, and the root line is the stake with its claimable rewards), and a window with no qualifying starting day is empty throughout. A position, and the α of the whole portfolio, observed under 7 days get no annualised rate, and on a 30-day window the app flags a sample shorter than 15 observed days.

API request
GET https://api.taoswap.org/portfolio-pnl-apy/?account=<coldkey>

Response fieldapy.alpha, apy.tao, apy.usd, apy.return_tao, apy.return_usd, apy.days_observed (each keyed 7d / 30d / all)

The confidence rules on top of it are applied in the app.

Basket move (your position)

What the basket has done with the dividends your root stake earned since your last claim: those shares at their value today against their value when paid. Not annualized.

Formula(dividend_shares × today's value per share / dividends_tao − 1) × 100, today's value per share = your position's value / your owed shares (the owed shares at the basket's realizable NAV)

It isolates what Root APY (your position) leaves out by pricing each dividend when paid: positive when the alpha the basket holds gained against TAO since, negative when it lost. Shown as soon as there are dividends to compare, with no 7-day minimum, and a dash when the API's history does not reach back to your last claim. Shares you bought are not in it; Total APY (your position) counts them.

Data source
GET https://api.taoswap.org/v1/portfolio-root-yield/?account=<coldkey>

Response fieldresults[].dividend_shares, results[].dividends_tao

Today's value per share comes from the chain: your position's value over your owed shares, both from BetaBasketRuntimeApi.get_root_basket_positions.

Claimable / Claim fee / Worth claiming

In the Root Staking dialog, per validator: what claiming its basket would move to your root stake right now, what that claim costs, and what it leaves once paid. Total claimable, at the foot of the dialog, adds up every basket's Claimable.

Formulaclaimable = the chain's own preview of that claim: your owed shares, once the basket has credited the dividends it holds in queue, × the realizable value of its holdings without the dust slices the claim skips / every share. claim fee = the node's quote for a claim, flat whatever the basket holds, doubled for a redemption (a basket holding bought shares) that signs its own MEV Shield envelope, the envelope counted as one more claim fee, an upper bound. worth claiming = (claimable under the chain's claim minimum ? 0 : claimable) − claim fee

Claimable can differ from the Value of the Basket shares table either way: the preview first credits the queued dividends, then leaves the dust slices in the basket for its other holders (the info mark estimates them); without a preview it is that Value. Under the chain's claim minimum (0.0005 τ by default) a claim takes nothing and still pays its fee, so the row's Claim is disabled and Worth claiming is minus the fee; a negative figure means the claim costs more than it returns, for now. The chain takes each fee up front from your free TAO, one transaction and one signature per basket. Claim all skips the baskets under the minimum and those holding bought shares, which are redeemed on their own row since a claim would sell the purchase too, while Total claimable counts every basket and is the amount on the button that opens the dialog. Until the node quotes the fee, the dialog shows 0.008251 τ, the flat fee measured at runtime 468.

Cost basis (WAC / FIFO) & USD method

Two ways of deciding what a token cost you. WAC averages every purchase into one blended price. FIFO matches each sale against your oldest purchases. Then two ways of putting that in dollars: "throughout" records the dollar value at every trade, "then" computes the result in TAO and converts it at today's rate.

FormulaWAC: one running (quantity, cost) pair per hotkey and subnet. A buy adds its cost, a sale drains the cost pro-rata, staking rewards enter at zero cost, a same-subnet move carries its cost to the new hotkey, and a cross-subnet swap closes the position at the pool price and opens the destination one at what it paid. FIFO: the same events against a queue of lots, oldest consumed first. usd_throughout books each leg at the TAO/USD rate of the hour it happened (the day's close before February 2024, where the hourly record starts); usd_then converts the finished TAO result at today's rate

WAC is smoother and easier to read; FIFO is what most tax regimes expect. Likewise "throughout" is the rigorous accounting answer and the only one that adds up over time, while "then" reprices your whole history at today's rate. Never read a difference between two dates in "then" mode: a week in which you did not trade at all can show a dollar gain or loss purely from the TAO/USD move, sometimes with the opposite sign to your TAO result. Where the toggles apply is narrower than it looks: the four flavours are all served, but only the PnL dialog lets you switch between them. The holdings table is fixed on WAC in TAO, and the CSV export always writes FIFO with the throughout dollars, whatever you had selected.

API request
GET https://api.taoswap.org/portfolio-pnl-apy/?account=<coldkey>

Response fieldpnl.*.tao.{wac,fifo}, pnl.*.{usd_throughout,usd_then}

Market price vs If sold now

The two ways the portfolio can value your alpha, picked in Settings under Portfolio value. Market price counts every token at its pool's current price, as if size did not matter; If sold now estimates what selling everything right now would pay, so a large position gets a lower price.

Formulamarket price = α held × the pool's spot price. If sold now = per wallet and subnet, all that wallet's α on the subnet sold at once into the pool at constant product on the raw reserves, no fee: τ received = TAO reserve × α / (alpha reserve + α), then split over the wallet's hotkeys in proportion to their α. Free TAO and root count 1:1 in both

The gap is the cost of your own size: it widens with the position and with how thin the pool is. One sale per wallet and subnet is what a full exit would pay, and the rule the stored balance history follows, so the chart's live point continues it; a single hotkey's α sold alone would fetch more per alpha than its share of the joint sale. It is not the swap page's quote, which also takes the pool's fee and follows its weights, so a real sale lands slightly apart, usually lower. The choice moves the Total Balance, every row, share and slice, the chart with its 1D, 7D and 30D changes, and the Σ total on the swap card; Market price is the default, and beside its Total the If sold now figure shows once the gap passes 5% (basket shares aside, which keep their own value in both). Where Settings does not offer the choice, the page reads at market price while the chart and its changes read if sold now. Chart points stored before the market price was recorded keep their sale value, so a market-price line steps where those records begin.

Data source
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].price, results[].root_in_pool, results[].alpha_in_pool

Both are computed in the app against the pools read live from the chain. The stored history carries both: /portfolio-balance/ results[].staked_alpha_spot_in_tao and results[].staked_alpha_in_tao.

Net (basket shares)

Your whole position in one validator's basket, root rewards included, against what you paid for the shares you bought into it since your last claim of it: the Net column of the Basket shares table.

Formulanet = value − paid, in τ; net % = (value − paid) / paid × 100. value and paid as in Value / Root rewards / Paid / Gain or loss (basket shares): your owed shares at the basket's realizable NAV, and the τ your purchases of this basket cost since your last claim of it

Without purchases nothing was paid, so the net is the root rewards alone and carries no percentage. Root rewards cost nothing, so on a position that mixes them with purchases the net reads well above the Gain or loss of the purchases alone. A claim or a redemption takes the whole position, so paid restarts at zero after one. Empty while the cost of the purchases cannot be read.

Data source
GET https://api.taoswap.org/v1/beta-baskets/{hotkey}/cost-basis/?coldkey=<coldkey>

Response fieldpaid_tao

The value is read from the chain, as your owed shares at the basket's realizable NAV; the endpoint gives what your purchases since your last claim of the basket cost.

PnL (Realized / Unrealized)

Realized is the profit or loss you have actually booked by closing positions. Unrealized is what you are up or down on what you still hold.

FormulaRealized: for every sale (a plain unstake, a transfer out, or the origin side of a cross-subnet swap or move, which the chain executes as a sale in the origin pool), and every burn, the proceeds minus the cost basis consumed. Unrealized: what you hold on-chain × the latest hourly close of its subnet, minus the cost basis left against it. Root counts as cash, like free TAO, and carries no PnL

Unrealized marks your alpha at the hourly closing price, with no fee and no slippage, so it reads higher than the exit-value pricing used for validator and account totals: it answers "what is it worth", not "what would I get". Swapping or moving alpha to another subnet goes through both pools, so it books the gain or loss on the subnet you leave and the destination position starts at what the swap paid for it; moving alpha between two of your hotkeys inside one subnet realizes nothing and carries its cost across; a burn realizes the full loss. Sending stake to another wallet books a real disposal at the market price inside Realized, and receiving it opens a fresh position at the price on arrival rather than inheriting the sender's basis. Both figures come in a WAC and a FIFO flavour (see Cost basis) and in two USD flavours. Realized 24h is the change since the previous daily snapshot rather than a rolling 24 hours, so it steps once a day; the baseline is anchored to the snapshot date, so a late sync shifts the window instead of breaking it, and the payload names the date it started from. Unrealized 24h is a different animal: a live trailing window, what you hold right now × (price now − price 24 hours ago), recomputed on every request with no cost basis involved, so it moves with the market all day and exists from the first day you hold something.

API request
GET https://api.taoswap.org/portfolio-pnl-apy/?account=<coldkey>

Response fieldpnl.realized, pnl.unrealized (each: tao.wac, tao.fifo, usd_throughout, usd_then); rolling_24h.unrealized_tao (live 24h, global and per subnet)

Computed over your whole trade history.

Root APY (your position)

What your own root stake with one validator was paid since your last claim of its basket, per year: the dividends at their value when paid, against the stake you actually held. It is your rate, not the validator's, which the Root Staking dialog shows as Validator APY (see Root staking APY).

Formula((1 + dividends_tao / stake_tao_days)^365 − 1) × 100, the τ paid per τ·day of root stake compounded daily over a year. dividends_tao = the basket shares your stake earned between each pair of consecutive basket readings (your average stake × the shares the basket minted per staked τ in between), each priced at the average share price of those two readings; stake_tao_days = your stake × the days held, from the first to the last reading since your last claim

A dash until your stake has been held 7 days since your last claim, while the basket has fewer than two readings since then, and when the API's history does not reach back to that claim (a stake held since before the history starts, until a claim restarts the window, or a basket that restarted). Readings are hourly, daily before the hourly ones begin, so the rate moves once an hour. Stake added or removed counts only for the time it was held, which is why the rate can differ from Validator APY, measured on 1 τ staked through the validator's own window. Never negative: a dividend is a payment, and what the basket made of it since is the Basket move (your position).

Data source
GET https://api.taoswap.org/v1/portfolio-root-yield/?account=<coldkey>

Response fieldresults[].dividends_tao, results[].stake_tao_days, results[].staked_days, results[].complete

One row per validator, matched on results[].hotkey; the rate itself is computed in the app.

Stake transfers (in / out)

Alpha or TAO you moved to or received from another wallet, valued at the price when it moved. Shown for context, never added on top of your totals.

FormulaStake transfers: alpha that entered or left this wallet through a wallet-to-wallet transfer on a subnet other than root, counted at the TAO value the chain recorded for the move, plus its dollar value at the TAO/USD rate of that hour. TAO transfers: plain TAO in and out of the free balance, plus root stake sent to or received from another wallet, whole-wallet only. Both are all-time cumulative

A transfer of alpha out is already counted inside Realized as a disposal at market price, which is why adding these on top would double-count. Root carries no PnL, so root stake moved between wallets counts with the TAO, like cash. On the receiving side the alpha arrives with a fresh cost basis at the market price of the day rather than the sender's basis, so moving stake between two wallets you both own resets your entry price. Moving alpha between your own hotkeys or subnets is a different operation and is not counted here at all.

API request
GET https://api.taoswap.org/portfolio-pnl-apy/?account=<coldkey>

Response fieldpnl.transfer_stake_in / _out, pnl.transfer_tao_in / _out

Cumulative, all-time, valued at the market price when the transfer happened.

Total APY (your position)

What your whole position with one validator made since your last claim of its basket, per year: the dividends and the shares you bought, both at their value today, less what the purchases cost, against the root stake and the τ of purchases you held over that time.

Formula((1 + (position now − bought_tao) / (stake_tao_days + bought_tao_days))^365 − 1) × 100. position now = (dividend_shares + bought_shares) × today's value per share (your position's value / your owed shares); bought_tao = the τ those purchases cost; bought_tao_days = each purchase's τ × the days it was held, from its block or the window's first reading, whichever is later, to the last reading

A dash until the stake, or the oldest purchase since your last claim, has been held 7 days, and when the API's history does not reach back to that claim. Valued at today's prices, it can be negative, unlike Root APY (your position). Without purchases it prices the same dividends as Root APY (your position), at their value today instead of when paid, so the gap between the two comes from the Basket move (your position).

Data source
GET https://api.taoswap.org/v1/portfolio-root-yield/?account=<coldkey>

Response fieldresults[].dividend_shares, results[].bought_shares, results[].bought_tao, results[].stake_tao_days, results[].bought_tao_days, results[].staked_days, results[].bought_days

Today's value per share comes from the chain, as for Basket move (your position).

Value (transfers)

What a row of the Transfers table was worth in dollars when it moved: its τ, or on an alpha transfer the τ the chain recorded for the move, at the TAO price of that hour.

Formulavalue = tao_rao / 10^9 × the TAO/USD price of the hour holding the block, else the closest hour before (the day's close before February 2024, where the hourly record starts). tao_rao = the τ sent or received; on an α transfer, the τ the chain recorded on your side of it: α × the pool's spot price inside one subnet, where no pool is used, or the τ that went through the pools when the transfer crosses subnets

A value at the time, not today: Value now, a column of the Transactions table, prices the τ at the current rate instead. A dash when the row carries no τ or no price covers its hour. On an α transfer it states what the α was worth when it moved, not what it is worth now. These are the transfers one by one; the PnL dialog keeps their all-time totals (see Stake transfers (in / out)).

Data source
GET https://api.taoswap.org/v1/account-ledger/?account=<coldkey>&kinds=tao_transfer_in,tao_transfer_out,alpha_transfer_in,alpha_transfer_out

Response fieldresults[].tao_rao, results[].tao_price_usd

The product is taken in the app; tao_rao is in rao, so divide it by 10^9 for τ.

Value (τ) / Share

What a position is worth in TAO under the valuation the page uses, and how much of the Total Balance it represents.

Formulavalue = the position at Market price or If sold now, whichever the page uses (see Market price vs If sold now), free TAO and root at 1:1. share = value / Total Balance × 100, the Total Balance being every position held, in the same valuation, plus your basket shares

Live balances and pool reserves come straight from the chain, so the portfolio never lags behind your wallet. Switching the valuation changes every value, and therefore every share, at once. Under If sold now each hotkey row carries its part of the wallet's one sale on that subnet, so the rows of a subnet add up to it. The basket shares (root rewards and any shares you bought) take a row of their own, one line per basket, at your owed shares × that basket's realizable NAV whichever valuation the page uses: they leave through a claim, never through a swap, which is why the Staked TAO row counts the stake alone. The chart's Rewards / Basket button draws that series alone. The If sold now column always shows the sale value, whatever the page's valuation.

Data source
GET https://api.taoswap.org/portfolio-balance/?account=<coldkey>

Response fieldresults[].staked_alpha_spot_in_tao, results[].staked_alpha_in_tao, results[].root_rewards

Live positions are read from the chain; this is the stored history the balance chart draws, the alpha valued both ways and the basket shares apart.

Value / Root rewards / Paid / Gain or loss (basket shares)

Your shares of one validator's basket, as the Basket shares table and the Your position card of a validator page state them: what they are worth, how much of it is root rewards, what the shares you bought cost, and the gain or loss on those purchases alone. Share of basket is the part of the whole basket they make up.

Formulavalue = min(owed shares × realizable NAV / every share of the basket, realizable NAV), the NAV being what selling each holding whole through its pool would pay, no fee, added up; owed shares = your root stake × the basket's accumulated shares per staked τ, less those already claimed, bought shares included. paid = the τ your purchases cost since your last claim of this basket; bought part = value × min(1, shares those purchases received / owed shares); gain or loss = bought part − paid, in τ and as % of paid; root rewards = value − bought part, the whole value without purchases. share of basket = owed shares / every share of the basket × 100

Read from the chain, not from the API's snapshots, when the page loads and after each claim; dividends the basket has queued and not credited yet are in neither the shares nor the NAV. This value is what the Basket shares row in Balances adds up, before the dust slices a claim skips, so the Root Staking dialog's Claimable can differ (see Claimable / Claim fee / Worth claiming). Root rewards cost nothing and stay out of Gain or loss, which judges the purchases alone at the same NAV: a fresh purchase reads as a small loss at once, since the τ it pays buys the basket's holdings through their pools and adds less than that to the NAV. A claim or a redemption takes the whole position, bought shares included, so Paid restarts at zero after one. Root rewards, Paid and Gain or loss stay empty while the cost of the purchases cannot be read, and on a validator page until the API has read your latest purchase or redemption there, so a purchase it has not counted never reads as root rewards. The table hides baskets worth under $10 until Show dust.

Data source
GET https://api.taoswap.org/v1/beta-baskets/{hotkey}/cost-basis/?coldkey=<coldkey>

Response fieldpaid_tao, shares

The value and the share of basket are read from the chain (BetaBasketRuntimeApi: get_root_basket_positions for the owed shares and their value, get_validator_basket_summary for every share); the endpoint gives what your purchases since your last claim of the basket cost and the shares they received.

Trading

Estimated received

What you would still receive if your slippage tolerance were used up in full. It is an estimate of the low end, not a guarantee.

Formulaexpected output × (1 − slippage tolerance / 100)

Called "estimated" rather than "minimum" on purpose: the chain is never given an amount, only a price limit, so nothing enforces this figure directly. With partial fill off (the default) the trade is all-or-nothing at a price no worse than your limit, so you land at or above it. With partial fill on, the chain fills only what fits under the price limit and refunds the rest, which can settle well below this number, with no error and no warning. A normal trade lands on the expected output, not on this.

Data source
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].root_in_pool, results[].alpha_in_pool

Derived from the simulated output. Simulated against the pool reserves, weights and fee read live from the chain; this endpoint is only the fallback when the chain connection is down, and it carries neither the weights nor the fee.

MEV Shield

Submits your swap encrypted, so nobody can read it while it waits in the queue and trade in front of it. It is only decrypted once its place in a block is fixed.

Formulaextra fee = 0 through the relay (one signature), or the envelope's network fee in self-custody (two signatures); extra delay ≈ 2 blocks

Your signed swap is sealed with post-quantum encryption for the key of the validator due to build a block about two blocks ahead. Only that validator can open it, and it does so inside the block it is building, so the envelope and the revealed swap land together in that block: the two blocks are the wait for a builder that holds the key. Either the relay carries and pays for the sealed envelope, or you send it yourself. The relay never sees the contents of your order, though it does receive your wallet address in the clear, so it knows that you traded and when, not what. Each mode can be turned off on the server side, so the toggle is not always available.

Network fee

What the blockchain charges to include your transaction. Taoswap takes no fee of its own.

Formulathe chain's own estimate for the transaction itself, plus, in MEV Shield self-custody, its estimate for the envelope the wallet also signs

Not to be confused with the pool fee, which is about 0.05% taken out of the token you put in and is already inside every quote on the page. That pool fee does not go to the subnet: it goes to whoever builds the block. It is a per-subnet chain parameter that only governance can change, up to a hard ceiling well above the current value, so it is not necessarily the same everywhere. The envelope adds a smaller fee, priced on a stand-in of the same length, so its share is close but not exact. Smart Actions shields its batch the same way, and in self-custody its estimate adds the envelope too. The network fee is paid even when the trade is rejected for exceeding your slippage tolerance, and on a sale or an alpha-to-alpha swap a wallet with no free TAO still pays, out of the position itself.

Price impact

How much worse your effective price is than the quoted pool price, from your own trade moving the pool and from the pool's 0.05% fee. The movement grows with your size and shrinks with pool depth.

Formula(what your input is worth at the pool spot price − what the curve actually returns, fee included) / what your input is worth at the pool spot price × 100

The number covers the subnet fee as well as the curve movement, so it is the whole cost of the trade, as a share of what your input is worth at spot: it never passes 100%, and a trade that loses half its value reads 50%. Your own impact does not use up your slippage tolerance: the price limit already includes it, so the whole tolerance is left for the market to move between signing and inclusion (see Slippage tolerance). Only the curve part stays in the pool; the fee itself leaves the pool and goes to whoever builds the block. Splitting a large order costs less only if the price recovers between the pieces: traded back to back, they move the curve as much as one order. The 1% and 5% marks colour the figure rather than warn you: the actual warning fires on the dollar cost, above $100. Free TAO and root trade 1:1, so their impact is 0.

Data source
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].root_in_pool, results[].alpha_in_pool

Simulated against the pool reserves, weights and fee read live from the chain; this endpoint is only the fallback when the chain connection is down, and it carries neither the weights nor the fee.

Slippage tolerance

How far the price may move against you between signing and inclusion before the chain refuses the trade. Default 0.5%, minimum 0.1%.

Formulathrough one pool: price limit = the pool price your trade leaves behind × (1 + tolerance/100) on a buy, × (1 − tolerance/100) on a sale. Alpha for alpha: price limit = the expected exchange rate without the fee × (1 − tolerance/100). Sent with the transaction as a price in TAO per alpha, or as an origin/destination price ratio between two staked positions

Your own price impact is already inside the limit: through one pool the app builds it from the price your trade leaves in the pool, which is the price the chain checks, so the whole tolerance is left for the market to move between signing and inclusion. Set it too low and ordinary movement makes the transaction fail. A rejected swap costs the network fee and nothing else. With partial fill enabled the chain executes what fits under the limit and refunds the rest instead of rejecting everything, though it still rejects outright if the price is already past your limit when the transaction lands. Swapping alpha for alpha is only approximately bounded, because the chain checks that limit with an approximation, and a move between validators of one subnet carries no limit, since it never touches a pool. The 0.5% default and 0.1% minimum apply on the swap page and in the cart; Smart Actions starts from the same setting and offers wider presets.

Data source
GET https://api.taoswap.org/v2/subnets/

Response fieldresults[].root_in_pool, results[].alpha_in_pool

The price limit is derived from the live chain reserves and sent with the transaction.