11 KiB
BLURT/USD price source research
Status: Research notes (not a design decision) Date: 2026-04-21 Scope: Evaluate five proposed additional price sources beyond the existing Klingex + Coingecko pair. Interacts with: ADR-0011 (fee model consumes price), OPERATIONS.md §13 (stale-price runbook)
Context
The indexer's price path today:
Klingex → Coingecko → static_floor
Composite source with the first live feed winning, TTL
cache, and background refresh. priceSource.current()
returns the BLURT/USD rate used by order fee
verification in apps/indexer/src/indexer/handlers/order.ts.
The revisit list asked for evaluation of five additional sources: Tribaldex, Hive-Engine, CoinMarketCap, Blockchair, Blockchain.com. This document records what I found about each and a recommendation for or against integrating it.
The goal of additional sources is not diversification for its own sake — every new source is another background HTTP request, another failure mode, another API policy to track. Additional sources earn their place only if they narrow a real gap in the existing chain.
Source-by-source findings
CoinMarketCap — FEASIBLE, API KEY REQUIRED
- Endpoint:
https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?slug=blurt&convert=USD - Auth:
X-CMC_PRO_API_KEYheader. Free tier exists with daily call-credit limit; paid tiers for higher volume. - Response shape:
data.<id>.quote.USD.price(number, USD per BLURT). Timestamp indata.<id>.quote.USD.last_updated. - BLURT is listed on CMC (slug:
blurt). - CAVEAT (important): the BLURT page on
coinmarketcap.com/currencies/blurtshows$0 USDtrading volume as of 2026-04-21. This means either (a) CMC isn't aggregating volume from Tribaldex / Hive-Engine sidechain pools (the main BLURT trading venue today), or (b) the listing is stale. A price source that reports$0volume is a red flag even if it reports a non-zero price — the price may be a frozen historical value, not a live rate. Operator verification required before making this a primary or secondary source. - Policy risk: CMC Terms of Service allow API use for data display, including commercial use on paid tiers. Free-tier limits (typically ~10,000 credits/month) are enough for an operator polling once every 60s (43,200/month) only on the lowest paid tier — free-tier polling must be slower (>5-min interval) to stay under.
- Recommendation: FEASIBLE but de-prioritized until an
operator confirms the CMC BLURT price is live and
actively updating. The
$0 volumeflag means CMC could be reporting a stuck number. If verified live, slot in as an optional source between Klingex and Coingecko.
Tribaldex — NOT FEASIBLE AS DIRECT SOURCE (sidechain depeg risk)
- What it is: Tribaldex is a front-end for
Hive-Engine sidechain trading. BLURT on Tribaldex is
actually
SWAP.BLURT, a wrapped BLURT token bridged viablurt-swap. Not BLURT itself. - Pricing geometry: To derive BLURT/USD from
Tribaldex you'd need:
SWAP.BLURT/SWAP.HIVE × HIVE/USD(three-hop: cross-chain bridge peg × sidechain pair × mainnet price provider) - Fundamental problem: the
SWAP.BLURT↔ BLURT peg depends on bridge liquidity. Under thin liquidity or a bridge-operator issue, SWAP.BLURT can trade meaningfully below (or above) BLURT's "real" rate. Using this as a primary BLURT/USD feed would produce wrong fees during bridge stress events — exactly when fee accuracy matters most. - Endpoint details (for reference if ever used as a
sanity-check): Hive-Engine RPC at
https://api.hive-engine.com/rpc/contracts— POST JSON-RPC call to themarketcontract'smetricstable withsymbol: "SWAP.BLURT"returns last price against SWAP.HIVE. - Recommendation: DO NOT add as a primary or secondary
source. Could serve a niche role as a divergence
alarm — if
SWAP.BLURT/SWAP.HIVE × HIVE/USDdisagrees with the Klingex/Coingecko consensus by >10%, log a warning for operator attention. But even that is nice-to-have; a three-hop derived price isn't worth the infrastructure it requires.
Hive-Engine — SAME AS TRIBALDEX
- Same chain, same problem. Tribaldex IS a Hive-Engine front-end; there's no independent Hive-Engine "price" distinct from what Tribaldex surfaces.
- API documentation:
https://hive-engine.github.io/engine-docs/(contract tables) andhttps://hiveengine.readthedocs.io/en/latest/hiveengine.api.html(Python library reference, useful for endpoint shapes). - Recommendation: treat as identical to Tribaldex. Do not integrate.
Blockchair — NOT APPLICABLE
- Supported chains: ~48 blockchains as of 2025, covering Bitcoin family (BTC, LTC, BCH, DOGE, DASH, ZEC, ARRR, DCR, SOL, ETH, XRP, DGB, XEC, GRS), Ethereum family, Solana, TRON, Polygon, and similar account-model / UTXO chains.
- Graphene-family chains (BLURT, Hive, Steem) are NOT supported. Blockchair's model is built around indexing UTXO and account-model chains; delegated-PoS social chains like BLURT aren't in scope.
- Not a BLURT price source at all. Blockchair can't return BLURT/USD because it doesn't index BLURT.
- Useful elsewhere? Yes — for BTC/XMR
fee-attestation. When an order's
fee_methodisbtcorxmr(ADR-0011 sub-phase 4b), an attestor verifies the claimed payment on the external chain. Blockchair's/bitcoin/dashboards/transaction/{hash}endpoint is a clean way to look up a payment. This is a separate workstream from BLURT/USD pricing — I'm logging it here but it belongs in the attestor-UX design, not inpriceSource. - Recommendation: do NOT integrate into
priceSource. Revisit in the ADR-0011 sub-phase 4b attestor workstream as an explorer-rotation candidate.
Blockchain.com — NOT APPLICABLE
- Explorer APIs are Bitcoin-focused: block data, transaction lookup, charts/stats for BTC. Not a multi-chain indexer.
- Exchange API lists pairs they run on
exchange.blockchain.com— BTC-USD, ETH-USD, etc. BLURT is not listed. - The
exchange_rates_apiendpoint returns fiat/BTC conversion rates, not altcoin prices. - Recommendation: do NOT integrate for BLURT price. Same as Blockchair, could be useful in an attestor role for BTC fee verification (as a Blockchair alternate), but that's a separate workstream.
Summary table
| Source | BLURT/USD? | Verdict | Priority |
|---|---|---|---|
| Klingex | direct | already integrated (primary) | — |
| Coingecko | direct | already integrated (fallback) | — |
| CoinMarketCap | direct (but volume=$0 concern) | FEASIBLE pending operator verification | Medium |
| Tribaldex | three-hop derived | NOT RECOMMENDED (sidechain depeg risk) | Low (divergence alarm only) |
| Hive-Engine | same as Tribaldex | NOT RECOMMENDED | Low |
| Blockchair | does not index BLURT | NOT APPLICABLE | — (reconsider for BTC attestor) |
| Blockchain.com | does not list BLURT | NOT APPLICABLE | — (reconsider for BTC attestor) |
Recommendations
Short term (this audit cycle):
-
Do NOT add any new primary price sources. The existing Klingex → Coingecko → static_floor chain is working and the proposed additions each have disqualifying issues.
-
Have an operator verify CMC BLURT price freshness. If the
$0 volumeflag is just cosmetic (CMC not aggregating sidechain volume, but price feed is live), CMC slots in cleanly as a third provider. Required check: pollhttps://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?slug=blurtwith a trial API key across a week, compare the returnedpriceagainst Klingex and Coingecko over the same interval. If CMC tracks within 5% of the consensus andlast_updatedadvances steadily, green- light integration. -
Document the decision not to integrate Tribaldex and Hive-Engine in
docs/adr/0004-price-feeds.md(the existing price feeds ADR) so the question doesn't come back in a future session.
Medium term (ADR-0011 sub-phase 4b):
- Revisit Blockchair and Blockchain.com in the
attestor-UX design workstream. For BTC/XMR
fee-attestation, a user who's attesting that a
payment landed needs to query an explorer to verify
the claimed tx. An explorer rotation with Blockchair +
Blockchain.com + mempool.space + one or two others is
the right shape for that problem, but it's separate
from
priceSource.
Long term (if BLURT gets listed on a major CEX):
- Add direct exchange tickers as primary sources when they become available. Binance, Kraken, Gate.io etc. would all be preferable to aggregators if BLURT ever gets there. Today, no major CEX lists BLURT, so this isn't actionable.
What I'd integrate code-wise (if operator green-lights CMC)
Minimal skeleton (for reference, not shipped this session):
// apps/indexer/src/indexer/priceFetchers/coinmarketcapFetcher.ts
export function createCmcFetcher(
apiKey: string,
baseUrl = 'https://pro-api.coinmarketcap.com'
): PriceFetcher {
return async (): Promise<PriceSample | null> => {
const url = `${baseUrl}/v1/cryptocurrency/quotes/latest?slug=blurt&convert=USD`;
const res = await fetch(url, {
headers: {
'X-CMC_PRO_API_KEY': apiKey,
Accept: 'application/json'
}
});
if (!res.ok) return null;
const body = await res.json();
// Shape: { data: { <id>: { quote: { USD: { price, last_updated } } } } }
const entries = Object.values(body.data ?? {});
const first = entries[0];
if (!first || typeof first !== 'object') return null;
const quote = (first as any).quote?.USD;
if (!quote || typeof quote.price !== 'number') return null;
return {
blurtUsd: quote.price,
source: 'coinmarketcap',
fetchedAt: new Date(),
observedAt: new Date(quote.last_updated)
};
};
}
Order in composite: Klingex → CMC → Coingecko → static_floor.
CMC slots in between Klingex and Coingecko because it's
the most authoritative aggregator; Coingecko remains
the backstop because it's free-tier-friendly.
Config additions needed:
MORPHIT_INDEXER_CMC_API_KEY(secret, env-only, never in logs)MORPHIT_INDEXER_CMC_BASE_URL(defaulthttps://pro-api.coinmarketcap.com, override for testing)MORPHIT_INDEXER_PRICE_MODEgainscmcas a valid value, mostly for test scenarios.
Files that would change if we ship CMC
apps/indexer/src/indexer/priceFetchers/coinmarketcapFetcher.ts(new)apps/indexer/src/indexer/priceFactory.ts(wire cmc into composite)apps/indexer/src/config/index.ts(+ 2 config fields)OPERATIONS.md §13(how to acquire a CMC API key, what happens if CMC rate-limits)docs/adr/0004-price-feeds.md(document the third source)
No schema changes. No migration. Pure additive.