FRONTRUN

The method

One method. Sealed before every market opens.

Read how a market is sealed, where calls close, how volume is measured, how winners are paid and how to recompute any result yourself.

01

Sealed

Every market has one Settlement Card: a JSON file with the question, both sides, the frozen pair list of each cluster, the data sources, the formula and the timetable.

When the market is created, the sha256 of the card's canonical JSON is written into the market account on-chain. Canonical means every key sorted, no whitespace, UTF-8. The hash can never change, and nothing about a market changes after creation.

Every market page has Verify seal. It downloads the card, hashes it in your browser and shows both hashes side by side: MATCH or MISMATCH.

# the same check in a terminal
curl -s https://frontrun.markets/markets/<id>/card.json \
  | python3 -c 'import sys,json,hashlib;c=json.load(sys.stdin);print(hashlib.sha256(json.dumps(c,sort_keys=True,separators=(",",":"),ensure_ascii=False).encode()).hexdigest())'
02

The Line

Calls close the moment the measurement window opens. That moment is the Line, the dashed start line in the mark. Nobody calls with the result in view.

On-chain, place_call fails with LineCrossed at or after lock_at. Practice calls are refused after the same time.

03

Front-running weight

Live markets

Earlier calls carry more weight in the split of the losing pool: up to +25% at market creation, falling in a straight line to +0% at the Line.

If your side wins, your stake always comes back in full. The weight only changes how the losing pool is shared among winners.

weight = amount × (10000 + bonus_bps × (lock_at − now) / (lock_at − created_at)) / 10000
# bonus_bps = 2500 (+25%), integer maths, rounded down. Snapshotted into each market at creation.
Weight calculator Example
Your bonus
+16.7%
Your weight
116.66
Stake back if your side wins100.00 USDC
Share of the losing pool after the 2% fee—
Paid if your side wins—
Paid if your side loses0 USDC

Example only. Other winners are assumed to carry +10% average weight. Real payouts depend on every call in the market and are computed on-chain at claim.

04

Measurement

Each side is a cluster: a list of trading pairs chosen by a written rule and frozen when the card is sealed. A token launched after the seal is not in the list.

Every hour on the hour (UTC), from the Line to close, the oracle reads each pair's last-hour volume from DEX Screener, cross-checked against CoinGecko's on-chain pool data, and logs one row per hour.

The metric is the sum over all snapshots of each cluster's summed volume, in USD. The larger metric wins.

Void when the two metrics are within 0.5% of the larger one, or when fewer than 90% of snapshots were recorded. A snapshot missing for one cluster is dropped for both sides.

05

Payout and fees

Practice: 100 points per call. Winners split the losing side's points in proportion to their calls. Points have no monetary value and cannot be bought, sold or redeemed.

Live: pools are USDC on Solana, held by the market's own vault. Winners get their stake back plus a weighted share of the losing pool, minus the protocol fee.

payout = stake_win + (losing_pool − fee) × weight_win / total_weight_win
fee    = losing_pool × fee_bps / 10000      # fee_bps = 200 (2%), hard cap 500
Protocol fee2%Of the losing pool only
Hard cap5%Enforced by the program
Fees go toBurnBuy back $FRONTRUN, then burn

The fee moves into the program's fee vault when a market is finalized. Anyone can call sweep_fees, which sends the vault to the buyback wallet; the buyback swaps USDC for $FRONTRUN on Jupiter and burns it. Every burn is listed with its transaction.

06

Challenge window

At close, the oracle proposes the result on-chain with both metrics and the sha256 of the snapshot log. A 12-hour challenge window follows.

During the window, the guardian can veto a wrong proposal. The market returns to open-for-settlement and a corrected result can be proposed. After the window anyone can finalize, and claims open.

07

Refunds and sweep

Expiry: if no result is proposed within 72 hours of close, anyone can expire the market. It becomes void and every call is refunded in full.

Void: a void market (tie, missing data, guardian void, or no winning calls) refunds every stake in full. No fee is taken.

Pause: pausing stops new calls only. Claims, expiries, finalize and refunds always work.

Unclaimed balances: 180 days after close, anything still unclaimed in a market's vault may be swept to the fee vault, where it goes to the buyback and burn. Claim within 180 days.

08

Replay

At close, each market publishes its snapshot log next to its card. The replay script has no dependencies. It recomputes both metrics, the outcome, the card hash and the log hash, and prints PASS or FAIL against what was proposed on-chain.

# Node 18 or later. Replace 0 with the market id.
curl -sO https://frontrun.markets/markets/replay.mjs
curl -so card.json https://frontrun.markets/markets/0/card.json
curl -so snapshots.json https://frontrun.markets/markets/0/snapshots.json
node replay.mjs card.json snapshots.json