Signed Official Rounds
Every five minutes, Mecone turns each of its twelve official indices into a cryptographically signed official round: an immutable, chain-independent record you can verify offline with nothing but one pinned public value. This is the transport-neutral layer underneath every delivery rail — the API below, venue-native adapters, and on-chain feeds all carry the same signed round; none of them can create or alter one.
The five-minute heartbeat is the floor, not the ceiling: each feed carries a
committed deviationThresholdBps in the registry, and a value that moves at
least that far off the last committed round is signed immediately, off-schedule
(the same heartbeat-plus-deviation model as Chainlink feeds). A feed is also
rate-limited to one off-heartbeat round per commit window
(cyclePolicy.deviationMinIntervalNs), and every commit resets the trigger’s
baseline.
The settlement fixing (/v1/feeds/{SYMBOL}/fixings/latest)
A per-cycle round is a mark; a settlement reference is a fixing. On each hourly
window close, each feed signs a fixing round: the median of its trailing
twelve regular rounds (deviation rounds included), quorum nine. The median —
not a mean — so no single pushed print drags it. The fixing’s input snapshot
names its constituent round ids in window order, so anyone can recompute the
median from public history and check the arithmetic — the fixing is a
verifiable artifact, not a privileged computation. If a feed can’t reach quorum
in the window (or the extended 90-minute fallback), no fixing is signed: the
defined FAILED state is the documented absence plus the liveness flag, never a
number we don’t have. Fixing rounds carry roundKind: 2 and chain on their own
per-feed sequence, so the heartbeat chain and the fixing chain are each
unbroken.
Two environments, one root of trust. production is the settle-grade
chain; staging is for evaluation — do not settle real value against staging
rounds. Both verify against the same pinned root anchor below; the
environments are cryptographically separated by the signing domain.
| Environment | Base URL | Online keyset |
|---|---|---|
production | https://oracle.mecone.trade — fresh rounds token-gated; 24h-delayed rounds and verification plumbing open | 0xc9d9e532…acf7 |
staging | https://staging.oracle.mecone.trade — token-gated (token provided during integration) | its own staging-ceremony keyset, served at /v1/keysets/online |
The staging environment runs the same pipeline for pre-release feeds and
partner onboarding (new indices graduate there first, production after
review — mirroring the exchange’s live/soon split). Every staging endpoint
except /v1/health requires the access token.
Access tiers (production)
| Tier | What it serves | Credential |
|---|---|---|
| Verification plumbing — always open | /v1/anchor, /v1/keysets/*, /v1/registry, /v1/kit/*, health and liveness | none |
| Delayed rounds — open | GET /v1/feeds/{SYMBOL}/rounds/delayed: the latest round at least 24 hours old. For evaluation, backtesting, and integration development | none |
| Fresh rounds — licensed | GET /v1/feeds/{SYMBOL}/rounds/latest: the current settle-grade round | partner token (mst_…) as Authorization: Bearer, issued during onboarding |
A fresh-rounds read without a token (or with a revoked one) answers 401.
A token may additionally be scoped to specific feeds at mint time (the
per-feed trial shape): a scoped token reading a fresh round outside its list
answers 403 feed not licensed. The scope gates freshness only — the delayed
tier stays open to every token. Every token read is metered per token per
day; partners see their usage in the partner agreement reporting.
Verification never requires a token — the anchor, keysets, registry and
verifier kit stay open so a served round can always be checked without
trusting the service.
The trust model — pin one address
The only thing you must obtain out-of-band is the root anchor address:
0x954686af5A7Cd1A872E8f25A41B934209A463907 (root anchor — production AND staging)Everything else is served by the API and proven against that anchor: the root
key attests the online keyset, the keyset authorizes the round signer, and the
round id is the EIP-712 digest of the signed body (domain =
name + version + salt, deliberately no chainId — the same round verifies
anywhere). Signatures are canonical low-s secp256k1, one per round.
Verify a live round in one minute
BASE=https://oracle.mecone.trade
# the self-contained verifier is served by the service itself
curl -sO $BASE/v1/kit/verify_mecone_round.py
pip install eth-keys eth-abi "eth-hash[pycryptodome]"
python verify_mecone_round.py $BASE MGDP --environment production \
--pin 0x954686af5A7Cd1A872E8f25A41B934209A463907VERIFIED MGDP = 2.1526727551754…
round 0x04d7ab29…
signer 0x1e00D35F… (authorized by root-attested keyset 0xc9d9e532…)
anchor 0x954686af… [matches your pin]The kit is ~250 lines with no Mecone dependency — read it, fork it, or reimplement it from the served material; nothing about verification requires trusting this service.
Endpoints
The current registry can change while an existing round is still valid. Fetch the
registry identified by the round’s officialRegistryHash, verify its content hash,
and retain it with the signed evidence. A registry lookup never replaces signature,
input-snapshot or expiry verification.
| Path | Serves |
|---|---|
GET /v1/health | signer address, round + cycle counts |
GET /v1/liveness | the operational SLI — per-feed round age vs cadence; 200 while producing, 503 when stale |
GET /v1/anchor | the pinned root anchor (public root of trust) |
GET /v1/keysets/online | the root-attested online keyset bundle |
GET /v1/keysets/correction | the root-attested correction keyset bundle |
GET /v1/registry | the current official-feeds registry snapshot |
GET /v1/registry/{officialRegistryHash} | a retained immutable registry snapshot by its signed content hash; open verification material, unknown hashes return 404 |
GET /v1/feeds/{SYMBOL}/rounds/latest | latest signed round: body + signature + round id — partner token required |
GET /v1/feeds/{SYMBOL}/fixings/latest | the feed’s latest settlement fixing: the hourly window-median round — partner token required |
GET /v1/feeds/{SYMBOL}/rounds/delayed | latest round at least 24 h old — open, no credential |
GET /v1/feeds/{SYMBOL}/rounds?from=&to=&limit=&after= | signed history in a window (RFC 3339 or epoch ns, limit 1–1000, nextAfter is an exclusive cursor) — open |
GET /v1/rounds/{roundId}/input | the round’s input snapshot, byte-verbatim: the de-vigged source distribution and its p10/p50/p90, the source venue/contract, and provenance timestamps. Hashes to the round’s signed inputSnapshotDigest — the dispersion evidence is as committed as the value |
WSS /v1/stream | the push channel: snapshot of latest rounds on connect, then every committed round as a sequenced frame in one flush — partner token required |
GET /v1/kit/verify_mecone_round.py | the self-contained verifier above (--input also verifies the snapshot against the signed digest) |
Every round commits to dispersion, not just a point: the input snapshot carries
the live de-vigged source distribution with its p10/p50/p90 quantiles, so a
risk engine can size haircuts from the crowd’s own spread rather than from a
volatility assumption. The snapshot is served byte-verbatim because the signed
inputSnapshotDigest covers the bytes — fetch it, recompute the hash, compare.
The stream (/v1/stream)
Polling sets the order in which consumers discover a round by their own poll
phase; the stream removes that. On every commit, all subscribers receive the
same frames in one flush. Frames carry a monotonic seq within a
streamEpoch (the service boot); a changed epoch means resync from the
snapshot, and a gap in seq means recover the missing rounds from the range
read. Heartbeats every 30 s carry the last emitted seq, so gaps are
detectable even in silence. A scoped partner token receives only its licensed
feeds. Arrival time still varies with geography — the signed timestamps inside
each round, not the transport, define validity.
Symbols: MGDP MCPI MUNEMP MOAI MANTH MH100 MH200 MB200 — and the
four country stress indices (a 0–100 score in pts): MBRIV (Brazil), MMXIV
(Mexico), MARGIV (Argentina), MCHNIV (China). The stress indices are signed
and settlement-grade like the flagship eight; they are not yet on the Stork
on-chain rail.
MKRKN was withdrawn on 27 July 2026: no new rounds are produced, and the
public index API excludes it (index-not-found there). This service retains
its final signed round, frozen at the withdrawal moment, for audit.
What a round commits to
The signed body binds, among 25 fields: the feed identity
(keccak256("mecone:official-feed:<SYM>:v1") — venue tickers are never
identities), the exact int256 value at 18 decimals in natural units (no
billions scaling on this rail), six timestamps (effectiveAt, sourceCutoff,
sourceAsOf, computedAt, signedAt, validUntil — staleness is
validUntilNs, nothing else), the methodology + registry + source-policy
hashes, the input-snapshot digest, the previous round digest (per-feed hash
chain), and the authorizing keyset id. Corrections never overwrite: a
correction is a new signed round that names what it supersedes.
Integrating
Subscribe to wss://oracle.mecone.trade/v1/stream for push delivery, or poll
rounds/latest (a round is fresh until its validUntilNs) — the payloads are
identical either way, and verification is the same offline against the pinned
root anchor. For a settlement integration, contact us — production keys, SLAs,
and the correction-policy paperwork live in the partner agreement.