| id | Title | Status | Author | Description | Discussions to | Created |
|---|---|---|---|---|---|---|
| OIP-258 | Introduce Chainlink-Verified Ticket Cashout | Vote Pending | Danijel | Introduce early ticket cashout allowing users to exit prematch and live parlays using Chainlink-verified pricing | https://discord.com/invite/overtime-io | 2026-02-27 |
This OIP proposes introducing Cashout functionality for Overtime tickets, allowing users to exit active bets before final settlement using dynamically calculated market pricing.
Cashout enables users to lock profits or reduce exposure while maintaining fully verifiable onchain settlement and protocol safety.
Unlike traditional sportsbooks, cashout pricing is verified through a Chainlink adapter, ensuring exits are based on real available odds for remaining ticket legs.
Overtime tickets currently settle only once all markets resolve (unless they lose early on one of the legs).
This proposal introduces a secure early-exit mechanism allowing tickets to be cashed out whenever valid odds exist for remaining unresolved legs.
Process overview:
Cashout works for:
Cashout is one of the most widely used sportsbook features. Without early exits, users must wait for final settlement even when probabilities change significantly.
Cashout allows active risk management while preserving deterministic onchain settlement.
The Chainlink adapter enables identical pricing logic across both prematch and live betting.
Cashout remains available whenever active odds exist for unresolved legs.
Prediction markets such as Polymarket and Kalshi gained adoption largely due to fair early exits.
However, they support only single positions.
Overtime extends early exits to:
This creates a uniquely capable onchain sportsbook experience.
Cashout allows users to:
It also reduces protocol exposure duration.
Cashout execution involves three components.
Only the cashoutProcessor contract may execute cashouts.
The following sequence illustrates the cashout execution process.
User
|
| requestCashout(ticket, expectedOddsPerLeg[], isLegResolved[], additionalSlippage)
v
CashoutProcessor
|
| validates eligibility + ownership
| verifies user did not lie about resolved legs / settled odds
| submits Chainlink request
v
Chainlink Adapter
|
| returns (allow, approvedOddsPerLeg[])
v
CashoutProcessor.fulfillCashout()
|
| rejects if stale (maxAllowedExecutionDelay)
| re-checks leg status / settled odds
| enforces per-leg slippage for pending legs
v
SportsAMMV2.cashoutTicketWithLegOdds(ticket, approvedOddsPerLeg[], isLegResolved[], requester)
|
v
Ticket.getCashoutQuoteAndPayout(...)
|
v
Ticket.cashout() -> User receives payout
Cashout pricing follows a probability-ratio model.
Definitions:
Resolved winning or voided legs contribute probability = 1.
P_orig = product(original_leg_probability)
P_live = product(live_leg_probability)
R = P_live / P_orig
This represents how ticket value changed relative to entry price.
The cashout fee is derived from the existing SafeBox fee parameter.
Per-leg cashout fee:
v = 4 × SafeBoxFee
At current parameters:
This multiplier approximates the average protocol margin per leg, compensating liquidity providers for assuming the remaining market risk when purchasing a ticket early.
Because the protocol assumes the remaining ticket risk when executing a cashout, the fee compounds across unresolved legs.
KeepMultiplier = (1 − v)^(n + 1)
Where:
The additional +1 term reflects the protocol taking over the ticket exposure during the cashout transaction.
With v ≈ 4%, this produces a minimum effective fee close to ~8% even when only one leg remains.
| Remaining Legs | Effective Fee |
|---|---|
| 1 | ~7.8% |
| 2 | ~11.5% |
| 3 | ~15.1% |
| 4 | ~18.5% |
CashoutQuote = (P_live / P_orig) × (1 − v)^(n + 1)
CashoutPayout = BuyInAmount × CashoutQuote
If any remaining leg is already losing:
CashoutPayout = 0
Cashout execution includes slippage protection based on per-leg implied probabilities, not on a minimum final payout.
When requesting a cashout, the user supplies:
During fulfillment, for each pending (unresolved) leg the contract enforces:
approvedOdd <= expectedOdd × (1 + additionalSlippage)
Resolved legs are not subject to slippage; instead, they must match the settled onchain odd:
This mechanism protects users against:
To reduce stale-quote risk, fulfillments are rejected if too much time has elapsed.
A fulfillment must execute within:
timestampPerRequest + maxAllowedExecutionDelay > block.timestamp
The initial configuration proposes:
This parameter is governance/owner configurable and can be adjusted as the system matures.
A ticket may be considered cashoutable only if all of the following conditions are satisfied:
Conceptually (high-level view):
isPotentiallyCashoutable = !ticket.resolved() && !ticket.isTicketLost() && !isSGP && !isSystem && createdAfterCashoutDeploy && !(ticket.totalQuote() <= riskManager.maxSupportedOdds()) && ticketOwner != address(sportsAMM.freeBetsHolder())
Cashout is not supported for:
System bets and SGPs introduce complex payout dependencies and correlation structures that require additional pricing and risk modeling.
Free bet tickets are excluded to prevent exploitation of promotional incentives via early exit.
These limitations may be revisited in future proposals.
Cashout parameters can be changed by governance (pDAO) over time as the protocol gains confidence and practical knowledge of cashout usage.
Governance may adjust:
Copyright and related rights waived via CC0.