Skip to main content

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.

ContractPrice ruleMissing-evidence behavior
Existing V1 price_barrier_v1 marketMedian and bound barrier/confirmation rules; an earlier hit can latch YESExisting market 1 retains resolve_no
V2 exchange at_expiry_gt profile for new marketsEqual-weight mean of three USD-normalized venue midpoints at the cutoff; strictly above strike is YESRequired 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 (see GET /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.xyz and a wallet authorization with appName: "Sentico" and domain: "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:

FieldMeaning
caseIdCase identifier; read progress on the resolution dashboard
statuspending_challenge for the whole challenge window
bondUsdcEscrowed bond in micro-USDC: max(250 USDC, 1 % of the market size), capped at 10,000 USDC
resolutionFeeUsdcThe 1.5 % resolution fee the final resolver will receive, in micro-USDC
challengeDeadlineMsUnix 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:

EndpointPurpose
GET /api/v1/protocol/markets/{market_id}/resolution-dashboardRead current resolution state and recent cases
GET /api/v1/protocol/markets/{market_id}/resolution-simulatorPreview eligibility, bond, fee, and timing
POST /api/v1/protocol/markets/{market_id}/resolution-payload-hashCompute the payload hash to sign
POST /api/v1/protocol/markets/{market_id}/resolution-casesSubmit a resolver proposal
POST /api/v1/resolution-cases/{case_id}/challengesChallenge an active resolver proposal