How it works
Every market commits to its question before betting opens. The commitment is a hash stored immutably in the Vault, covering:- which price feed
- the threshold, and the direction (
aboveorbelow) - the exact timestamp the price is read from
- how long an update may lag that timestamp
What the caller cannot choose
Resolution is permissionless, which is only safe because the caller has no useful freedom:- Not the question — the spec must hash to the vault’s immutable commitment.
- Not the timestamp — it is inside that hash.
- Not the price — signatures are verified on-chain, and the update must be the first one at or after the target time.
- Not the outcome — it is a comparison.
The third point is subtle and worth spelling out. Pyth publishes roughly every 400ms, so a
60-second window holds around 150 candidate prices. If any of them were acceptable, whoever
called
resolve could pick the one that suited them. Atrum instead pins the result to the
first update at or after the target time, with proof that no earlier one exists — so there
is nothing to choose.Why the price must come from after betting closed
The resolver refuses any market whose target time is earlier than its betting close. A market settled on a price that was already knowable while people were still betting is not a prediction market — it is a payout to whoever checked.When a market cannot be answered
If a feed is delisted, or no signed update ever lands in the window, resolution reverts permanently — by design, because that is the same property that makes it trustworthy. So there is an escape hatch. If a market is still unresolved a fixed period after resolution opened, anyone can void it and everyone is refunded 1:1, whichever side they backed. It is deliberately not a control anyone can reach for:- It refuses an already-resolved market, so nobody can void an outcome they dislike.
- It refuses before the deadline, so nobody can race a slow resolver.
- The resolver itself cannot declare a void.