Skip to content
Anyperp
DocsHow prices are madeAppData
Open the app

Using Anyperp

Getting startedTradingFees, funding and the borrow feeProviding liquidityClaim balancesListing a marketHow prices are madeHalts and settlementAPITokenFAQ

Papers

LitepaperWhitepaper

How prices are made

Every Anyperp price is a print: the median of two signed observations of an artist's monthly listeners, taken in the same round by two independent attestation roots and verified on chain. A round opens every 15 minutes. It prints only when both observations are present, valid and within 0.5% of each other.

Rounds

Each market has its own sequence of rounds in the anyperp_oracle program.

  1. Open. Once 15 minutes have passed since the last round opened, anyone can open the next one with open_round. The round accepts observations until it closes 15 minutes later.
  2. Observe. Reporters fetch the listener count from the artist's public profile page through each root and post each root's signed observation with submit_observation.
  3. Finalize. Anyone can call finalize_round once both observations are in. The program checks them, takes the median and writes the print. Keepers run this as part of their work.

Reporters are permissionless. An observation's validity comes from the root's signature, which the program verifies; who submits it doesn't matter.

The two roots

RootSignerVerified with
Root 1a Reclaim attestor, identified by its Ethereum-style addressSolana's secp256k1 signature precompile
Root 2an independent notary run by a separate operatorSolana's Ed25519 signature precompile
Public sourceartist profile pageRoot 1Reclaim · secp256k1Root 2notary · Ed25519Reporterspermissionlessanyperp_oraclerounds, printsanyperp_perpsmarkets, vaultTLS sessionTLS sessionsubmit_observationprices
The public source is read through root 1 (a Reclaim attestor) and root 2 (an independent notary); reporters post both observations to anyperp_oracle, and anyperp_perps reads its prints.

Each root signs a claim that binds every field the price depends on: the oracle program, the metric and the hash of its spec, the round and its sequence number, the root, the listener count, the time it was fetched and the source's own timestamp. submit_observation accepts an observation only when:

  • the signature verifies in the same transaction and comes from a key in that root's allowlisted set, valid at the fetch time;
  • the fetch time and the source time both fall inside the round's 15-minute window, with the source time no later than the fetch time;
  • the round has no observation from that root yet.

Root keys rotate only through the curators: three curator votes schedule a rotation, which takes effect after a 48 h timelock. Every observation keeps the signer it was made with, so past rounds remain checkable after a rotation.

Tolerance and the median

A round prints when its two observations v1v_1v1​ and v2v_2v2​ agree within the tolerance of 0.5% of the smaller one:

∣v1−v2∣≤0.005⋅min⁡(v1,v2)|v_1 - v_2| \le 0.005 \cdot \min(v_1, v_2)∣v1​−v2​∣≤0.005⋅min(v1​,v2​)

The print is their median, which for two values is their average, divided by the market's index divisor ddd:

It=v1+v22 dI_t = \frac{v_1 + v_2}{2 \, d}It​=2dv1​+v2​​

For example, root 1 reads 60,120,000 and root 2 reads 60,000,000. They are 120,000 apart, within 0.5% of 60,000,000 (300,000), so the round prints a median of 60,060,000 listeners; with an index divisor of 100,000 that is an index of 600.60. If root 2 had read 59,600,000 instead, the two would be 520,000 apart, more than 0.5% of 59,600,000 (298,000), and the round would not print.

Both observations must also be fetched later than those of the previous print, so a print never reuses older readings.

Round states

StateMeaning
openaccepting observations
awaiting_rootsone root has posted; waiting for the other
finalizedprinted
disputedboth roots posted but disagree beyond tolerance, or their times fall outside the round; no print
out_of_band_pendingthe median is beyond the circuit band; held until later rounds confirm the level
failedthe round closed with a root missing; no print

A round with no print, disputed or failed, pauses opens on both sides of the market until the next print, for up to 6 h after the latest such round. Closes, margin additions and claims continue.

The circuit band and side pauses

Each print is compared with the market's hourly close from 24 h earlier. A print more than 10% away from it is held as out_of_band_pending:

∣It−It−24h∣≤0.10⋅It−24h|I_t - I_{t-24h}| \le 0.10 \cdot I_{t-24h}∣It​−It−24h​∣≤0.10⋅It−24h​

While the level is held, opens pause on the side of the move for up to 6 h: a move up pauses new longs, a move down pauses new shorts. The level prints once enough consecutive rounds agree on it, within tolerance and in the same direction, to meet the market's confirmation count of at least two rounds, the first included. When it prints, the pause lifts.

For example, a market whose hourly close 24 h ago was 600.00 prints anywhere from 540.00 to 660.00 at once. A median of 670.00 is held, and new longs pause, until later rounds confirm it.

Price history

Each print also updates the market's hourly close: the last print in each hour. The oracle keeps the last 168 hourly closes, a week, on chain. They are the reference for the circuit band, the chart on each market page ("Index, hourly closes for a week") and the source of the settlement price if a market halts.

Reading rounds in the app

The Recent rounds panel on each market page lists the latest rounds:

ColumnWhat it shows
Roundthe round's sequence number
Statethe round state
Root 1, Root 2each root's listener count
Aparthow far apart the two readings are
Printthe index the round printed, or "pending" or "no print"
Signaturesper observation: the root, the signature algorithm, its verification, the signer, the fetch time, the time the round opened and the signature

The Data page and the attested series

The Data page publishes the attested series for every listed artist, free to read. "Compare two artists" puts any two artists side by side, each rebased to 100 at the start of the window, so a trend or a spread reads at a glance. "Every subject" lists each artist's latest attested value, when it was attested, and the share of rounds on which both roots agreed.

The same data is in the API without signing in: /v1/attested/subjects, /v1/attested/subjects/:subjectId/series for an artist's daily series, and /v1/attested/compare for two artists aligned, raw or rebased to 100 (API).

PreviousListing a marketNextHalts and settlement

On this page

RoundsThe two rootsTolerance and the medianRound statesThe circuit band and side pausesPrice historyReading rounds in the appThe Data page and the attested series
Anyperp
AppDataDocsLitepaperWhitepaperToken
Perpetual futures on artists’ monthly listeners, on Solana.Not offered to US persons.