id | Title | Status | Author | Description | Discussions to | Created |
---|---|---|---|---|---|---|
TIP-162 | Add player props markets to Overtime | Draft | @cvija @gruja | Add player props markets to Overtime | https://discord.gg/rPpPcMXSeU | 2023-08-11 |
This TIP proposes to add markets for individual player props on Overtime.
Overtime has been running successfully for more than a year now. The volume is continuously growing, and the AMM is profitable. Over the past 13 months, many new sports have been added along with various types of markets, including double chances, spreads, totals, and single-game parlays. Now, the time has come for the next step: the addition of player props markets.
According to reports from relevant institutions, player props have accounted for 38% of all sportsbook volume. This is a substantial portion of activity that cannot be ignored. Overtime's odds providers are finally prepared to offer these types of markets themselves. Therefore, I propose their addition at the start of the upcoming seasons.
Player props are intriguing in the way they provide much more variety. You can select a specific player and explore numerous markets related to that player. For instance, in the case of an NBA player, you can consider points, assists, rebounds, and more. In this particular market, you decide whether the outcome will be OVER or UNDER a designated line. For instance, you can bet on whether LeBron James will score OVER or UNDER 27.5 points. The odds for these two options are generally balanced, similar to total points markets, ensuring more competitive odds for users. Both the over and under options are likely to have odds of around 50%, and the line is the variable that will adjust.
Because not only the odds but also the specific thresholds change on the data provider's side as a given game approaches, we need to implement these markets differently than regular moneyline markets. This approach will be akin to how total markers are handled. Further details are available in the specification section.
The initial rollout is planned to coincide with the start of the 2023/2024 NFL season. Support for other leagues and sports is anticipated to be added later (NBA, MLB, NHL, etc.).
Example game:
NBA Lakers vs Clippers
Market: LeBron James - 27.5 points
Player prop points: Threshold = 27.5: will resolve as OVER if players total points in a game surpasses 27.5, or UNDER otherwise.
Assumption is that all markets are resolved with results after overtimes (for binary sports, not for soccer).
The splineread can change as we get closer to the game, e.g. the following can be a sequence of data chronologically as we get it from the oracle:
- Lebron James (27.5)
- Lebron James (26.5)
- Lebron James (27.5)
- Lebron James (29.5)
Every time the line changes we create a new market and pause the previous one. Due to implementation complexity the skew and caps are reset every time a new market is created, so for the MVP release we will start with managable caps to not risk all AMM liquidity on a single game.
If a line reappears (27.5 in the example above), we will reaactivate the market that has been previously created.
Each player props will have a reference to the parent market which is the one currently known as moneyline.
Per previously established rules a Parlay can only have one prop from a specific player in a ticket. Combining the outcome of the game with a player prop from that same game also will not be possible.
Examples:
2 games LA Lakers vs Denver Nuggets Miami Heat - Toronto Raptors
Invalid LeBron James points (27.5) OVER LeBron James rebounds (6.5) OVER
Invalid: LeBron James points (27.5) OVER LA Lakers WIN
Valid: LeBron James points (27.5) OVER Miami Heat WIN
Valid: LeBron James points (27.5) OVER Anthony Davis points (21.5) OVER
Valid: LeBron James points (27.5) OVER Jimmy Butler points (25.5) UNDER
It is also important to add the cases in which the props market is to be canceled:
- If the parent market / game is canceled
- If the player in question does not enter the game (or start in some cases, depending on the sport)
- If the market finishes exactly at the line (example - the line is Lebron James points (25), and he scores 25 points)
The main contracts related to player props are:
- GamesPlayerPropsReceiver.sol
- GamesPlayerProps.sol
-
GamesPlayerPropsReceiver
is a contract that directly communicates with the CL Node wrapper contract. This contract stores valid options per sport, which can be increased or decreased using pDAO. In the context of the NBA, options could include assists, points, and other statistics, while in other sports, options might include strikeouts in MLB, for instance. This contract maintains a record of valid player props option to be created for a given sport.Two key properties of this contract are:
mapping(uint => mapping(uint8 => bool)) public isValidOptionPerSport; mapping(uint => uint[]) public optionsPerSport;
The methods for receiving and resolving player props are
fulfillPlayerPropsCLResolved
andfulfillPlayerProps
Both of these methods send results to the
GamesPlayerProps
contract for further processing.The owner methods, executable by pDAO, include:
setValidOptionsPerSport
: Used to set or remove valid options for a given sport.setConsumerAddress
- Sets conusmer address (which already exists), consumer is main contract for a gamessetWrapperAddress
- Sets the wrapper address (which already exists), responsible for calling the CL node and transferring data to theGamesPlayerPropsReceiver
contract.setPlayerPropsAddress
- Sets theGamesPlayerProps
contract for data processing.addToWhitelist
- Adds whitelist addresses permitted to call methods in theGamesPlayerPropsReceiver
contract for data processing.
-
GamesPlayerProps
is the main contract for processing data. It only receives data from theGamesPlayerPropsReceiver
contract. Processing includes creating markets, updating odds, resolving markets, and canceling markets, depending on the received data.The primary property that stores player props for a given game and player holds the active line and odds for a specific game, player, and option:
mapping(bytes32 => mapping(bytes32 => mapping(uint8 => IGamesPlayerProps.PlayerProps))) public playerProp;
Another property determines whether data can be stored in the contract:
mapping(uint => bool) public doesSportSupportPlayerProps;
The main methods for data processing, namely
obtainPlayerProps
andresolvePlayerProps
, can only be called fromGamesPlayerPropsReceiver
Additionally, methods for canceling and pausing player props are managed exclusively by the consumer contract. These methods,
cancelPlayerPropsMarketForMain
andpauseAllPlayerPropsMarketForMain
, come into play when the main market is canceled or paused under different circumstances.Owner methods, accessible to pDAO:
setContracts
- Sets all contracts that interact withGamesPlayerProps
, including the sports manager, consumer, verifier, and more.setSupportedSportForPlayerPropsAdded
- Establishes support for player props in a particular sport by setting a true/false flag.
Copyright and related rights waived via CC0.