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.
Fig. 00 · The seam sits at side A's share of volume · Sample
How a market works
Four steps, the same for every market.
01 · Sealed
Rules before open
Question, frozen pair lists, sources and formula are hashed on-chain before the market opens.
02 · Measured
168 hourly snapshots
Every hour from the Line to close, each cluster's DEX Screener volume is logged.
03 · Settled
Public data decides
Larger summed volume wins, cross-checked against CoinGecko. A 12-hour challenge window follows.
04 · 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 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.
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.
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.
# 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