Skip to main content
When an option series reaches its expiry timestamp, a resolution price is computed off-chain and submitted on-chain via a signed attestation. Holders and writers then claim their respective payouts.

Resolution Price

The resolution price S determines payoffs for all options in a series. It is expressed as resolutionBps — an integer from 0 to 100 representing the YES token price at expiry.
resolutionBpsMeaning
0NO wins — YES is worth $0.00
100YES wins — YES is worth $1.00
59YES price at expiry ≈ $0.59

Resolution Methods

The on-chain contract accepts any resolutionBps in [0, 100]. How the value is determined is an operational choice:
The volume-weighted average price of YES token trades on Polymarket during the 30 minutes before expiry:
  1. Fetch trades from the Polymarket data API for the option’s conditionId
  2. Filter to trades on the YES CLOB token within [expiry − 1800s, expiry]
  3. Compute VWAP = Σ(price × size) / Σ(size)
  4. Map to basis points: resolutionBps = clamp(round(VWAP × 100), 0, 100)
VWAP resolution is used for options that expire before a market has fully resolved, giving a fair continuous settlement price.

Settlement Attestation (EIP-712)

The resolution signer creates a signed attestation that anyone can relay on-chain:
struct SettlementAttestation {
    uint256 seriesId;      // The option series being settled
    uint16  resolutionBps; // Resolution price (0–100)
    uint256 validUntil;    // Attestation expiry (Unix timestamp)
}
EIP-712 domain:
FieldValue
nameConvallaxCore
version1
chainId80002
verifyingContract0xc760F8f6B8830463822be9F68eB10e1b5Dace378
The attestation is valid for 15 minutes after creation.

Settlement Flow

Two settlement paths

PathWho can callWhen to use
settleWithAttestation()Any option holder or contract ownerNormal path — permissionless relay with signed attestation
settle()Contract owner onlyEmergency break-glass — no signature required

Payoff Formulas

Once a series is settled with resolution price S (resolutionBps):
TypePayoff per option (USDC)
Callmax(0, resolutionBps − strikeBps) × $0.01
Putmax(0, strikeBps − resolutionBps) × $0.01
  • payoffPerOption = (80 − 50) × $0.01 = $0.30
  • Holder with 100 options claims: 100 × $0.30 = 30 USDC
  • Writer collateral was: 100 × $0.50 = 50 USDC
  • Writer reclaims: 50 − 30 = 20 USDC
  • payoffPerOption = (60 − 0) × $0.01 = $0.60 (maximum put payoff)
  • Holder with 50 options claims: 50 × $0.60 = 30 USDC
  • Writer posted 50 × $0.60 = 30 USDC collateral → writer reclaims 0 USDC
  • 30-minute VWAP = 0.5923 → resolutionBps = 59
  • Call at K=50: payoff = (59 − 50) × 0.01=0.01 = **0.09 per option**
  • Put at K=65: payoff = (65 − 59) × 0.01=0.01 = **0.06 per option**

Claiming Payouts

After settlement, participants claim their payouts:

Holders — claimHolderPayout(seriesId, amount)

Burns the specified amount of option tokens and transfers the USDC payout:
payout = amount × payoffPerOption / 1,000,000
If the option expired worthless (payoffPerOption = 0), the tokens are burned but no USDC is transferred.

Writers — claimWriterCollateral(seriesId)

Returns the writer’s remaining collateral after holder payouts are deducted:
writerPayout = writerCollateral × writerPoolRemaining / totalCollateral
This is a one-shot operation — the writer’s recorded collateral is zeroed after claiming.

Trust Model

ComponentTrust assumption
Resolution signerTrusted to sign accurate VWAP / binary attestations
On-chain contractVerifies EIP-712 signature but does not verify VWAP computation
Contract ownerCan break-glass settle and rotate the resolution signer
HoldersCan always claim after settlement — never blocked by pause
The resolution signer is an operational trust assumption. The on-chain contract verifies the signature’s authenticity but cannot independently verify the VWAP computation. This is analogous to oracle trust in DeFi protocols.