Methodology

SwapScope publishes reference prices for order-book atomic-swap markets. Everything below is what the pricing engine does, stated precisely enough to be checked against the numbers it publishes: the rejected volume, the rejection reasons and the confidence components are all served alongside the prices themselves. It is versioned, and when a rule changes the version is bumped and the change is recorded in the history at the end of this page. Current version: v1.5.0.

0. Two networks

Prices are computed separately for each of the two networks this data comes from: GLEEC's netid 6133 and the Komodo network's netid 8762. They run the same protocol over the same coins at different taker fees, and no order on one can be taken from the other, so pooling them would average two markets that never trade with each other. A pair on the primary network keeps its plain id; the same pair on the other is written base/quote@8762. A USD conversion route never crosses a network boundary. Everything below applies within one network. The two networks explains the split, when it happened, and how a swap is attributed to one.

1. Data and definitions

Only successfully completed atomic swaps can establish a reference price. Open orders are never treated as trades. Each market is stored in one canonical direction (the higher-ranked asset is the quote; ties are broken alphabetically), so observations of RXD/LTC and LTC/RXD are directly comparable. We keep these values separate and label them as such:

2. USD conversion routes

Anchor providers (CoinGecko, CoinPaprika, the GLEEC price service) supply USD prices for quote-grade assets only: approved quotes such as LTC, BTC, ETH, KMD, DOGE and USD stablecoins. The median across providers is used; provider disagreement and age reduce route quality but are published, not hidden. The disagreement penalty is measured from the provider furthest from the median, not from a robust average of them, so a single source far out of line lowers confidence sharply while the median holds the price steady. That is deliberate — sources disagreeing by a third is a fact worth surfacing — but it means a low score here can mean one bad feed rather than an uncertain market, and the anchor comparison on the asset page shows which. A DEX-priced asset such as RXD is never priced from its own external aggregator quote; that value is shown separately for comparison.

Routes form a graph: pair reference prices (bidirectional) and anchor edges to USD. We enumerate simple paths up to 3 hops, score each by the product of hop qualities with a 10% penalty per extra hop, and select the best; ties prefer fewer hops. The selected route is always displayed (for example RXD → LTC → USD) alongside alternatives and the divergence between them.

3. Trade eligibility and weights

Every completed swap in the 7-day window is evaluated for:

On-chain evidence. Trades carry one of two kinds, shown separately because they are not equally strong. The public swap records carry no transaction ids, so all that can be done with them is to look for a transaction moving exactly the swap's amount, on the right chain, touching the address derived from that party's pubkey, near the swap time. That is an amount match: evidence of settlement, not proof, since it does not establish that the transaction was an atomic-swap contract or that the two legs were linked. When SwapScope runs its own node as a network seed, the node keeps the protocol's full event log for every swap it relays, and those records name the transactions outright on both chains. A named transaction that is then found on the chain is verified; one the record names that no server has returned yet is stated. Those records also carry the hash both halves of the swap are locked to and the preimage published when the first side claims. Where both legs are found on their chains carrying that hash, and the preimage hashes to it, the pair is proven: the two payments are shown to be one atomic swap rather than two transactions that line up, and every step can be repeated from the chains. That is a claim about the link and not about the outcome: a swap can be proven and still have failed, because the preimage becomes public when the first side claims, and the second side's claim can be rejected afterwards, leaving one payment unspent until it is refunded. Whether a swap completed is read from its own protocol log, not from this. A transaction is cited for at most one leg: where a party repeats the same trade size, the only candidate may already belong to another swap, and the leg is then marked ambiguous rather than claiming the same movement twice. Pubkeys are never stored: they are hashed on ingestion, and the amount-match path re-reads the public record and discards the key.

How a chain is read. A swap settles in one of two ways and each is read on its own terms, with the same standard of proof. On a chain whose contracts are scripts, the payment pays a hash-timelock and publishes the hash it is locked to; the spend publishes the preimage. Both are read from the transaction's scripts through an Electrum server. On a chain whose contracts are calls, the payment and the spend are calls to that network's atomic-swap contract, and the same two values sit in the call's arguments instead; both are read from an ordinary node of that chain. Server lists, the contract address and which chain is which all come from the network's own coin repository rather than from anything of ours. A call carries one thing a script cannot: the address it was made to, so a leg on a contract chain is additionally shown to have gone to that chain's declared swap contract rather than merely to have happened.

What is not possible on a contract chain is amount matching. It works by deriving a party's address from their pubkey and reading that address's history, and on a contract chain the money moves to the contract rather than to either party, so there is no address of theirs to watch. A leg there with no protocol record is therefore reported as unsupported and never as not found: nothing was looked for, so nothing failing to turn up would mean anything. Chains that mark a swap in neither way leave nothing to find either, and a leg stays at verified rather than being demoted for it.

Weight = sqrt(usdNotional) × recencyFactor × quoteQuality × routeQuality × anomalyFactor. Small trades are not deleted: they remain visible as raw activity but carry little or no weight.

4. Reference price

The reference price is a weighted median of eligible trades, after capping any single trade at 30% and any single observable participant at 40% of total weight. Because it is a median, one large trade cannot drag the price and a series of tiny trades cannot dominate it.

Repricing. The newest cluster of trades is compared with the rest of the window. A move larger than 15% becomes the reference only when confirmed by at least 3 materially unflagged trades from at least 2 observable participants, no single participant being party to more than 60% of them, with at least $20 notional over at least 30 minutes; a strong cluster (twice the trade requirement) or executable order-book support at the new level also confirms. Until then the established price is retained and the candidate is published as indicative with an UNCONFIRMED_REPRICING flag. A cluster consisting only of flagged trades is ignored (UNSUPPORTED_MOVE). Confirmed repricings supersede older trades at the old level.

5. Staleness

Freshness is the age of the newest reliable trade: under 1 hour Live, 1–12 hours Recent, 12–24 hours Low confidence, 1–7 days Stale, over 7 days No reliable current price. Confidence decays continuously between these boundaries. An order book may provide an indicative price but never resets trade age.

A stale price is the last one that was measured, republished. That matters on the price history chart, where a market nobody traded for a fortnight would otherwise draw as a fortnight of perfect stability. Stored history keeps every status, so those stretches are drawn apart from measured ones and periods that could not be priced at all are left as gaps rather than joined across.

6. Candles

OHLCV candles are built from completed swaps and published in two kinds. Raw candles include every successful swap, so they show what the market did. Filtered candles include only trades that were eligible for the reference price and not materially flagged, so they show what the methodology was willing to price from. The gap between the two lines is the part of the market that carried no price information.

Raw candles are derived directly from stored swaps, so they cover the whole record at every interval. Filtered candles depend on an evaluation, which is judged against the trades around it and as of a moment, so historical ones exist only at the intervals a reprocess can speak for — daily and weekly for older periods. A filtered line that stops short on an intraday view of old data is that limit, not missing trades.

7. Confidence score

A 0–100 score with published components: reliable 24h USD volume (15), eligible trades (10), independent observable participants (15), age of the latest reliable trade (20), bid/ask spread (10), executable depth within 5% (10), agreement between pairs (5), agreement between anchor providers (5), share of raw volume not rejected (5), influence concentration (5). An unconfirmed repricing multiplies the score by 0.7. Levels: High ≥ 70, Medium ≥ 45, otherwise Low; Stale and Unavailable follow the freshness state.

8. Manipulation detection and its limits

Participant identifiers are keyed hashes of the pubkeys carried in public swap records. The pubkey itself is never stored, and because the key is secret, a pubkey cannot be tested against this data to find out whether it traded. The hashes let us detect repeated counterparties and round-trips, but a determined actor can rotate keys, and an honest market maker legitimately appears in many trades. Flags therefore discount influence rather than prove intent, are published with codes and explanations, and are never claims about real-world identities. Order-book participant data is only available when SwapScope runs its own KDF node; with the public defi_stats source alone, order books carry price and volume only and the UI says so.

What this data cannot show is someone trading with themselves. The protocol refuses to start a swap when both sides present the same pubkey, so the SELF_TRADE check is an invariant rather than a detection: it has never fired, and if it ever does, the record is wrong rather than the trader. Two parties who are in fact one person look exactly like two parties, because telling them apart needs knowledge of who owns which address, and no public swap record carries it. So the most this site can honestly report is the shape of the activity, which is what the flags above describe. Value moving back and forth between the same two participants is visible here; whose value it is, and why they moved it, is not.

9. Versioning

Raw swaps are never rewritten. When the methodology changes, the version is bumped and derived series are recalculated explicitly under the new version so that both can be compared.

Version history
Every change to the price-integrity engine.
v1.5.0 (2026-09-23)
A market is a pair on a network. Prices are computed per network and never pooled across them.
  • The framework runs several networks, told apart by a netid, and a node on one never hears a swap from another. GLEEC moved to netid 6133 with a taker fee of 2% when it acquired the DEX; the holdouts stayed on 8762 at 0.13%. The public feed served both without saying which, so every reference price until now was computed from two markets no single taker can trade across. 229k of 239k swaps were on 8762
  • Every swap now carries a netid. The framework's version is the label: v3 defaults to 6133 and GLEEC ships v3 only there, v2 defaults to 8762, and across 239k swaps not one paired a 3.x side with a 2.x side. A source that sits on one network labels what it saw by being there; before v3.0.0-beta (2026-03-06) there was only one network to be on. A swap the feed reports a netid for takes the feed's word
  • A pair on the primary network keeps its id (rxd/ltc); the same market on another network is its own pair (rxd/ltc@8762). Reference prices, candles, liquidity, flags and corroboration are per pair and therefore per network with no change to how any of them is computed
  • An asset's USD price and its route are per network too: a route never crosses networks, so an asset can be worth one thing on 6133 and another on 8762, and both are published
  • Order books come from a node on 6133 and are attached to that network's pairs only
  • The recorded swap price excludes the taker fee, which is paid separately to the fee address. A taker's effective cost sits above the reference by about 2% on 6133 and 0.13% on 8762; the reference stays the traded price
  • The 1.4.0 series stays as it was, under its own version, as the record of what was published. Every 1.5.0 series is computed fresh from labelled swaps
  • No change to weights, thresholds, staleness, repricing gates or anomaly scoring
v1.4.0 (2026-09-20)
A trade is valued in the money of its own moment, rather than every trade in the window being converted at the newest rate.
  • USD notional now uses the quote asset's anchor nearest the trade's own time, falling back to the current anchor when no observation sits within 36 hours of it
  • Thirty-six hours is wide on purpose. Live collection samples every few minutes, so for recent trades the nearest observation is minutes away and the cap never binds. It binds on backfilled history, where providers return one point per day beyond about three months: a rate from within a day and a half of a trade is a far better answer for that trade than today's rate, which is the only alternative
  • Nearest rather than most recent before: an observation minutes after a trade describes its world better than one hours before, and the anchor job samples often enough that the two rarely diverge
  • Providers are collapsed per minute by median, as the live consensus already does, so one provider briefly wrong cannot reprice a day of trades
  • This is a scoring change, not a display one. USD notional decides whether a trade clears minNotionalUsd, so revaluing it changes which trades are eligible, and therefore the reference price, volumes and confidence
  • The effect is small over a 7-day window on a stable quote and large over a long one. It is a precondition for holding more than a few weeks of history: without it a swap from two years ago would be counted in today's money, and its eligibility decided by a rate that did not exist when it happened
  • Stablecoin quotes are unaffected, since par is par and consulting a history of it would add noise rather than accuracy
  • No change to how anchors are collected, to route selection, or to any threshold
v1.3.0 (2026-09-17)
The minimum meaningful notional drops from $5 to $1, widening coverage without reaching the dust that dominates this network by trade count.
  • minNotionalUsd default 5 → 1. Trades below it are still excluded outright, not discounted
  • Chosen from the network's own distribution: measured across every pair with a trade in a 14-day window, a $5 floor covers 80% of value from 8.8% of trades, and $1 covers 88% from 16.6%. Below about $0.50 the curve knees sharply, reaching 97.6% of trades for only 8 more points of value, which is the boundary where a floor stops filtering and starts importing noise
  • Unchanged: tinyNotionalUsd stays at $1, so every below-minimum trade is now also flagged tiny and that flag no longer distinguishes degrees of smallness. It was always informational, since anything under the minimum was excluded either way
  • This does not make dust-only pairs priceable. CHTA/FIRO's largest trade in 24h was $0.30 against a median of $0.05; pricing it would need a floor near zero, and with 5 observable participants the result would carry a confidence in the teens
  • Per-asset overrides still apply, so a single coin can set its own minNotionalUsd without moving the default
v1.2.0 (2026-09-17)
An external anchor may ratify a repricing that participant concentration alone was blocking, and a large gap from the anchor is now published as a flag.
  • RAPID repricing gate: when participant concentration is the ONLY unmet condition, the move confirms if a fresh anchor from at least 2 providers sits within 10% of the candidate AND the candidate is closer to the anchor than the held price. Recorded as confirmedBy: external_anchor
  • The anchor never originates, directs or sizes a move. It cannot rescue thin evidence: too few trades, too little notional or too short a span are untouched. It can only pull the published price toward the external consensus, never away from it
  • Rationale: on a thin market one maker is the counterparty to nearly every trade, so concentration alone could hold a price indefinitely. RXD published 45% below every external source for this reason
  • New market flag ANCHOR_DIVERGENCE (severity warn, penalty 1, informational) when the published USD price is more than 25% from the external anchor. It never adjusts the price; it states the disagreement
  • New thresholds: anchorCorroborationTolerancePct (10), anchorCorroborationMinProviders (2), anchorDivergenceFlagPct (25)
  • See docs/proposals/anchor-corroborated-repricing.md for the full rationale and the alternatives rejected
v1.1.0 (2026-09-17)
RAPID_ROUNDTRIP no longer discounts two-sided liquidity provision; every other round-trip shape keeps its discount.
  • RAPID_ROUNDTRIP now inspects the role and counterparty of each leg. Maker on both legs against two different counterparties: severity info, penalty 1 (recorded, not discounted). Every other shape, including both legs against the same counterparty and a taker aggressing both sides: severity warn, penalty 0.4, unchanged
  • Rationale: a maker filling two independent takers on opposite sides is providing liquidity, not recycling value, and discounting it removed the best evidence a thin market has. A taker round-tripping through two makers is still churn, so it keeps the discount
  • The flag detail now carries liquidityProvision so the distinction is machine-readable
v1.0.0 (2026-09-16)
Initial weighted-median reference price with anomaly discounting, influence caps and confirmation-gated repricing.
  • weight = sqrt(usdNotional) × recencyFactor × quoteQuality × routeQuality × anomalyFactor
  • Weighted median over a 7-day window with a 24h recency half-life
  • Per-trade influence cap 30%, per-participant influence cap 40%
  • Trades below $5 notional excluded; below $1 flagged tiny
  • MAD-based peer deviation (3.5 MAD); trades >25% off the robust centre are excluded unless they belong to a multi-participant cluster
  • The newest trade cluster is compared with the rest of the window; a move > 15% requires ≥3 unflagged trades from ≥2 observable participants, ≥$20 notional over ≥30 minutes, or executable order-book support, before it becomes the reference
  • Freshness: <1h live, <12h recent, <24h low confidence, <7d stale, ≥7d unavailable