The method

One method. Sealed before open.

Every market follows the same written rules. They are hashed on-chain before calls open, measured from public data, and anyone can replay the result.

Side A and side B volume lines meeting at the seam, which sits at A's share. Sample figures.
Fig. 00 · The seam sits at side A's share of volume · Sample

How a market works

Four steps, the same for every market.

  1. Settlement card hashed and sealed on-chain before open01 · Sealed

    Rules before open

    Question, frozen pair lists, sources and formula are hashed on-chain before the market opens.

  2. Two hourly volume traces across 168 snapshots02 · Measured

    168 hourly snapshots

    Every hour from the Line to close, each cluster's DEX Screener volume is logged.

  3. DEX Screener and CoinGecko figures compared into a result03 · Settled

    Public data decides

    Larger summed volume wins, cross-checked against CoinGecko. A 12-hour challenge window follows.

  4. Side A and side B split by the seam04 · Your call

    Call it before the Line

    Practice calls are free signed messages. Points only. Calls close when measuring starts.

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 sealed hash and the hash computed from the card, compared character by character
# the same check in a terminal
curl -s https://metashift.trade/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 only

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 toBurnBuyback, 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 the token on Jupiter and burns it. Every burn is listed with its transaction on the $SHIFT page.

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.

The replay script reproduces the published result from the same inputs. Sample figures.
# Node 18 or later. Replace 0 with the market id.
curl -sO https://metashift.trade/markets/replay.mjs
curl -so card.json https://metashift.trade/markets/0/card.json
curl -so snapshots.json https://metashift.trade/markets/0/snapshots.json
node replay.mjs card.json snapshots.json