Resolution
Sentico uses two different resolution paths for outcome markets. Spot markets do not use this flow.
Binary Options
Binary options resolve under their bound oracle policy, published on the
market item as instrumentConfig.oracleBinding. The existing BTC market
(market 1) retains its V1 median barrier contract; short-dated binaries are
bound to Oracle V2 (kind: canonical_v2 plus a policyHash), and market 17
was resolved resolved_no through that path on 2026-09-13.
| Contract | Price rule | Missing-evidence behavior |
|---|---|---|
Existing V1 price_barrier_v1 market | Median and bound barrier/confirmation rules; an earlier hit can latch YES | Existing market 1 retains resolve_no |
V2 exchange at_expiry_gt profile for new markets | Equal-weight mean of three USD-normalized venue midpoints at the cutoff; strictly above strike is YES | Required evidence missing or conflicting at finalization produces INVALID |
Valid YES/NO decisions pay 1 USDC per winning share and 0 per losing share. V2 INVALID pays 0.50 USDC per YES share and 0.50 per NO share, with deterministic rounding. It is not a refund of each trader's purchase price.
Read Oracle V2 and price resolution for source conversion, the cutoff/recovery-deadline distinction, client endpoints and deployed scope. The policy is fixed before a V2 market opens; existing contracts are not silently migrated.
At expiryTsMs an Oracle V2 binary stops accepting new orders, but its
status stays open and resting orders stay on the book until the decision.
The decision is committed automatically after the policy's recovery deadline;
at that moment the market becomes resolved_* and all its resting orders are
cancelled. See the cutoff timeline.
After the outcome is committed, the persistent settlement worker processes positions and credits balances. Resolution, account payout and final on-chain withdrawal are distinct steps. See Settlement.
Prediction Markets
Prediction Markets (resolutionPolicy: economic_dispute on the market item)
use an economic dispute process because the answer often depends on public
evidence rather than a single exchange price.
Any wallet can submit a resolution case. The flow below was verified on
2026-09-14 with case 7 on market 10, filed after the market's expiryTsMs.
Two things an integrator needs before submitting:
- The bond must be free engine USDC. It is escrowed from the resolver's
usdcFree(seeGET /api/v1/accounts/{account}) when the case is accepted; USDC locked in resting orders does not count. Preview the exact amount with the resolution simulator listed under API surface. - Every request needs the header
Origin: https://app.sentico-labs.xyzand a wallet authorization withappName: "Sentico"anddomain: "app.sentico-labs.xyz"; other origins or app names are rejected.
Step 1: compute the payload hash
POST /api/v1/protocol/markets/{market_id}/resolution-payload-hash
{
"outcome": "NO",
"claim": "One-paragraph statement of what happened and why it resolves this way.",
"artifacts": [
{ "kind": "link", "label": "Official result", "url": "https://example.org/result", "mimeType": "text/html" }
]
}
The response carries payloadHash. Send outcome, claim and artifacts
unchanged in step 3, otherwise the hash does not match.
Step 2: sign the wallet authorization
The resolver's wallet signs this EIP-191 personal_sign message: one
key:value field per line, no space after the colon, wallet address in
lowercase, issuedAt and expiresAt as unix milliseconds.
SentiPredict Market Resolution Authorization
app:Sentico
domain:app.sentico-labs.xyz
wallet:0x<lowercase wallet address>
marketId:<market id>
payloadHash:<payloadHash from step 1>
nonce:<unique nonce string>
issuedAt:<unix ms>
expiresAt:<unix ms>
Step 3: submit the case
POST /api/v1/protocol/markets/{market_id}/resolution-cases
Origin: https://app.sentico-labs.xyz
{
"walletAuth": {
"domain": "app.sentico-labs.xyz",
"appName": "Sentico",
"walletAddress": "0x<lowercase wallet address>",
"nonce": "<same nonce as in the message>",
"issuedAt": 1789372000000,
"expiresAt": 1789372300000,
"signature": "0x<personal_sign signature>"
},
"outcome": "NO",
"claim": "<same claim as in step 1>",
"evidence": {
"summary": "What the primary source shows.",
"primarySourceUrl": "https://example.org/result",
"secondarySourceUrls": ["https://example.org/report"],
"eventTsMs": 1789152300000,
"confidenceBps": 9500
},
"artifacts": [
{ "kind": "link", "label": "Official result", "url": "https://example.org/result", "mimeType": "text/html" }
]
}
The response describes the accepted case:
| Field | Meaning |
|---|---|
caseId | Case identifier; read progress on the resolution dashboard |
status | pending_challenge for the whole challenge window |
bondUsdc | Escrowed bond in micro-USDC: max(250 USDC, 1 % of the market size), capped at 10,000 USDC |
resolutionFeeUsdc | The 1.5 % resolution fee the final resolver will receive, in micro-USDC |
challengeDeadlineMs | Unix milliseconds; submission time + 24 h |
When the case is accepted, the market's status switches to halted on the
public catalog for the whole challenge window, resting orders are closed, and
the 24-hour window starts (rules.disputeWindowMs: 86400000 on the market
item). An expired prediction market without a case keeps status: open;
there is no separate "expired" flag, so compare expiryTsMs yourself before
quoting or before deciding that a market still needs a resolver.
Bond And Incentive
The bond exists to make low-quality or dishonest resolution attempts expensive.
For Prediction Markets, the bond is computed from the market-size snapshot: 1 %
of the snapshot, with a minimum of 250 USDC and a maximum of 10,000 USDC
(bondUsdc in the case response, micro-USDC). It is escrowed from the
resolver's free engine USDC at submission and stays locked while the case is
open.
If the resolver is correct:
- the resolver bond is refunded,
- the resolver earns the resolution fee,
- the resolution fee is funded from the winning-side settlement payout.
The resolution fee is 1.5% of the total winning-side payout. It is deducted proportionally from winning payouts during settlement and credited to the final resolver.
If the resolver is wrong:
- the resolver bond is slashed,
- the slashed bond goes to protocol treasury handling,
- the incorrect resolver does not receive the resolution fee.
Challenges
During the challenge window, another wallet can challenge the submitted outcome:
POST /api/v1/resolution-cases/{case_id}/challenges
The challenger must submit a different outcome, evidence, and a matching bond.
If the original resolver is correct, the resolver bond is refunded, the challenger bond is slashed, and the original resolver receives the resolution fee. If the challenger is correct, the challenger becomes the final resolver: their bond is refunded, the original resolver bond is slashed, and the challenger receives the 1.5% resolution fee.
Finalization
If no challenge is fully bonded before the deadline, the submitted outcome is finalized automatically when the 24-hour window ends. An admin does not select a different outcome for an unchallenged case.
If an opposite, equally bonded challenge is accepted, an admin reviews the two evidence sets and selects one of their proposed outcomes. Admin finalization is available only for a fully funded challenged case.
Finalization sets the market outcome, records the audit trail, and triggers resolved-position settlement. Users should treat resolved payouts as final only after the corresponding settlement path has completed.
API Surface
Useful public endpoints:
| Endpoint | Purpose |
|---|---|
GET /api/v1/protocol/markets/{market_id}/resolution-dashboard | Read current resolution state and recent cases |
GET /api/v1/protocol/markets/{market_id}/resolution-simulator | Preview eligibility, bond, fee, and timing |
POST /api/v1/protocol/markets/{market_id}/resolution-payload-hash | Compute the payload hash to sign |
POST /api/v1/protocol/markets/{market_id}/resolution-cases | Submit a resolver proposal |
POST /api/v1/resolution-cases/{case_id}/challenges | Challenge an active resolver proposal |