# What is Overtime?

A fully onchain sportsbook ecosystem

Looking for something truly **fun and innovative in DeFi**?\
Meet **Overtime.io**, the fully onchain sportsbook ecosystem that’s redefining online betting and trading.

Overtime lets you place bets on **popular sporting events** and engage in **digital options trading**, all powered by **smart contracts** and secured with **industry-leading Chainlink and Pyth oracles data feeds**. No central authority. No gatekeepers. Just **pure, decentralized fun onchain**.

***

### Why Overtime?

Overtime isn’t just another sportsbook — it’s **a fully blockchain based** **sports betting infrastructure**:

* 🔗 **100% Onchain** – Every bet is executed transparently with immutable smart contracts.
* 🏦 **Self-Custody** – You stay in control of your funds. No centralized custodials, no middlemen.
* 🌍 **Permissionless Access** – No signups, no bans, no limits. Anyone, anywhere, can play.
* 💰 **Instant Liquidity** – Enjoy fast payouts and competitive odds without delays.
* 🎁 **Rewards All Year** – Earn airdrops, free bets, and loyalty rewards.
* 🏛 **Be the House** – Provide liquidity to Overtime pools and earn a share of the action.

Traders can experience all the fun of sports betting with global permissionless access, no one taking custody of your funds, and no user registration.  No one can be excluded or stopped from using Overtime. It is only you versus the smart contracts.

***

### How It Works

1. **Connect** your EVM wallet or social account.
2. **Deposit** supported cryptocurrencies directly into your personal onchain account.
3. **Bet** on sports or trade digital options instantly.
4. **Withdraw** anytime — no restrictions, no delays.

Overtime combines the **thrill of traditional sportsbooks** with the **security and freedom of DeFi**. There are no blacklists, no custodians, and no centralized control. It’s **you versus the smart contracts**.

***

### The First of Its Kind

Overtime is the **first sportsbook to deliver decentralization, instant liquidity, and competitive odds in one platform**. Whether you're betting, trading, or earning as a liquidity provider, you’re part of a **new era of permissionless betting.**

Overtime is here to **bring the game to the blockchain**, and you’re invited to play.

### Shortcuts

* [Overtime Sportsbook App](https://www.overtimemarkets.xyz/)
* [Governance](/learn-about-overtime/overtime-governance)
* [Step by step guide to using Overtime](/get-started/how-to-bet)
* [Frequently Asked Questions](/get-started/faq)


# How to Sign-Up

How to connect to Overtime and start betting!

<figure><img src="/files/3zRlIgEEICUAMRLSfD5I" alt=""><figcaption></figcaption></figure>

***

### Social Login

You can Sign In to Overtime instantly using your  **Google**, **X.com**, **Discord** or **Apple** account.

By signing in to Overtime this way, you create your own non-custodial ethereum wallet directly embedded in the application. This wallet is then used to control your Overtime Account!

***

### Connect via Crypto Wallet

Overtime supports most crypto wallets, including Rabby, MetaMask, Coinbase Wallet, Binance wallet and others.

If you directly connect your own ethereum wallet to Overtime, that wallet will be the owner of your Overtime Account and will be used to control it.

***


# How to Deposit

How to add funds to your Overtime Account

This guide will walk you through the deposit process for Overtime, covering popular methods and instructions for buying and depositing.

***

{% hint style="info" %}

### What funds and on what networks are used to trade on Overtime?

Overtime uses the popular cryptocurrencies **USDC**, **USDT** and **ETH**; as core collaterals to be used for betting.

Depending on your preference, Overtime is deployed and can be used on <mark style="color:red;">**Optimism**</mark>, <mark style="color:blue;">Arbitrum</mark> or <mark style="color:purple;">Base</mark> network!

Any user can switch between these networks at any time in the dapp.
{% endhint %}

***

## Deposit from Crypto Exchanges

<figure><img src="/files/peDnCfGlDyORQwBiZPgD" alt="" width="375"><figcaption></figcaption></figure>

USDC, USDT and ETH are available on most major crypto exchanges, such as Coinbase, Binance, Kraken, Bybit etc.\
\
You can find detailed guide on how to buy from popular exchange and deposit to Overtime here :arrow\_down\_small::arrow\_down\_small::arrow\_down\_small:

{% content-ref url="/pages/4K7a7jbCBtfRxEakb1EC" %}
[Deposit from Exchange](/deposits-and-withdrawals/deposit-from-exchange)
{% endcontent-ref %}

***

## Deposit with Apple Pay, Google Pay, Visa or Mastercard

Overtime integrated Swapper to provide easy funding of Overtime Account directly from users digital or physical credit cards!

You can fund directly to Overtime using the `Buy With Card` button on the Add Funds modal.

In depth guide for depositing with card :arrow\_down\_small::arrow\_down\_small::arrow\_down\_small:

{% content-ref url="/pages/iIjRTBrxSP6XjoRGhpXQ" %}
[Deposit with Apple Pay, Google Pay, Visa or Mastercard](/deposits-and-withdrawals/deposit-with-apple-pay-google-pay-visa-or-mastercard)
{% endcontent-ref %}

***

## Deposit directly from your Ethereum Wallet

You can add funds to your Overtime Account from any external Ethereum Wallet by using the Deposit from Wallet tool.

YDetailed guide on how to Deposit From Wallet :arrow\_down\_small::arrow\_down\_small::arrow\_down\_small:

{% content-ref url="/pages/d8q93uhcOLyA2ElUpavC" %}
[Deposit directly from your Ethereum Wallet](/deposits-and-withdrawals/deposit-directly-from-your-ethereum-wallet)
{% endcontent-ref %}


# How to Bet

Overtime makes engaging with sports via blockchain both fun and seamless. Our intuitive dapp delivers a user-friendly market interface crafted to elevate your experience.&#x20;

{% hint style="info" %}
**Use Discord widget in the app for live support**

* Stay connected to the community without leaving the app.
* Click the Discord icon in the lower-right corner of the home screen.
* Want to dive deeper into Overtime's community? Use this [Discord Invite Link](https://discord.com/invite/overtime-io).
  {% endhint %}

<h2 align="center">Check out the video tutorial for a visual walkthrough.</h2>

{% embed url="<https://drive.google.com/file/d/1LDIVibbK4mhkvyDwmBwKBklyH94RuVm9/view?usp=sharing>" %}

<h2 align="center"><strong>For written guide, follow the steps below!</strong></h2>

### 1. Sign In

* Launch the Overtime homepage and click <mark style="color:yellow;">**`SIGN IN`**</mark>
* Pick your **Social Login** or **Connect Wallet** directly.
* Approve access to your account/address.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqSlj8vWOOVBuhXhcN6iy%2Fuploads%2F7PvAqHbB7eac7jm7xScc%2FScreen%20Recording%202025-09-04%20154151.mp4?alt=media&token=b09844ec-4a2c-42f9-96c8-2304e0a8916f>" %}

### 2. Discover Markets

* Navigate to the **Sports & League** menu in the sidebar.
* Browse the dropdown to find your favorite league.
* Add leagues to your **Favorites** by clicking the ⭐ icon, your favorites will appear at the top of the menu.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqSlj8vWOOVBuhXhcN6iy%2Fuploads%2Fs37zCd35y6149jCneNu4%2Ffavorites.mp4?alt=media&token=a3d2d06e-283c-4e11-9dfd-5cd937773894>" %}

### 3. View & Trade Markets

* After selecting a league, you’ll see upcoming matches along with popular betting lines: **Moneyline**, **Handicap**,**Total etc.**
* Want more options? Click the dropdown next to **Total** to explore additional lines, including player props.
* Found a line you like? Click it to add it to your **Ticket Builder** on the right.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqSlj8vWOOVBuhXhcN6iy%2Fuploads%2F9VZPmyU5uLIDgqVZslU6%2FExpand_and_add_to_parlay.mp4?alt=media&token=6797378c-ccb0-4ccb-b195-de9a5e493670>" %}

### 4. Place Your Bet

* Your selections appear in the Ticket Builder. Planning a parlay? Add more legs to stack your bets.
* Review the latest quote for accuracy.
* Type in your stake:
  * Using $**OVER** tokens? Enjoy a **2% boosted returns**.
  * Prefer other crypto? You can pay with **USDC, USDT,** **ETH etc.** *These **do not offer boosted returns**.*
* Review your potential profit and total payout, then **confirm**, **sign**, and you’re all set.

#### 5. Track Your Positions

* Head to **Profile** at the top of the app to monitor your activity.
  * See all your **open** and **claimable** positions.
  * Review your entire **transaction history**.
  * Track your stats: total trades and volume.

### Discord Integration

{% hint style="info" %}
Use Discord widget in the app for live support

* Stay connected to the community without leaving the app.
* Click the Discord icon in the lower-right corner of the home screen.
* Want to dive deeper into Overtime's community? Use this [Discord Invite Link](https://discord.com/invite/overtime-io).
  {% endhint %}


# FAQ

<details>

<summary><strong>How do I start using Overtime?</strong></summary>

1. Log In to overtimemarkets.xyz with your wallet or social login method
2. If you are not familiar with Ethereum wallets, deposit supported cryptocurrencies into your Overtime Account. If you already have Ethereum wallet with funds in it, you can switch to EOA mode and bet directly from your wallet.
3. Start betting

</details>

<details>

<summary><strong>On what networks is Overtime deployed?</strong></summary>

Overtime is deployed on [Optimism](https://www.optimism.io/apps/defi), [Arbitrum](https://arbitrum.io/) and [Base](https://www.base.org/).

</details>

<details>

<summary><strong>Is Overtime decentralized?</strong></summary>

Overtime  is decentralized, runs entirely on permissionless Ethereum smart contracts and does not hold custody of user funds. Users bet directly from their wallets.

</details>

<details>

<summary><strong>What if I deposited funds in my Overtime Account on the wrong network?</strong></summary>

**Follow this guide:** [Deposited funds using Ethereum Mainnet](/deposits-and-withdrawals/common-user-mistakes/deposited-funds-using-ethereum-mainnet)

</details>

<details>

<summary><strong>Does Overtime have an official token?</strong></summary>

Yes, Overtime's official token is $OVER. You can read about it's utility and purpose here: <https://www.overtime.io/over-token>

</details>

<details>

<summary><strong>How is Overtime governed?</strong></summary>

Overtime relies on the Overtime DAO governance structure. The Overtime DAO and the Overtime Council control key aspects of the protocol, with the foundation being the holders of the $OVER token.  See the [Governance Page](/learn-about-overtime/overtime-governance) for more info.&#x20;

</details>


# Deposit Guides

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>Deposit Crypto Guide</td><td data-object-fit="contain"><a href="/files/cFbZfphQ27dvfDd5eAoJ">/files/cFbZfphQ27dvfDd5eAoJ</a></td><td><a href="/pages/7Vyd4pa6W9VD07vckAay">/pages/7Vyd4pa6W9VD07vckAay</a></td></tr><tr><td>Buy With Card Guide</td><td data-object-fit="contain"><a href="/files/I9xGIp4SWbER2VawZnA5">/files/I9xGIp4SWbER2VawZnA5</a></td><td><a href="/pages/iIjRTBrxSP6XjoRGhpXQ">/pages/iIjRTBrxSP6XjoRGhpXQ</a></td></tr><tr><td>Deposit From Wallet Guide</td><td data-object-fit="contain"><a href="/files/TEwTy0o7HXOTADfsxVW1">/files/TEwTy0o7HXOTADfsxVW1</a></td><td><a href="/pages/d8q93uhcOLyA2ElUpavC">/pages/d8q93uhcOLyA2ElUpavC</a></td></tr></tbody></table>


# Deposit Crypto

The Easiest Way to Onboard Overtime

### Using the Deposit Crypto option

Deposit Crypto option allows you to fund your Overtime Account from various types of supported tokens and networks, which automatically get routed as Overtime-supported funds.

### Step by step guide

1. Open the **`Add Funds`** modal
2. Click on the **`Deposit Crypto`** option.
3. Select your token you are sending to Overtime for funding and select the network you are sending from. Click Continue.

<figure><img src="/files/fmsY4aG6v7caeAB09BBR" alt=""><figcaption></figcaption></figure>

4. Input how much money you are depositing.
5. Copy the Deposit Address and send the designated funds from your source to the copied address shown as Deposit Address on the pop up.

<figure><img src="/files/IKV3wfpib0AAwNg4UDgd" alt=""><figcaption></figcaption></figure>

6. Wait up to 15 minutes for your funds to settle on Overtime.


# Deposit with Apple Pay, Google Pay, Visa or Mastercard

Using the integrated Onramper fiat aggregator

To allow users to onboard their Overtime Account seamlessly, Overtime has integrated Swapper, the leading fiat on-ramp aggregator.&#x20;

You can fund your Overtime Account directly from digital or physical credit cards!

## Step-By-Step Guide:

1. Click on the **`Add Funds`** modal.
2. Click on the **`Buy With Card`** button.
3. On the first input field, input how much money you want to convert to crypto and deposit to your Overtime Account. You can also choose other fiat currency type than default.
4. Pick your payment method on the `By` part of the widget:

<figure><img src="/files/bjqoUEjU3ajarhMpQlj6" alt=""><figcaption></figcaption></figure>

7. Click on BUY and follow the onramping process. Finish it all the way, do not close the page until everything is finalized completely.
8. Go back to Overtime ACCOUNT page and wait for your funds to land.


# Deposit directly from your Ethereum Wallet

Learn about Tokens and Networks that are supported for deposit

With this tool, you can use any token from your external crypto wallet to fund your Overtime Account.

## Step-By-Step Guide:

1. Click on the Add Funds button on the top right corner of main Overtime Markets page.
2. Click on the **`Deposit From Wallet`** option
3. Select your external wallet from the Connect a Wallet menu from which you want to fund your Overtime Account
4. After connecting to your wallet, select the asset you want to use to fund your Overtime Account
5. On the next page, input the amount you want to deposit on the top input field.
6. **Click `Continue`,** (if prompted click the switch network button as well), then click on the final **`Deposit`** button that appears.
7. Now your transaction prompt will open on your external wallet, which you have to confirm.
8. Wait for your funds to land on your Overtime Account.


# Deposit from Exchange

Guides on how to deposit funds to your Overtime Account from your CEX (Binance, Coinbase, Kraken, OKX, etc.) account and start trading!

***

<h2 align="center">How to Buy Crypto on a CEX and Deposit to Overtime</h2>

### Step 1 – Create and Verify a CEX Account

{% hint style="success" %}
If you already have a CEX account, you can skip this step.
{% endhint %}

* Choose a centralized exchange (CEX) such as Binance, Coinbase, Kraken, or OKX.
* Register and complete any required **KYC verification**.
* Deposit fiat currency (USD, EUR, etc.) via bank transfer, card, or another supported method.

***

### Step 2 – Buy USDC, USDT, ETH, or wBTC

* On your chosen CEX, purchase one of the supported assets for Overtime:
  * **USDC**
  * **USDT**
  * **ETH**
* These assets are supported when depositing on Overtime.

***

### Step 3 – Use Deposit Crypto on Overtime

* In the **withdrawal** or **send crypto** section of your CEX:
  1. Select the token you want to transfer (e.g. USDC).
  2. Go to Add Funds on Overtime and click on **Deposit Crypto**

3. Select your token you are sending and select the network you selected on CEX for withdrawing. Click Continue.

<figure><img src="/files/fmsY4aG6v7caeAB09BBR" alt=""><figcaption></figcaption></figure>

4. Input how much money you are depositing.
5. Copy the Deposit Address and paste on your CEX for withdrawing.

<figure><img src="/files/IKV3wfpib0AAwNg4UDgd" alt=""><figcaption></figcaption></figure>

6. Wait up to 15 minutes for your funds to land on Overtime.

***

### Step 4 – Use Your Funds on Overtime

* Once the transaction confirms (usually under 5 minutes on Optimism), your funds will appear in your Overtime Account!
* Go to [**OvertimeMarkets.xyz**](https://www.overtimemarkets.xyz/), connect your account, and start betting.

***

✅ That’s it! You’ve successfully moved funds from a CEX to Overtime on a supported L2 chain.

## DETAILED  DEPOSIT GUIDES FOR COINBASE AND BINANCE USERS

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td></td><td><a href="/pages/Yon1Dq50fsPgUQyE5jv3">Deposit from Coinbase</a></td><td></td><td><a href="/files/IZ0MwEiUEmvqijTMJP3x">/files/IZ0MwEiUEmvqijTMJP3x</a></td></tr><tr><td></td><td><a href="/pages/bVGHiqz4NMXZAxtLSieB">Deposit from Binance Mobile App</a></td><td></td><td><a href="/files/VosN1Yk2pL5u5ACFOEHn">/files/VosN1Yk2pL5u5ACFOEHn</a></td></tr><tr><td><p></p><p><a href="/pages/ndfJRoTxlXgVAxJWm32N">Deposit from Binance Website</a></p></td><td></td><td></td><td><a href="/files/QXWUPpOXCbV6oXp4wBHR">/files/QXWUPpOXCbV6oXp4wBHR</a></td></tr></tbody></table>

***


# Deposit USDC from Coinbase

## **If you don’t have USDC on Coinbase** <a href="#block-0f9873169aa34fb683817303806dc44b" id="block-0f9873169aa34fb683817303806dc44b"></a>

**Step by step guide how to acquire USDC on Coinbase before depositing to Overtime**

#### 1. Click **‘Buy & Sell’** on the Coinbase homepage.

<figure><img src="/files/FQfaJfsySwnf9RWjRxZz" alt="" width="375"><figcaption></figcaption></figure>

2. Click **‘Buy’** then under *Select Asset*, click **USD Coin (USDC).**

<div align="center"><figure><img src="/files/9mAfra7rqzB6D5qIkdTv" alt="" width="160"><figcaption></figcaption></figure></div>

3. **Enter an amount & connect a payment method under ‘*****Pay with’.***

<figure><img src="/files/TMkwKUCBuY885uYjv5vB" alt="" width="188"><figcaption></figcaption></figure>

4. Click **‘Preview Buy’**, review the *Order Preview,* then click **Buy Now.**

<figure><img src="/files/SmZMpyqrEd5a4fNzmKv9" alt="" width="188"><figcaption></figcaption></figure>

5. You’ll see a “*Your order was submitted”* screen, then will receive a confirmation email when your USDC purchase is successful.

<figure><img src="/files/56uLcXdpIC5BcK7FUNDJ" alt="" width="188"><figcaption></figcaption></figure>

## **You have acquired USDC on Coinbase** <a href="#block-3886d7582aa848faa176ee8e9351cc83" id="block-3886d7582aa848faa176ee8e9351cc83"></a>

1. 1\. Click **Send & Receive.**

<figure><img src="/files/KJma1SlXEwoSGL87icKY" alt=""><figcaption></figcaption></figure>

2. Under *Asset*, select **USD Coin.**

<figure><img src="/files/oF8EKKOqIEXALSaHNQpp" alt="" width="188"><figcaption></figcaption></figure>

3. **Enter the amount** you wish to deposit to Overtime.

<figure><img src="/files/e6YPWADwtIgbcuQBA2NH" alt="" width="160"><figcaption></figcaption></figure>

4. **Under ‘*****to*****’, enter your Overtime deposit address.** You can find yours on the Overtime Deposit Page. Then **click ‘*****Continue’***.

   <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><p><strong>Note that the address pictured below is just an example. Please only copy your own address, which is on the deposit page.</strong></p></div>

<figure><img src="/files/8W8s9OOXpIoAvRMgUUeq" alt="" width="294"><figcaption></figcaption></figure>

4. Under ‘*Network*’, select **OPTIMISM or ARBITRUM or BASE.**

{% hint style="danger" %}

### ⚠️ Important: Do NOT SEND FUNDS FROM "ETHEREUM DEFAULT" to your Deposit address or your funds might be LOST!

MAKE SURE to SELECT EITHER OPTIMISM, ARBITRUM or BASE NETWORKS WHEN WITHDRAWING!
{% endhint %}

<p align="center">   <img src="/files/H6kZOuFG7rYo6pAmfgkk" alt=""></p>

6. Click **Send Now** and wait for your your deposit to land on Thales Markets Deposit page (usually in a couple minutes).

<figure><img src="/files/4ntcFMEBG13AL7gyzUnr" alt="" width="188"><figcaption></figcaption></figure>

7. You are now ready to trade on Overtime!&#x20;

docs.overtimemarkets.xyz/overtime-market-guide/how-to-use-overtime

{% hint style="info" %}

### To learn how to use Overtime, visit this Overtime Guide page:  [docs.overtime.io/get-started/how-to-bet](https://docs.overtime.io/get-started/how-to-bet)

{% endhint %}


# Deposit USDC or USDT from Binance

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td></td><td><a href="/pages/V4xzxZBEMALaUVjpG72X">Deposit from Binance Mobile App</a></td><td></td><td><a href="/files/xv0zNY0lDnIXFAmRVJZ5">/files/xv0zNY0lDnIXFAmRVJZ5</a></td></tr><tr><td></td><td><a href="/pages/oiRTzyMxB0aesdBmf4Eq">Deposit from Binance Website</a></td><td></td><td><a href="/files/5T6KlrqD5VZWG5D6lI0i">/files/5T6KlrqD5VZWG5D6lI0i</a></td></tr></tbody></table>

***


# Deposit from Binance Mobile App

How to deposit to Overtime from Binance Mobile

Log in to your Binance App and tap **\[Wallets]** - **\[Spot]** - **\[Withdraw]**.

<figure><img src="/files/TqZEYb1GTPhEtviklZYH" alt="" width="188"><figcaption></figcaption></figure>

2. Choose USDC or USDT (whichever of the two you own in your Binance account). Then, tap **\[Send via Crypto Network]**.

<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2F6i6Hkfa6IgJcetiKddMq%2Fannotely_image%20(7).png?alt=media&#x26;token=40d699e0-bf05-49ff-afec-3154fcfe145c" alt="" width="188"><figcaption></figcaption></figure>

<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FcaHyrrIOZhgsKtVJkFNR%2Fannotely_image%20(8).png?alt=media&#x26;token=610081fa-a934-4e3c-8d90-7a0a034d3e3e" alt="" width="188"><figcaption></figcaption></figure>

3. In the `Address` input field , paste the destination address copied from your Overtime Deposit page.

{% hint style="warning" %}
**Note that the address pictured below is just an example. Please only copy your own address, which is on the Overtime deposit page.**
{% endhint %}

<figure><img src="/files/8W8s9OOXpIoAvRMgUUeq" alt="" width="294"><figcaption></figcaption></figure>

4. &#x20;Select the network

{% hint style="danger" %}
Please choose the network carefully and <mark style="color:red;">**make sure that the selected network is**</mark>**&#x20;**<mark style="color:$primary;">**OPTIMISM, ARBITRUM or BASE**</mark>**.**&#x20;

If you select the wrong network, your funds might be lost and couldn’t be recovered.

<mark style="color:red;">DO NOT select by looking for cheapest fee option.</mark> <mark style="color:red;"></mark><mark style="color:red;">**Select the one that is compatible with the external platform.**</mark>
{% endhint %}

<div><figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2Ft1WBnJbLKcmJTFvO4ptl%2Fviber_image_2023-12-12_13-47-27-762.jpg?alt=media&#x26;token=22d0a9df-1041-4961-bc4a-9a122e502a12" alt="" width="375"><figcaption><p>Optimism button</p></figcaption></figure> <figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FMrzk4rqcZHxD7pA4m1SI%2Fviber_image_2023-12-12_13-47-27-782.jpg?alt=media&#x26;token=b01c6c8a-a051-411a-bb1c-446be8a2ff01" alt="" width="375"><figcaption><p>Arbitrum button</p></figcaption></figure></div>

5. Enter the withdrawal amount and you will see the corresponding transaction fee and the final amount you will receive. You can also select which wallet to withdraw from by tapping **\[Spot & Funding Wallet].** Tap **\[Withdraw]** to proceed.
6. You will be prompted to confirm the transaction again. Please check carefully before tapping **\[Confirm]**.If you enter the wrong information or select the wrong network when making a transfer, your assets will be permanently lost. **Please make sure the information is correct before you confirm the transaction.**
7. Verify the transaction with your 2FA devices. After confirming the withdrawal request, please wait patiently for the transfer to be processed.


# Deposit from Binance Website

How to deposit to Overtime Account from the Binance Website on your computer

1. Log into your Binance account and click **\[Wallet]** - **\[Overview]**.

{% embed url="<https://public.bnbstatic.com/image/cms/article/body/202303/9723115f02d62c3f91326738626ab848.png>" %}

2. &#x20;Click **\[Withdraw]**.

{% embed url="<https://public.bnbstatic.com/image/cms/article/body/202303/8ce657dc5127d8f89093161e29fec9a5.png>" %}

3. You will be redirected to the withdrawal page. Click **\[Withdraw Crypto]**.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FOhYrCm5gNWPmxmMD9AwL%2F5e9c45de8803fdcfd5aefdfe4212a7fe.png?alt=media&token=15ab7ade-767e-4fd4-8aa5-663041191c9d>" %}

4. Choose USDC or USDT (whichever of the two you own in your Binance account).

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FpxLymQz92o7Lr7XDeQ3I%2Fannotely_image%20(9).png?alt=media&token=65389c7a-afb0-4aeb-b302-f48b3efd1e7f>" %}

5. Select the network. Depending on the crypto you choose, you will see the corresponding supported networks and network fees for this transaction.&#x20;

{% hint style="danger" %} <mark style="color:red;">**Please make sure that the network is**</mark>**&#x20;**<mark style="color:$primary;">**OPTIMISM, ARBITRUM or BASE**</mark><mark style="color:red;">**.**</mark> If you select the wrong network, your funds might be lost and couldn’t be recovered.
{% endhint %}

6. In the `Address` input field , paste the destination address copied from your Overtime Deposit page.

{% hint style="warning" %}
**Note that the address pictured below is just an example. Please only copy your own address, which is on the Overtime deposit page.**
{% endhint %}

<figure><img src="/files/8W8s9OOXpIoAvRMgUUeq" alt=""><figcaption></figcaption></figure>

7. Enter the withdrawal amount. You may choose to use the balance from your Spot or Funding Wallet. You will see the transaction fee and the final amount you will receive. Click **\[Withdraw]** to proceed.
8. You will be prompted to confirm the selected network again. Click **\[Confirm]** if the receiving platform supports the network.
9. Check the withdrawal details carefully. Click **\[Continue]** and verify the transaction with your 2FA devices.
10. Your withdrawal request has been submitted. After confirming your request on Binance, it takes time for the transaction to be confirmed on the blockchain. The [confirmation time](https://academy.binance.com/en/glossary/confirmation-time) varies depending on the blockchain and its network traffic. Please wait patiently for the transfer to be processed.


# Common User Mistakes

Troubleshooting common user mistakes and how to fix them

{% content-ref url="/pages/NmoabWujfl5WYN9gaPkB" %}
[Deposited funds using Ethereum Mainnet](/deposits-and-withdrawals/common-user-mistakes/deposited-funds-using-ethereum-mainnet)
{% endcontent-ref %}


# Deposited funds using Ethereum Mainnet

This guide will help you how to bridge your Overtime Account funds to Optimism if you deposited using Ethereum Network.

One of the most common mistakes users make when Depositing to their Overtime Account, is **depositing funds using Ethereum Mainnet instead of Optimism, Arbitrum or Base L2 networks.**

{% hint style="danger" %}
Overtime only supports deposits using **Optimism, Arbitrum and Base** network&#x73;**.**&#x20;

**ETHEREUM MAINNET FUNDS ARE NOT SUPPORTED!**
{% endhint %}

If you accidentally deposited funds to your Overtime Account **using Ethereum Mainnet**, there is a solution how to access those funds, bridge them to the correct network and use them on Overtime. All can be done from within the app!

1. Navigate to your [Account](https://www.overtimemarkets.xyz/profile?selected-tab=account) tab on Overtime:

&#x20;  :arrow\_right:   [**https://www.overtimemarkets.xyz/profile?selected-tab=account**](https://www.overtimemarkets.xyz/profile?selected-tab=account)  :arrow\_left:

***

2. Find your mainnet funds on top of Assets table

<figure><img src="/files/foGQC7NcVsk4viDhr9qA" alt=""><figcaption></figcaption></figure>

***

3. Click on the <mark style="color:$success;">**`Bridge from Mainnet`**</mark> button

***

4. In the input field under `SOURCE CHAIN`, input the amount you want to bridge to Overtime Account.

{% hint style="warning" %}
Bridging transaction Gas fee will be deducted from your Source Chain (Ethereum Mainnet) funds, ensure you leave enough tokens deducted from MAX amount so it can pay for gas.
{% endhint %}

***

5. Click on the blue <mark style="color:$primary;">**`BRIDGE`**</mark> button on the bottom of the widget, confirm the transaction and wait for the transaction to get confirmed.

***

6. After your bridging transaction is confirmed, your funds are now successfully deposited to the correct network and ready to be used on Overtime!


# History of Overtime

The underlying foundation that makes Overtime the world's leading decentralized onchain sportsbook is the elegant and novel core design of Sports Markets AMM.

In this page we dive into the details of the underlying architecture and how Overtime Markets came to be!

### It all starts with the Thales Protocol

The Thales Protocol was born in 2021 as a permissionless, orderbook-based peer-to-peer Positional Markets platform deployed on Ethereum Mainnet and powered by Chainlink price feeds. The goal of Thales was the ability to support tokenized "all-or-nothing" markets around specific Strike Prices of popular crypto assets on specific Maturity Dates.

These markets were (and still are) all dedicated smart contracts that supported minting of UP and DOWN ERC-20 tokens with USD as collateral. Only one of these two types of tokens are able to be redeemed for the entire amount of USD collateral from the market contract on market expiry, depending on if the Chainlink reported price of this market's Asset is UP or DOWN from the Strike Price on the Maturity Date. This mechanism is the core foundation of the Thales Protocol. Anyone could use USD to mint equal amounts of UP and DOWN ERC-20 tokens. The idea was to allow traders to use the integrated 0x orderbooks to Market Make with their UP and DOWN tokens, but Defi users were not used to orderbook market making and the exorbitant L1 Ethereum gas fees made most actions not economically feasible.

![](/files/BRW6rj0w3GxWL9E3hAXH)

### The Thales AMM

To significantly improve the user experience of trading on Thales markets and to solve the on-demand liquidity problem, in late 2021 Thales deployed it's marketplace on Optimism L2 network and with it a novel and elegant liquidity solution, **the Thales AMM contract.** This special AMM contract took over as a main market maker on Thales marketplace, initially seeded by collateral from the Thales treasury, offering on-demand liquidity of UP and DOWN tokens for traders and algorithmically pricing those respective tokens using a modification of the Black Scholes algorithm.&#x20;

{% hint style="info" %}
**Example:**&#x20;

If the AMM contract calculates **a 30% probability** of a certain market finishing UP on Market Maturity, it will offer those specific UP tokens to traders for **$0.30 per token** (+ Skew Impact premium)**.** If the market indeed finishes UP, these specific UP tokens will be redeemable for 1 USD per token from the market contract while the DOWN tokens of the same market will be deemed worthless.

**This represents the core principle of trading with the Thales AMM.**
{% endhint %}

With this mechanism being thoroughly battle tested and proven in production, it has become evident:&#x20;

#### **If there is on-chain data and the probability calculations of events around that data, Thales architecture can provide permissionless automated liquid markets around it!** <a href="#capability-of-thales" id="capability-of-thales"></a>

### The birth of Overtime V1

After integrating with Chainlink to provide sports results and pre-game odds on-chain, the same previously mentioned AMM mechanism could to be used to provide the worlds first liquid permissionless Sports Markets AMM solution: ***The Overtime Markets V1!***

Overtime V1 had all games as individual smart contracts where all individual positions of each game were tokenised. This means if you bought a moneyline position for HOME WIN, you would receive HOME WIN ERC20 tokens in your wallet equal to the amount of potential win of your bet. If your position wins, you exercise your ERC20 tokens for USD in 1:1 ratio from the game smart contract.

Although this architecture was a breakthrough in composability and decentralization of sports markets, it was not scalable. Gas cost for placing bets was too high for retail users, parlay system was impossible to design and horizontal scaling was not feasible due to impossible number of smart contracts needed to be deployed daily.

## Overtime V2

To allow for exponential offering scalability, user experience on-par with centralized Web2 products and feasible development of live betting, Overtime architecture upgraded to V2. The V2 version pivoted to use a merkle-tree based design onchain for market creation, odds updates and scalability. The move away from tokenized markets allowed Overtime to reach its full potential in amazing user experience and offering, while preserving the decentralization, openness and permissionless nature. You can read more details on how Overtime V2 works in [Sports Markets V2 page](/learn-about-overtime/market-creation-and-trading).


# How Overtime Works

At its core, Overtime operates through a **Pool-vs-Peer liquidity layer** supported by a **custom Automated Market Maker (AMM)**. This AMM continuously provides pricing and liquidity across thousands of active sports markets at any given moment, using odds oracles for real-time pricing and per-market open interest caps to manage risk effectively.

The Overtime protocol supports a comprehensive set of market types: <br>

* **Singles**&#x20;
* **Parlays**
* **Same-Game Parlays (SGPs)**
* **Live Markets**
* **Futures**
* **Player Props**<br>

Overtime’s architecture uniquely supports thousands of live sports and esports markets every day, all composable into multi-leg parlays and leveraged payout structures. No other onchain prediction market currently matches this level of product depth or scalability. It enables a complete sportsbook experience that runs entirely onchain. Unlike centralized sportsbooks, every transaction, market creation, and settlement occurs transparently via smart contracts, ensuring full composability within the DeFi ecosystem.

Overtime is currently **deployed across major Layer 2 networks of Optimism, Arbitrum, and Base**, ensuring fast, low-cost, and scalable access for users across the Ethereum ecosystem.

Liquidity within Overtime is sourced from liquidity pools **(LPs)** which hold **USDC, ETH, wBTC or cbBTC**. These assets fund the AMM and underwrite the markets.

In addition to its full-featured **onchain sportsbook dApp** designed for traders, Overtime also provides a **developer API** that allows builders to directly integrate with its AMM and liquidity layer. This enables third-party applications, wallets, AI agents, aggregators or analytics platforms to create custom user experiences or new trading interfaces while leveraging Overtime’s existing market infrastructure and liquidity layer.

<br>


# Overtime AMM and Liquidity Mechanics

The Overtime Automated Market Maker (AMM) serves as the core liquidity and pricing engine for the protocol, enabling fully onchain, continuous sports market creation and trading. Unlike traditional sportsbooks that rely on centralized liquidity desks, Overtime’s AMM dynamically manages exposure, pricing, and fees through a transparent, algorithmic framework.

### Fees and Pricing

The AMM sources implied probabilities for each market directly from global odds providers and brings them onchain through Chainlink oracle nodes. These odds form the pricing foundation for every market offered by Overtime. On top of the oracle-fed odds, the AMM applies a **protocol fee**, currently set at **2%**, which funds the Overtime fee pool. The AMM’s pricing continuously tracks real-time global odds data, ensuring that Overtime remains competitive with leading traditional sportsbooks at all times.\
\
Overtime also features a native **fee-sharing mechanism** that automatically redirects **half of the protocol fees generated by partner-driven trading activity** to the corresponding integrator or gold partner wallet. This onchain kickback system rewards ecosystem participants like MetaMask for driving trading volume and provides a verifiable, continuous revenue stream directly tied to activity within the protocol.\
\
In addition, users who trade using **Overtime’s native token ($OVER)** as collateral instead of USDC, ETH, or other assets benefit from a **reduced margin by design**, resulting in more favorable pricing and higher net payouts. This incentive structure promotes organic token utility, enhances platform stickiness, and aligns all ecosystem participants.

### Liquidity and Risk Management

Each market within Overtime is assigned a predefined **risk limit**, representing the maximum directional exposure the AMM is willing to take against traders for that market. Once this limit is reached on one side of a market, the AMM naturally stops offering additional liquidity for that direction until offsetting demand emerges.

When traders begin taking positions on the opposite side, that inflow of orders **organically rebalances the AMM’s exposure**, gradually reopening liquidity on the previously capped side. This self-correcting mechanism keeps the AMM’s risk profile adaptive to market flow without requiring manual intervention or external adjustment.

When trading demand remains balanced between both sides, the AMM operates in a **delta-neutral** state, effectively facilitating a peer-vs-peer outcome while minimizing directional risk to the liquidity pool. This design ensures continuous capital efficiency and preserves the integrity of the Pool-vs-Peer model across all active markets.<br>


# Market Creation and Trading

Overtime V2 introduced the use of [merkle trees](https://www.investopedia.com/terms/m/merkle-tree.asp#:~:text=A%20Merkle%20tree%20is%20a,as%20%22binary%20hash%20trees.%22) to create game markets and push odds to the chain. \
\
By using Merkle trees, Overtime contracts can execute a quick and secure verification of the data integrity using hashes. The hash root summarizes the entire dataset, allowing for an ideal structure of v2 contracts. Where efficiency is crucial, Overtime is able to provide **a premier decentralized fully-onchain Sportsbook.**

### **How does the Overtime Merkle trees work?**

V2 uses Merkle trees to create markets and push odds to the chain reducing the overall overhead cost and the possibility to push multiple odds at the same time. \
\
Chainlink nodes remain the source of market resolution verification when the game markets reach expiry.

{% hint style="info" %}
Positions on Overtime for **soccer/football matches are only for regular time** (90 minutes + additional time). Playoff or knockout games that are tied at the end of regular time and go to extra time/penalty shoot-out will result in a draw (X).

So if you purchase a HOME position for a soccer/football match that goes to extra time, the winning position for that market is DRAW, even if the HOME team ends up winning the match during extra time.
{% endhint %}

### Market creation

Markets are created from games offered by the [Chainlink end-point](https://market.link/nodes/TheRundown/integrations). The games are organized in `sportIds` which represent league competitions of given sports, not only the sport in general.&#x20;

Market creation starts by fetching games for each `sportId` each day from the end-point. The fetched games are stored on-chain and then the market's contracts are created from every fetched game. Each game is a dedicated positional market smart contract with two or three available positions depending on the possible outcomes of the sport in question.

{% hint style="info" %}
The Protocol DAO retains the right to introduce thresholds upon which the odds will change to allow large sized bets
{% endhint %}

### Trading on Overtime

Each Sports Market is open for trading immediately after it is created by the contract offering on-demand liquidity. This liquidity is open for trading up until the moment the game in question starts.

The v2 contract supports each market by offering liquidity on each market position.

* `HOME` and `AWAY` positions - for two-outcome positional markets (e.g. basketball)
* `HOME`, `AWAY` and `DRAW` positions - for three-outcome positional markets (e.g. soccer)

{% hint style="info" %}
Soccer results are settled after the first 90 minutes of play plus injury time.&#x20;
{% endhint %}

Each position is priced by using the merkle tree root data pushed onchain. Odds are pushed onchain frequently avoiding outdated pricing. The contract then offers a strict price  to the traders.

Each Sports Market has native liquidity caps (or limits). The v2 contracts will offer on-demand liquidity under the following condition only:&#x20;

* The V2 contracts risk is below a currently set threshold in USD. - It can only allow exposure to the market resolution (game result) below the currently set threshold. If the threshold is reached, the contract stops offering liquidity for that sports market.

### Market Offering

Each markets are resolved by Results Data provided by Chainlink Sports Feeds.

#### Sports Markets include:

* **Moneyline** - Position on which team/player will win.
* [**Handicaps**](broken://pages/dmNodblZtZArTUCyxzho) -Position on which team/player will win.
* [**Totals**](broken://pages/dmNodblZtZArTUCyxzho) - Position on the combined score being over or under a set number.
* [**Double Chance**](broken://pages/dmNodblZtZArTUCyxzho) - Position on two possible outcomes (win/draw, draw/win, win/win).
* Half time/full time - Position on the winning team at half time and full time.&#x20;
* Both teams to score - Position on the possibility of both teams to score.
* Draw no bet - Position on moneyline with a pay back if game ends in draw.
* [**Player Props**](broken://pages/Z99SIqKLSk0qN1rFsgVG) - Position on individual player performance stats.
* [**Parlay**](/learn-about-overtime/onchain-parlays) - Position by combining multiple bets for a higher payout.

{% hint style="info" %}
For Tennis markets, walkovers will be treated as canceled matches, while retirements during matches or disqualifications will be treated as a win for player going to the next round.\
\
F**or soccer (football) games resolve after regular time.**  If tied at the end of regular time, DRAW is the winning position, even if a team goes on to win in extra time.
{% endhint %}


# Overtime Accounts

Full Account Abstraction UX on Overtime

<details>

<summary>Overtime Accounts Introduction</summary>

To deliver a seamless user experience, Overtime is introducing **Overtime Accounts**—an onchain smart account designed to abstract wallet and EVM network complexities while remaining non-custodial and permissionless. This development was made possible with the amazing infrastructure of [Biconomy](https://www.biconomy.io/) for Smart Accounts and [Particle Network](https://particle.network/) for Wallet-As-A-Service Social Login.

All users will be able to switch, per preference, between using the new Overtime Account UX or the classic EOA wallet connection as before. Switching between these modes is made super intuitive for everyone, so the users that are used to betting with their wallets directly can continue doing so.

**Overtime users are no longer required to connect to Overtime via their installed wallets but can now create and use accounts from within the dapp itself!** This integration enables effortless onboarding and trading experience, allowing users to use any familiar Social Login method **(Google, Twitter, Discord, Github, Apple, etc.)** and a streamlined Deposit or Credit Card process.

</details>

<details>

<summary>Technical Details</summary>

To truly bridge the gap between the onchain world and mainstream adoption, **Overtime leverages Biconomy’s Smart Account SDK**—integrating its Paymaster, Bundler, and Session Keys infra to deliver a seamless, retail-friendly user experience.&#x20;

With Paymaster infra, users never have to worry about holding ETH to cover gas costs. In some cases, gas fees will be fully sponsored by Overtime for certain users, amplifying the UX even more. The Bundler further enhances convenience by batching multiple actions into a single transaction, eliminating unnecessary confirmations and pop-ups that can delay transaction execution for end users. Meanwhile, Session Keys enable pre-authorized actions, allowing users to place bets, execute transactions, and interact with Overtime’s smart contracts by just clicking once a respective frontend button, without signing any additional approvals.

With integrating Onramper and their fiat onramping aggregation technology, any Overtime user can seamlessly fund their Overtime Accounts directly from fiat! Onramper chooses the best fiat onramping provider for you, wherever you are in the world, solving another Overtime onboarding hurdle. This further helps Overtime grow as a globally accessible industry-changing powerhouse. Features coming soon to Overtime Account funding also include depositing funds directly from your CEX account directly within Overtime dapp.

This fusion of all mentioned features ensures that Overtime users can finally focus on the game, and not the blockchain—the ultimate frictionless onchain sportsbook experience. The onchain UX is finally as intuitive as Web2—but with all the power and trustlessness of Ethereum!

</details>

***

## **Video Tutorials: How to start using your Overtime Account**

These guides will help you navigate through the Overtime Account UX

### Step #1: How to **SIGN IN** to your Overtime Account

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqSlj8vWOOVBuhXhcN6iy%2Fuploads%2FAwnS14892U8lSmpaDLe5%2FSmart%20Overtime%20Account%20Creation.mp4?alt=media&token=056366ab-0f1e-4e5e-ad6c-eef01f8956d0>" %}

### Step #2: Deposit funds in your Overtime Account to activate it for the first time

To start using Overtime, you have to deposit funds in the Overtime Account.

On the `DEPOSIT TO YOUR OVERTIME ACCOUNT`card, you are shown your Overtime Account deposit address.  **Supported tokens that can be deposited are shown on top of the card.**&#x20;

<figure><img src="/files/07F6usxZFnEkjmX7bJDa" alt=""><figcaption></figcaption></figure>

To get started, send either of these tokens to the quoted **`Your deposit address`**

{% hint style="danger" %}
MAKE SURE YOU ONLY SEND SUPPORTED TOKENS TO YOUR DEPOSIT ADDRESS OF YOUR OVERTIME ACCOUNT\
\
MAKE SURE THEY ARE OPTIMISM, ARBITRUM or BASE NETWORK VERSIONS OF SAID TOKENS WHEN DEPOSITING OR YOUR FUNDS MIGHT BE LOST
{% endhint %}

{% hint style="warning" %}
By default, when visiting Overtime for the first time you are connected to **Optimism network.** You can change to Arbitrum or Base within the modal if preffered.\
\
**When sending funds to your Overtime Account, make sure you are sending supported tokens to the selected network destination!**
{% endhint %}

If you used a WALLET CONNECTION instead of a Social Login, you can deposit funds directly from your connected wallet. Here is a video showcasing how:

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqSlj8vWOOVBuhXhcN6iy%2Fuploads%2F82glmeOhZZbgBmKzxlXp%2FDeposit%20from%20account.mp4?alt=media&token=c8489e86-1b2c-469c-b729-c66525e4639c>" %}
DEPOSIT FROM CONNECTED WALLET
{% endembed %}

Another way is to just use ![](/files/hc9OB9u1LbuoGCEQLQdr) button, and deposit directly from your Credit Card.

### Step #3: Activate your Overtime Account

When your deposit lands, you should see a yellow pop-up screen prompting you to Activate your Overtime Account.<br>

<figure><img src="/files/USyvewLr0d9NLKFXhur7" alt=""><figcaption></figcaption></figure>

Click on `ACTIVATE MY ACCOUNT`button and you are ready to use Overtime!


# Onchain Live Markets

Live markets allow user to buy moneyline positions while the game is underway. \
\
OpticOdds data provider allows us to push real time odd data onchain, hence allowing user to watch and buy at the same time. \
\
Buying a LIVE market position is similar to buying a position before the start of the game, the main difference is the price of the odds is subject to change before buying. For this reason we recommend user to make sure the position they buy is right before signing the transaction as a delay can bring a stale price where the transaction would then fail.&#x20;

{% embed url="<https://drive.google.com/file/d/1mJhO2eLEGkf94q9TwJxPlMisVS-vqw_o/view?usp=sharing>" %}

### Technical specification

Live AMM is a part of Sports Markets V2 architecture. It inherits caps management logic from V2 RiskManagement system, but offers a different and unique trading experience.\
The user will signal the intent to make a live trade on [`LiveTradingProcessor`](https://github.com/thales-markets/contracts-v2/blob/main/contracts/core/LiveTrading/LiveTradingProcessor.sol) contract, which then sends a request to Chainlink node relaying the said intent.&#x20;

Within that transaction the user sends the following data:

* The details of the bet (match, position, line)
* Buy-in amount
* expected odds
* accepted slippage (e.g. a user may indicate he would accept up to 2% slippage on the extpected odds)
* collateral the user wants to use (has to be erc20 token that has an approval for SportsAMMV2)

The node will use the APIs and other data available to it, perhaps even aggregation of the odds, to ensure the live trade can go through and send a reply to the `LiveTradingProcessor`.

If the reply is positive, in the same reply transaction the user trade by `LiveTradingProcessor` interacting with `SportsAMMV2`.&#x20;

If the reply is negative, the live trade is cancelled. If there is no reply within a minute (a configurable variable), the live trade request is considered as failed.

The `LiveTradingProcessor` contract will not need to store any odds, as the odds will be returned by the Chainlink node.

Once a live trade is executed, is stored within the system as any pre match trade, and resolved using the same mechanics as other tickets in V2.


# Onchain Market Settlement

### Market Settlement Process

Market settlement on Overtime is mostly done automatically. Match results are constantly reviewed to ensure quick grading and settlement of recently concluded matches. The settlement process should take 15 minutes to complete. However, newly added and niche markets may experience longer settlement times due to the manual review required to ensure proper grading and a smooth experience.

### **Claim Process**

Claiming on Overtime is simple. Once a match has been settled, the ticket page found in your profile will be populated with a claim button. Click on the button and sign the transaction for the bet to be settled and your winnings to be claimed. Losing bets will simply disappear from the ticket section and can be reviewed in the history section.

A "claim all" button can be used when settling multiple bets at the same time.

{% embed url="<https://drive.google.com/file/d/1R6uGdvID7yC9DDzk9NHFqmvo-dYr6et6/view?usp=sharing>" %}

{% hint style="info" %}
Winnings not claimed within 90 days of a market being resolved are forfeit.
{% endhint %}


# About Odds Providers

Overtime is not only bringing the game to the blockchain; it’s doing it with some of the best odds available across all sportsbooks. These odds come from Pinnacle Sportsbook and JsonOdds.

### Pinnacle Sportsbook

[Pinnacle Sports](https://www.pinnacle.com/en/) has been around since 1998 and is considered to be one of the most trustworthy sportsbooks on the internet. The level of security they employ is top notch, with the same strong encryption and security standards used by top financial institutions. It is also one of the few sportsbooks to offer odds on eSports.&#x20;

&#x20;                                          ![](/files/AUHaWhcu8nfZgtrWq1iu)

Pinnacle calculates their odds by combining old school methods like “power rankings” with cutting edge data analysis. Pinnacle uses individual player statistics, team schedules and past performance along with the interpretation of trends and other factors when creating these power rankings while also relying on decades of data to arrive at their odds.&#x20;

Pinnacle supplies these odds to [The Rundown's API](https://therundown.io/api) which makes them available to Chainlink and the blockchain.\
\
JsonOdds

[JsonOdds](https://jsonodds.com/) is a simple and modern API for delivering odds for sporting events.  [TIP-150](https://github.com/thales-markets/thales-improvement-proposals/blob/main/TIPs/TIP-150.md) made it possible to add data from JsonOdds for professional golf tournaments.

<figure><img src="/files/h96oFLpPJOmveCrU9NiU" alt=""><figcaption></figcaption></figure>

### OpticOdds

[OpticOdds](https://opticodds.com/) offers real-time odds for sportsbooks on a push format. With data standardization and speed across our broad depth of markets offers sharp and reliable odds. Including DraftKings & Caesars, OpticOdds offer real-time data for all major leagues, including the NFL, NCAAF, NBA, NCAAB, UFC, WNBA, MLB, EPL, La Liga, League of Legends, CSGO, PGA, NHL and more.\
\
[TIP-207](https://github.com/thales-markets/thales-improvement-proposals/blob/main/TIPs/TIP-207.md) introduce OpticOdds to Overtime Markets

## Odds are used to Price Positions

Overtime receives these odds on-chain via Chainlink data feeds and uses them to price their positional tokens for each market. Pricing for a single dollar of potential profit is equivalent to the implied win probability of the position, but as a decimal instead of a percentage. If a Home win has a price of 0.71 per 1 dollar of potential profit, you can infer the implied win probability of that position, based off of the data supplied by Pinnacle, is 71%.

<figure><img src="/files/0pPMZ6Azmgs6leKjwZ26" alt=""><figcaption></figcaption></figure>

## Viewing Different Odds Formats

If you're more familiar with other ways to quantify odds, you can change the format of odds displayed on the home page for markets.  Traders can select **Normalized Implied Odds**, **Decimal Odds,** or **American Odds**

<figure><img src="/files/AmiTQuKzk2VVbS7gEtMf" alt=""><figcaption></figcaption></figure>

* **Normalized Implied Odds**- This format represents the chance of success as a decimal of 1.  This is the same format used to price a single positional token as described above and each position will always add up to 1 (unless there is no liquidity available for that position, in which the odds will display as 0).
* **Decimal Odds**- Choosing Decimal Odds displays the amount a position of 1 dollar would pay out if successful.
* **American Odds**- Finally, American Odds (also known as Moneyline odds) displays a slightly different metric depending on which team is the favorite.  For the team that is favored to win, American odds shows the cost of positional tokens you'd need to spend to potentially win 100 dollars.  The favorite will have a minus sign ("-") in front of their odds.  For the underdog, American odds displays the amount you could collect for buying 100 dollars worth of positional tokens (with a "+" in front of the underdogs odds).  For example, in the market below Nashville is the favorite, so if you wanted to claim 100 USD of profit on a Nashville HOME win you'd need to spend 149 USD.  But if you purchased 100 USD of St. Louis AWAY win positional tokens and you are successful, you could claim 392 USD, 292 of which would be profit. (Keep in mind that skew and discounts will impact actual profit).

<figure><img src="/files/ReOVLuuYkSuCCLHJFOTs" alt=""><figcaption></figcaption></figure>

See the chart below for a conversion from Implied Odds (in percent) to Moneyline Odds.

![](/files/57JGmXuhSgF8g6J59Iyu)


# Providing Liquidity to Overtime

Be the house!

<figure><img src="https://miro.medium.com/v2/resize:fit:875/0*CbTU33amjhbDIF95" alt="" height="198" width="700"><figcaption></figcaption></figure>

Anyone can p**rovide liquidity for the Overtime's Sports AMM** and gain exposure to it's performance.

User funds deposited in the Sports AMM will be used as collateral for all bets bought on the Overtime dapp.  Liquidity Provisioning is available on **Optimism, Arbitrum, and Base**.

### Deposit and Withdrawal mechanics

The deposited funds will be used to collateralize the Sports AMM on a weekly round basis. A single game can only belong to one round, which is **defined based on the maturity date of the market (game end)**. When a round ends, the AMM's performance from all markets in that round is summed up, and allocated to all liquidity providers proportional to their share of the pool.

* Each LP-ing round lasts **7 days**.
* User can Deposit at any time during any round. **The deposited funds will be utilized as collateral in Sports AMM starting with the next round from time of Depositing.**
* Your deposited funds roll over to next round automatically until a Withdrawal is signaled.
* User can signal a Withdrawal at any time during any round. **Withdrawals are limited to no less than 10% of your total deposit.**
* The funds that are signaled for Withdrawal will be unlocked **at the start of the next round from time of signaling.**&#x20;

{% embed url="<https://drive.google.com/file/d/1FQX4ew192V3tIST0r4E3OxhXmoZhNZbs/view?usp=sharing>" %}

{% hint style="danger" %}
If you signal a Withdrawal, **your funds will still be exposed as collateral for the duration of the ongoing round** and will only be removed as collateral when the round ends.
{% endhint %}

{% hint style="warning" %}
**Providing liquidity exposes you to various risks** including potential losses due to users winning in trading as well as smart contract security risks. Please make sure you understand these risks before depositing.
{% endhint %}

## Guide for Providing Liquidity to Overtime's Sports AMM

Navigate to the [Liquidity Pool page on the Overtime dapp](https://www.overtimemarkets.xyz/liquidity-pool):&#x20;

<figure><img src="/files/gVEjlgVqFPmq5hOHkx01" alt=""><figcaption></figcaption></figure>

Depending on the netwrok, you can provide USDC, WETH, and cbBTC liquidity in respective pools. Each pool collateralize trades from users executed with that specific buy-in token. Non LP tokens are swap to USDC before the bet is placed.

{% hint style="warning" %}
OVER token LP pool is not open for external providers.
{% endhint %}

### Depositing USDC or WETH to provide liquidity for the Sports AMM

#### Step 1: Connect your wallet and navigate to the LP page

Connect your wallet to the Overtime dapp on the top right corner of the page.  Once connected navigate to the Provide Liquidity Page. Make sure the toggle is set to either "USDC" or "WETH" depending on your preference.

<figure><img src="/files/nTXli5NNis3NiQDpPiuS" alt=""><figcaption></figcaption></figure>

You can also reach each individually using these links

* [USDC LP page](https://www.overtimemarkets.xyz/liquidity-pool?collateral=usdc)
* [WETH LP page](https://www.overtimemarkets.xyz/liquidity-pool?collateral=weth)

#### Step 2: Enter the amount of USDC or WETH you wish to DEPOSIT

#### Step 3:  Approve expenditure by clicking APPROVE

#### Step 4: Click on Deposit toggle and confirm the transaction

You can view your current deposits from [your Profile under the **LP** tab](https://www.overtimemarkets.xyz/profile?selected-tab=lp)

### Withdrawing USD from the Sports AMM or Parlay AMM

To withdraw, you must have USDC or WETH deposited in the current round.

<figure><img src="/files/qpfd1qiFlAd7UDzIRKCw" alt=""><figcaption><p>I just deposited so I can't withdraw until my deposit is included in the current round, which starts in about 6 days and 10 hours</p></figcaption></figure>

#### Step 1: Connect your wallet

Connect your wallet to the Overtime dapp on the top right corner of the page.

#### Step 2: Click on the REQUEST WITHDRAWAL button

&#x20;                                          <img src="/files/VBUSa8jydst6BuJPcxDm" alt="" data-size="original">

**Step 3: Wait for current round to end to receive your funds directly to your wallet**

Once you've successfully requested a withdraw, you'll see the estimated amount you'll receive at the end of the current round in yellow.  The actual amount you'll receive will be calculated once the  current round closes and is based on the PnL of the round.

&#x20;                                                    <img src="/files/jxOSctlJRBiyJogNyYMw" alt="" data-size="original">

You cannot deposit when you have a pending withdrawal until the round has ended and you've received your deposit.  Once the current rounds ends your collateral will be automatically sent to you.


# Free Bets

This quick video shows you how to use a Free Bet on Overtime Markets, a decentralized onchain sportsbook.

A Free Bet lets you place a bet without using your own funds. If your bet **loses**, you lose nothing. If it **wins,** you **keep the profit**, but the original stake is **deducted** from your **Free Bet balance.**

**Example**:\
You use a $50 Free Bet on a market with x3.0 odds.\
✅ If you win, you receive **$100 in profit, and your $50 Free Bet is used up.**

{% hint style="warning" %}
Sometimes Free Bets must be **claimed first**, especially if you're accessing one via a referral or promo link. If that's the case, just hit the **Claim Free Bet** button after connecting your wallet.
{% endhint %}

{% hint style="danger" %}
**Users Free Bet balance has an expiration date of 4 weeks.**&#x20;

User MUST use his Free Bet balance within 4 weeks of receiving the Free Bet.
{% endhint %}

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqSlj8vWOOVBuhXhcN6iy%2Fuploads%2FO9izgH25aVE9SnKcZhyr%2Fclaimandfreebet.mp4?alt=media&token=cbc23be1-110b-4f40-bdaf-02483da82011>" %}
Claim and bet walkthrough
{% endembed %}

#### Step-by-Step: How to Use a Free Bet on Overtime Markets

1. **Connect Your Wallet**\
   Go to [overtimemarkets.xyz](https://www.overtimemarkets.xyz/markets) and Sign In.
2. **(If Needed) Claim Your Freebet**\
   If you received a Free Bet via a link or promotion, you might need to **claim it manually**. Look for a **"Claim Free Bet"** button after connecting.
3. **Check Your Free Bet Balance**\
   Once connected (and claimed, if needed), check your **Free Bet balance** in your Profile page.
4. **Pick a Match**\
   Browse the list of games and choose one you'd like to bet on.
5. **Choose a Market and Selection**\
   Click an outcome to add it to your bet slip (e.g. team to win, total points over/under).
6. **Enable the Free Bet Option**\
   In the bet slip, toggle **“Use Free bet”** so the Freebet is applied instead of real funds.
7. **Place the Bet**\
   Click **“BUY”**
8. **Wait for the Result**
   * ❌ If your bet **loses**, you lose just the freebet balance
   * ✅ If your bet **wins**, you receive the **net profit**, and your **freebet amount is returned** to your balance to use again.

{% hint style="info" %}
Conditional free bets are available solely to new Overtime users. \
(eg. Drive $25 in volume for a $25 free bet)
{% endhint %}


# Overtime Governance

Overtime has a Delegated Governance structure that reflects $OVER token community's desire to trade sports markets without relying on a centralized entity. The token holders are the ones that hold governing power by electing Overtime Council members every 6-month epoch. &#x20;

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td>Read Overtime TIPs</td><td></td><td></td><td><a href="https://github.com/thales-markets/thales-improvement-proposals">https://github.com/thales-markets/thales-improvement-proposals</a></td><td><a href="/files/r5aZcsu0g3ojYhV7mHR4">/files/r5aZcsu0g3ojYhV7mHR4</a></td></tr><tr><td>Vote for Overtime Council Positions</td><td></td><td></td><td><a href="https://thalesmarket.io/governance">https://thalesmarket.io/governance</a></td><td><a href="/files/1B1immXFD6KCDUdQlSDo">/files/1B1immXFD6KCDUdQlSDo</a></td></tr></tbody></table>

#### Overtime Council

The Overtime Council consists of 5 community members that have been voted in by $OVER holders and serve a 6 month epoch. This process is **fully onchain and transparent**, gives everyone the same access to council positions, and encourages rotation among candidates.  The community then creates, vets and submits **Overtime Improvement Proposals (OIPs)** which the Overtime Council review and vote on. &#x20;

<figure><img src="/files/KWZTOWKIVVDb9i2OBEA3" alt=""><figcaption></figcaption></figure>

#### OIPs

The Overtime DAO deploys any new or updated smart contracts required by a successful OIP.  They are submitted by community members and reviewed/approved by the Overtime Council.


# Overdrop League Season 2

## The Overdrop League: Season 2

The Overdrop League is an on-chain rewards system designed to give back to the Overtime community. Season 2 elevates the experience from a points system to a dynamic rewards ecosystem where every bet contributes to monthly ETH prizes, Free Bets, and passive affiliate earnings.

The system is centered around earning Experience Points (XP), which reset monthly to ensure a fair and competitive environment for all users.

### **Earning XP: The Core Mechanic**

Your journey in the Overdrop League starts with Base XP, which is calculated on every bet you place. The formula is designed to reward both volume and strategic risk.

* Base XP Formula: `Base XP = Buy-In Amount * (2 - Normalized Odds)`

This means you accrue more Base XP for placing bets with a higher buy-in amount and higher odds.

#### **The Rewards: What You Earn**

* Monthly ETH Prize Pool: All XP you earn in a month gives you a pro-rata share of a monthly `4 ETH` prize pool. At the end of the month, rewards are distributed on-chain based on your contribution to the total XP generated.
* Free Bet Rewards: As you accumulate XP and hit new level milestones each month, you will unlock Free Bet rewards in `$OVER`. Users can receive up to `4750 $OVER` free bets per month.

<figure><img src="/files/ox2Eb68Wf5RLncTLboYF" alt="" width="563"><figcaption></figcaption></figure>

* Affiliate Program: Onboard new users with your unique referral link to earn passively. You receive 20% of the XP they generate and up to 50% of the protocol fees they pay.

#### **XP Boosts: Amplify Your Earnings**

Several powerful multipliers and boosts can be stacked to maximize your XP accrual.

* Parlay Boost: Combine multiple bets into a single parlay to receive a significant XP boost. The bonus starts at +50% for a 2-leg parlay and scales aggressively up to +700% for a 15-leg parlay.

<figure><img src="/files/GwkMY4gn3IJjOOYhoGCH" alt="" width="375"><figcaption></figcaption></figure>

* Daily Streak Boost: Maintain consistent platform activity. Placing a bet on consecutive days unlocks a stacking bonus on your baseline XP, capping at +35% for a 7-day streak. Daily boost rolls into new Overdrop months.&#x20;

<figure><img src="/files/p0pM7AZ6bFQloZkDRgdK" alt="" width="360"><figcaption></figcaption></figure>

* Weekly Streak Boost: Reward for long-term consistency. Betting at least once per week unlocks a weekly boost that grows to +20% after four consecutive weeks. Weekly boosts rolls into new Overdrop months.&#x20;

<figure><img src="/files/ADldvzzMpVEEH7tGCFs2" alt="" width="360"><figcaption></figcaption></figure>

* $OVER Collateral Boost: Gain a strategic edge by using the platform's native token. All bets placed using `$OVER` as collateral automatically receive a +10% XP boost.
* Loyalty Boost: Your past performance is rewarded. Earn up to a +30% Loyalty Boost on all XP accrual based on the XP levels you achieved in the previous three months, where the sum of your final rank is added up to your loyalty boost.

{% hint style="info" %}
Streaks & Boosts resets at 00:00 UTC
{% endhint %}

#### **Daily Engagement Rewards**

* Daily Quests: Complete simple daily task. Such as placing a bet, making a Speed Markets trade, or posting on X.com. Earn +10% XP boost and a +200 fixed XP bonus.
* Spin The Wheel: Get a free spin each day for a chance to win a random XP boost of +20%, +30%, or +50%. Completing your Daily Quest upgrades the wheel's rewards to include bonus XP from +100XP to +500XP.

You can track all your rewards and progress in real time on the [Ovedrop dashboard.](https://www.overtimemarkets.xyz/overdrop?selected-tab=overdrop-home) The Overdrop League is scheduled to conclude in June 2026.&#x20;

{% hint style="info" %}
All rewards are airdropped. Overtime DAO withhold the right to disqualify toxic flow wallets.
{% endhint %}


# Sports Trading Guidelines

**Overtime** is a decentralized, trustless, permissionless, **blockchain** based **sportsbook**. Overtime’s novel [**Sports Automated Market Maker**](https://docs.overtimemarkets.xyz/decentralized-sports-markets/sports-amm) is built on **Overtime smart contracts**, and it uses reliable data feeds from the industry best data provider [**Chainlink**](https://chain.link/data-feeds)**.**

The [smart contract](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract) architecture ensures a safe, transparent and reliable way of trading with the Sports AMM. Every trade is **fully collateralized**, and the funds will always be in respective smart contracts, waiting for you to claim if your trades were correct.  The smart contracts themselves are the first and foremost source or truth. **Code truly is law with Overtime.**

Changes to the contract codebase of Overtime can only be done as a result of a [OIP (Overtime Improvement Proposal) ](https://www.overtime.io/dao)being voted in by the [Overtime Council](https://www.overtime.io/dao/thalescouncil.eth/), the elected governing body of the [Overtime DAO](https://www.overtime.io/dao), consisting of reputable Overtime community members. Overtime DAO also governs all the markets and transactions of the protocol.

<figure><img src="/files/3IswtjmxHV5mDunu3Igh" alt=""><figcaption></figcaption></figure>

\
Listed below are the **Overtime trading rules and guidelines** to offer a standardized and familiar way of interacting with the Overtime platform:&#x20;

<br>

### Table of Contents

* [General Rules](#general-rules)
* [Sports Rules](#sports-rules)
* [American Football ](#american-football)🏈
* [Soccer ](#soccer)⚽️
* [Basketball ](#basketball)🏀
* [Baseball](#baseball) ⚾️
* [Ice Hockey](#ice-hockey) 🏒
* [Tennis](#tennis) 🎾
* [Esports](#esports) 🎮
* [Fighting Sports](#fighting-sports) 🥊
* [Table Tennis](#table-tennis) 🏓
* [Aussie Rules](#aussie-rules)
* [Volleyball](#volleyball) 🏐
* [Handball](#handball) 🤾‍♂️
* [Water Polo](#water-polo) 🤽‍♂️
* [Cricket](#cricket)🏏
* [Formula 1 ](#formula-1)🏎️
* [Golf](#golf) ⛳️
* [Darts](#darts) 🎯
* [Politics](#politics) 🗳️
* [Futures & Outrights ](#futures-and-outrights)📈

<br>

## General Rules

#### Overtime Markets – Universal **General Rules**

1. **Oracle & Governance Pipeline**\
   Data comes from Chainlink nodes and pre-approved providers; any change to feeds or contract logic must pass a OIP vote of the Overtime DAO Council.
2. **Data** received from **Chainlink nodes and designated providers (OpticOdds etc.)** serves as the **final authority for all settlements**. In the event of a discrepancy between third-party media and our official data pipeline, the **node-delivered result prevails**.
3. **Market Types & Outcomes**\
   Overtime supports 2-way and 3-way markets (excluding Futures markets like Golf, F1 or similar). For 2-way sports, overtime/extra-time scores are included by default; for 3-way sports, only regulation counts unless noted.
4. **Draws & Pushes (2-Way)**\
   If a “Draw” price is listed and the match ends in a draw, both team selections lose. Where no draw option exists and the match ends in a draw, bets are void.
5. **Walkovers / No-Contests**\
   Any pre-game forfeit, walkover, or "no contest” voids all bets on the fixture (some exceptions may apply)
6. **Retirement**\
   Any retirement after the start of the match is deemed an ML loss for the retiring side. Non ML bets will be voided unless already mathematically resolved.
7. **Abandonment Threshold**\
   If a fixture is not completed within **24 hours** of its scheduled start, all full-game markets are void (periods already finished stand). Exceptions: events naturally exceeding 30 h (e.g., multi-day golf).
8. **Start-Time Windows**\
   A fixture that fails to begin within **24 hours** of the advertised start time is voided in full.
9. **Long-Duration Events**\
   Tournaments that normally run past 30 hours (major golf, multi-round motorsport, etc.) retain action provided they finish under the organiser’s published schedule.
10. **First-Score Markets**\
    “First Team/Player to Score” have action as soon as the score occurs—match completion not required.
11. **Venue / Opponent Changes**\
    Unless a sport-specific rule overrides, swap of the listed opponent voids all bets.
12. **Period-Only Bets**\
    Bets designated for a specific quarter/period count **only** that segment; completed periods stand even if the match is later abandoned.
13. **Participant-Must-Start Rules**\
    If a market contains named competitors (e.g., Head-to-Head, Player Props), all listed competitors must start or bets since the last completed stage are void.
14. **Minor Data Entry Errors**\
    Typos, misspellings, or team name variations do **not** void action when the intended fixture is clear.
15. **Non-Standard Match Formats**\
    If a fixture is mistakenly offered with the wrong number or length of periods, every market on that fixture is void.
16. **Parlay Specials/ SGPs**\
    Parlay Specials or SGPs require **all** listed games to finish; otherwise the entire special is void.
17. **72-Hour Finality**\
    Settlements are final after 72 hours. Corrections are allowed only for human or system error discovered within that window.
18. **Integrity & Material-Error Handling**\
    Overtime may suspend markets, reject, or later void trades if fraudulent activity or an obvious pricing/limit error is detected, including post-acceptance in-play bets that gained a material advantage.
19. **Live Scoreboard Disclaimer**\
    In-game scoreboards are informational only; incorrect live data shown there does not constitute grounds to void a bet. The result after grading is the one that counts.
20. **Bet Acceptance & In-Play Delays**\
    All wagers are accepted at Overtime’s discretion; in-play orders may queue briefly or pend during high-risk moments. Obvious odds errors may be cancelled.
21. **Official Result Source**\
    Unless a sport rule states otherwise, the governing body’s determination at fixture completion is final; protested or later-overturned scores are not recognised.
22. **Rule Precedence Chain**\
    **Market-specific rules** override **Sport rules**, which override these **General rules** if a conflict exists.
23. **DAO Dispute Resolution**\
    Users may escalate irregularities to the Overtime DAO  in the [Overtime discord](https://discord.gg/overtime-io)

> These General Rules apply across every sport section that follows in the GitBook documentation and are crafted to dovetail with the existing Overtime Sports-Trading Guidelines.

## Sports Rules

### American Football 🏈

**Timing & Suspension**

1. **Overtime** counts for all Game and 2nd‑Half markets; it does **not** count for 1st‑Half or Quarter markets unless explicitly stated.

**Market‑Specific Rules**

4. **Team to Score Next:** Only Touchdowns, Field Goals and Safeties qualify. PATs and 2‑Point Tries are treated as part of the prior Touchdown.
5. **Passing Yards / Passing TDs:** Listed QB must attempt **≥ 1 pass** for action; otherwise bets void.
6. **Rushing Yards:** If the named player records no rushing attempt, yardage is **0**.
7. **Receiving Yards / TDs:** If the named receiver plays but makes no catch, yardage/TDs settle at **0**.
8. **Anytime Touchdown Scorer:** Player must possess the ball in the end‑zone. Passing for a TD does **not** count for the QB.
9. **Longest Touchdown:** Market void if no Touchdown is scored.
10. **Special‑Teams & Defensive TD:** Only plays that involve a kick/punt or a post‑snap change of possession (e.g., KO return, INT return, blocked‑kick return) qualify. Fake FG/Punt TDs grade as Offensive TDs.
11. **Unanswered Scores:** Ignore PATs/2‑Point tries and any defensive return on those plays.

**Season & Futures**

12. **Regular‑Season Win Totals:** Settle once a team’s result is mathematically locked over a 17‑game (NFL) or 12‑game (NCAAF) slate. League‑declared forfeits count as played games.
13. **Conference / Division / Championship Futures:** Graded on the team that reaches the official title game (e.g., Super Bowl, CFP Championship).

### Soccer ⚽️

**Core Timing Rules**

1. **Regulation‑time settlement.** All match markets are graded on the score after the scheduled 90 minutes **plus** any referee‑added stoppage time. Extra‑time, golden‑goal periods and penalty shoot‑outs never count *unless* a market title explicitly states “Incl. ET”.
2. **Early finish.** If a match is abandoned before ⅔ are played and is not resumed within 24 **hours**, all unsettled markets are void; periods played to completion (e.g., 1st‑Half) stand. If the referee ends play ⅔ of the time , every market stands and is settled on the score at stoppage.

**Venue & Home/Away Status**

3. Bets stand at neutral venues regardless of listing order. If the governing body designates a team as “home”, that team is treated as home for all Home/Away splits even if the game is staged at the opponent’s ground.

**In‑Play Integrity**

4. **VAR adjustments.** In‑play bets struck between the on‑field incident and the VAR overturn are void *if* the reversal materially alters odds.
5. **Displayed data errors.** If the score, corner count or red‑card state shown in the market header/Bet‑Slip is wrong, any bets placed while the error persists are void. Third‑party live scoreboards outside the bet UI are informational only.

**Event‑Timing Scope**

6. Unless a market specifies a minute range, referee‑added injury time is included in that market’s period.

**Specific Market Rules**

7. **To Advance / To Lift Cup:** Settled on the team that progresses, regardless of venue changes, postponements or method of victory (ET/penalties).
8. **Season Points & League Winner/Relegation:** Settled on official league table. Season point totals lock once mathematically decided and are not reopened if the league later shortens its schedule.
9. **Home vs Away Totals:** If played at a non‑standard venue, the team listed first is treated as home unless the governing body states otherwise.
10. **In‑Play Asian Handicaps (2‑Way):** Handicap applies only to goals scored *after* bet placement; score at placement is treated as 0‑0.
11. **Team Card markets:**
    * **Scoring:** Yellow = **1**; Red = **2**. Two yellows → red counts as **1 yellow + 1 red** (max **3** per player).
    * **Who counts:** Only cards to **players on the field**. Cards to coaches, subs, or substituted players **don’t** count.
    * **Timing:** Cards **after full‑time** don’t count. Half‑time cards count to **2nd Half**. Extra‑time excluded unless market says **Incl. ET**.
    * **Player Cards markets:** Named player must **start** or bets void.
12. **Corners:** Retaken corner counts once. Awarded but untaken corners do **not** count.
13. **Penalty Shoot‑out Markets:** Handicap markets include goals from *all* kicks; Totals markets count goals from the first 10 kicks only.
14. **Next Goal / Race to X Goals:** Graded immediately once outcome occurs, regardless of subsequent abandonment.
15. **Player Must Start:** All pre‑match player props void if the named player does not start. Substitute appearances do **not** trigger action(**exceptions** may apply, for example **player card markets**)
16. **Anytime Goalscorer:** Only goals in regulation/stoppage count; own goals excluded. Extra‑time & penalty shoot‑out goals excluded.
17. **Asian Handicap & Total Quarters:** Quarter‑handicaps (e.g., −1.25) split stake 50/50 across the two neighbouring half‑lines.
18. **Tournament Player Props:** Stats from extra‑time count; penalty shoot‑out events do not.
19. **Top Goalscorer:** ***Dead-heat*** rules apply if two or more players finish with the **same number of goals**; the stake is **divided equally** among the tied players, and the **reduced stake** is settled at full odds.

### Basketball 🏀

**Timing & Suspension**

1. **Game‑period action thresholds** – NBA & WNBA: **43:00** of play; all other recognised competitions: **35:00**. If that threshold is not met and the game is not finished inside 12 hours, full‑game wagers void; markets on completed periods (quarters/halves) stand.
2. **Overtime** – Counts for all Game and 2nd‑Half markets, as well as player props, unless a market title states “regulation only”. OT never counts for 1st‑Half or individual Quarter markets unless explicitly indicated.

**3‑on‑3 Basketball** (FIBA 3×3 & BIG3)

3. Game is official when **10 minutes** plus any OT are completed **or** a team reaches **21 points**, whichever comes first. If neither condition is met, all wagers are void.

**Market‑Specific Rules**

4. **Conference Winner (NBA)** – Winner is the franchise that *reaches* the NBA Finals, independent of subsequent Finals outcome.
5. **Division Winner (NBA)** – Action as long as every club in the division has played **> 50 %** of its scheduled games. Ties resolved per official NBA tie‑breakers.
6. **Player‑stat markets (pre‑game & live) with one or two named players** – *All* listed players must enter the game for action, unless the market wording states otherwise.
7. **Double/Triple‑Double** – Double‑double = ≥ 10 in any two of *PTS/REB/AST/STL/BLK*; Triple‑double = ≥ 10 in any three of those stats.
8. **NBA player‑stat settlement timing** – All markets are settled immediately post‑game using official NBA boxscore.Once settled, results are final and will not be updated for subsequent NBA revisions.

### Baseball ⚾️

&#x20;**Game Completion & Action Thresholds**

1. **Pre‑game Moneyline action:** Official once **5 full innings** are completed († 4½ if the listed Home team is ahead).
2. **All other full‑game markets** (run‑line, totals, team totals, H+R+E, player props, etc.) require **9 full innings** († 8½ if Home team leads) unless explicitly titled “7‑inning game”.
3. If the contest is called early, score reverts to the **last completed inning**—except if the game is called in the bottom half and the Home side has taken the lead, in which case the *current* score stands.
4. **Periods (5‑inning, 1st Inning, etc.)** that have concluded stand regardless of later abandonment.

**Suspensions & Resumptions**

| Situation                                                              | Pre‑game wagers                                                         | Live wagers                                               | Player‑stat props                                      |
| ---------------------------------------------------------------------- | ----------------------------------------------------------------------- | --------------------------------------------------------- | ------------------------------------------------------ |
| MLB reg‑season game suspended and resumed **> 12 h** after first pitch | Void for un‑completed periods; Moneyline graded per Rule 1 if ≥ 5 IP    | Void                                                      | Action only if game finishes same or next calendar day |
| Suspension **≤ 30 h**                                                  | Bets stand; graded on resumption                                        | Live bets stand if relevant period finishes on resumption | Same as above                                          |
| MLB Play‑offs / Play‑in                                                | Bets stand **regardless** of length of suspension; settle on completion | Same                                                      | Same                                                   |

**Double‑Header (7‑Inning) Fixtures**

5. Market titles must state **“7 Inn”**. If mis‑labelled, all wagers void.
6. Moneyline official after **5 IP** (4½ if Home ahead). All other full‑game markets require **7 IP** (6½ if Home ahead).
7. Rule‑book Mercy invokes completion for settlement purposes.

**Pitcher & Line‑up Definitions**

8. A **starting pitcher** is deemed to have started once they throw their first pitch. A non‑pitcher is deemed a starter once they make their first plate appearance (or take the field defensively for league‑designated “Opener” formats).
9. Where a market lists **one or two named competitors**, *all* must start for action, **except** “Save” props which have action regardless of relief appearance.
10. Overtime does **not** void markets based on listed starting pitchers; odds stand even if rotations change.

**1st Half (5‑Inning) Markets**

11. Pre‑game 1H Moneyline/Run‑Line official after **5 IP** (4½ if Home ahead & game called). In‑play 1H wagers require full 5 IP.

**Market‑Specific Notes**

12. **Total Bases:** Single = 1, Double = 2, Triple = 3, HR = 4. Walks, reach‑on‑error, HBP do *not* count.
13. **Hits+Runs+Errors:** Game must reach full‑game action threshold; if called in extras, revert to last completed inning unless Home scores to tie or win in bottom half.

&#x20;**Season & Futures**

* **League Pennant (AL/NL) & World Series Futures:** Settled on the teams that **participate** in the World Series.
* **Division Winner:** Action if every team in the division completes at least **90 %** of scheduled games; ties settled per MLB tiebreak system.

### Ice Hockey 🏒&#x20;

**Core Timing Rules**

1. **NHL All‑Star & exhibition formats:** Listed markets have action regardless of minutes played or period count.

**Overtime & Shoot‑out Treatment**

3. Overtime (OT) and any **penalty shoot‑out (SO)** are considered the same period for settlement.
4. **Totals and spread/handicap markets** include **extra time** and **shootouts**. The team that is the penalty shootout winner is **awarded an extra goal.**
5. **Regulation‑only moneyline (3‑way) lines** exclude OT/SO entirely.
6. Period and 60‑minute exact‑score markets **always exclude OT/SO.**

**Player & Team Props**

| Prop type                       | OT counts? | SO counts? | Must‑play trigger                          |
| ------------------------------- | ---------- | ---------- | ------------------------------------------ |
| Player Goals / Points / Assists | Yes        | No         | Skater must take **1 shift in regulation** |
| Shots on Goal                   | Yes        | No         | Same                                       |
| Goalie Saves                    | Yes        | No         | Must start the game                        |

7. **Competitor‑stat markets** void if listed player does not appear in regulation.
8. **Stat settlement timing (NHL):** All props settle immediately - post‑game. Subsequent league adjustments are ignored.&#x20;

**Season & Futures**

10. **Conference Winner (NHL):** Team that *participates* in the Stanley Cup Final.

### Tennis 🎾

**Match Integrity & Time Limits**

1. **Retirements / Disqualifications** – Match Money‑Line bets have action once the match **officially starts.**
2. **All other markets** (Set Handicap, Game Totals, etc.) are **void** unless the quoted segment was *already* settled before the retirement/disqualification.
3. **Completion window – 7 days.** A suspended match must be finished within 24h days of its original start for bets to stand, exceptions may apply.
4. **Venue / Surface changes** (indoor ↔ outdoor, hard ↔ clay/grass) do **not** void bets.

**Scoring Conventions**

5. Any *tie‑break* or *match tie‑break* counts as **one game** for Game‑Totals and Handicaps. **ITF singles (non‑Grand‑Slam) & all doubles** where a match‑deciding super tie‑break is used:

   1. Live markets and pre‑match **Money‑Line** have action; however, **pre‑match Spread & Total** markets are void because the final‑set game count is indeterminate.
   2. **Pro‑Set formats** (first to 8/10 games): Only 1st‑Set ML, 2nd‑Set ML (if scheduled) and Match ML are actionable; all other bets void.

   Unless stated otherwise, *Handicap* and *Total* lines use **games won** as the unit.

**In‑Play Specifics**

6. The **next point must be played** for any in‑play wager to stand. If a player retires or is defaulted before the subsequent point starts, all bets placed since the last completed point are void.

**Futures & Outrights**

7. All outright bets have action regardless of draw re‑seeding or venue shift, *unless* the market text specifies that certain named players must start.

### Esports 🎮&#x20;

**Universal Rules**

1. **Start‑time window** – If a match is not underway within **24 hours** of its advertised start, all bets on that match are void.
2. **Format integrity** – Material changes to the match format (best‑of length, map pool, round limit) void all wagers unless the market explicitly accommodates the new format or the change cannot affect the outcome of that market.
3. **Replays & Restarts** – If an entire map/match is restarted from **00:00**, unsettled pre‑match bets remain valid; live bets struck during the voided portion are cancelled. If play is restored from a saved point (e.g., *Match Medic*, *Chronobreak*), markets grade from that restore timestamp; bets dependent on invalidated stats (e.g., Total Rounds Odd/Even) are void.
4. **Default map advantage** – Admin‑awarded advantages (upper‑bracket “auto‑map”) are incorporated into Match lines. Walkovers before play do not count toward map totals.
5. **Overtime / Tie‑breaks** – All overtime or tie‑breaker rounds count toward markets unless the market title states “Regulation Only”.
6. **Roster minimum** – Any map that begins with fewer than the official team size (typically 5‑v‑5 or 10 total competitors) is void.

***

**CS 2**

1. Map is void if played with fewer than 10 competitors for **4 rounds** or if a team retires / receives an admin win before the map’s scheduled rounds complete.
2. Rounds 1‑12 constitute the first half.
3. A *Match Medic* rewind grades markets from the reset round; any stat‑dependent markets invalidated by the rewind are void.
4. If any map switches to CS:GO (MR 15) mid‑series, all match/map markets impacted by the format swap are void.

**Valorant**

4. Same roster and **4‑round** early‑void logic as CS 2.
5. Rounds 1‑12 constitute the first half.
6. *Match Medic* restarts follow identical grading rules.

**Dota 2**

7. Disconnect/admin win **within first 10 minutes** → map void; after 10:00 → bets settle on official result.
8. **Kills** include hero kills, enemy tower kills and enemy creep kills; suicides, team denies, neutral deaths and Roshan deaths do **not** count.

**League of Legends (includes Wild Rift & Mobile Legends variants)**

9. Same 10‑player start rule and 10‑minute disconnect/admin‑win threshold as Dota 2.

**Rainbow Six Siege**

10. Map void if a team retires, receives an admin win, or is disqualified before completing all scheduled rounds.

**Overwatch**

11. Map void if start takes place with fewer than 10 competitors.

**Rocket League, StarCraft 2, Call of Duty & other titles**

12. Apply Universal Rules 1–6. Any title‑specific rulings released by the tournament operator will supersede if communicated prior to match start.

**Common Market Notes**

13. **Kill/Objective props** settle using official broadcast stats or API for that game.
14. **To Advance / Win Final** markets settle on the team that progresses, irrespective of venue moves or delays.

### Fighting Sports 🥊&#x20;

**General Fight Rules**

1. **Fight becomes official** once the opening bell rings to start Round 1, regardless of scheduled length.
2. **Venue changes** within the **same country** do not void action. Moves to a **different country** void all bets unless re‑confirmed by Overtime DAO prior to the event.
3. **Round‑count changes**:
   * Money‑Line bets always have action.
   * For **Total Rounds Over/Under**, action only if the *new* scheduled round count is **greater** than the quoted total. Otherwise those Totals bets void.
4. **Technical Draw / No Contest** – If the bout ends in a technical draw or is declared *No Contest*, all full‑fight markets void **except** those already unconditionally decided (e.g., Round 1 winner prop if Round 1 completed). Period markets completed prior to the stoppage are settled.
5. **Extra or "Sudden Victory" rounds** count toward all markets that reference rounds, totals, or method of victory.
6. If a fight ends by **knockout**, all **handicap** bets on the winning fighter are graded as winners, and all **handicap** bets on the losing fighter are graded as losers.

**Boxing‑Specific Rules**

7. **Inside Distance** – Wins if the selected boxer prevails by KO, TKO, referee/corner stoppage, disqualification, or *technical decision* inside the distance.
8. **“KO” markets** – Settle only on KO, TKO or disqualification. Technical decisions that go to the scorecards do **not** qualify.
9. **Round Totals O/U** – A round is graded *complete* once **1 minute 30 seconds** (half‑way) of that round has elapsed with the bout still in progress.

**MMA‑Specific Rules**

1. **Inside Distance** – Wins if fighter prevails by KO, TKO, referee or doctor stoppage, submission, technical submission, disqualification or any other official stoppage before the final horn.
2. **“KO” markets** – Settle on KO, TKO, or corner stoppage **only**; submissions are not classified as KO/TKO.
3. **Round Totals O/U** – Round is deemed complete once **2 minutes 30 seconds** (half‑way) of that round has elapsed with the bout ongoing.
4. **Wins by Decision** – A *Technical Decision* is treated as a decision.
5. **Method‑of‑Victory Yes/No** props – If the fight ends in a draw, all **Yes/No** method markets settle **No**.
6. **Win in Round X** – Graded on the round in which the fight officially ends, or if a combatant fails to answer the bell for the next round, the previous round.
7. **Fight Goes the Distance** – Settles “Yes” if bout reaches a judges’ decision (including Technical Decision), “No” otherwise.

### Table Tennis 🏓

1. **Money‑Line action trigger** – Once **one full set** has been completed, Match Money‑Line bets stand. If a competitor retires or is disqualified *before* the end of Set 1, all Match Money‑Line wagers are void.
2. **Other markets** (Set Handicaps, Game Totals, Correct Score, etc.) are graded only if the specific set/game referenced reaches its natural conclusion prior to a retirement or disqualification; otherwise those wagers void.
3. **Tie‑break games** (played in place of a deciding set) count as **one game** for Game‑Totals and Handicaps.

#### Rugby 🏉 (Union & League)

1. **Match‑period markets** (Moneyline, Totals, Handicap) include any overtime or *Golden Point* that follows regulation, **unless the market title states “Regulation Only.”**
2. **Action threshold:** A fixture must reach the scheduled **80 minutes** of play (or the officially scheduled shorter duration) for full‑game markets to stand. If abandoned earlier and not completed within **24 hours**, full‑game bets void; markets on fully completed halves/quarters remain valid.
3. **Scoring‑Margin / Winning‑Margin markets** are always graded on **regulation time only**—overtime scores do **not** count.
4. **Player & Team props** include overtime stats if the underlying Match‑period market includes overtime.

### Aussie Rules

1. **All markets exclude overtime unless expressly stated.**
2. **Regular 80 Minutes:** Settlement is based on the score at the end of four × 20‑minute quarters, including injury/stoppage time but **excluding extra‑time**.
3. **Interrupted play:** If a match is halted and resumed within **48 hours** of its original start, open bets settle on the final result. If not resumed inside 48 h, all unsettled wagers are void&#x20;

### Volleyball 🏐

1. **Match abandonment:** Match‑Moneyline wagers stand if **3 sets** are completed in a best‑of‑five format; otherwise void.
2. **Scoring units:** All **Match‑period** markets use **sets** as the scoring unit. All other periods (individual sets, live points, etc.) use **points** as the scoring unit.

### Handball 🤾‍♂️

1. **Regulation only** by default (60 min); separate “Incl. OT” markets offered.

### Water Polo 🤽‍♂️

1. **Regulation only**; shootouts/OT excluded.

### Cricket🏏

1. **Abandoned/no‑result:** Bets void except markets already settled (e.g. First Over Runs).
2. **Tests**: If the match does not complete **four innings,** Match Moneyline markets settle based on the official ruling, but all Match-period Totals are void. Completed innings or segments remain valid.
3. **ODIs & T20**s: If scheduled overs are not completed, Moneyline markets are settled based on the official result; Match-period Totals are void unless already settled.
4. **Super Overs**: Count toward **all Match-period** markets unless a market is explicitly labelled “Regulation Only.”

### Formula 1 🏎️

1. **Result timing**: Unless otherwise stated, all race markets are settled based on the official classification at the time of the **podium presentation.**
2. **Abandoned races**: Events shortened due to weather or other factors but deemed official by the governing body are **graded per the published resul**t
3. **Postponements**: If a race is not held on the originally scheduled **UTC calendar day**, all markets are void, unless explicitly restated.

### Golf ⛳️

1. **Futures settlement**: All futures bets are settled on the player/team **winning the trophy**. Playoff outcomes count toward settlement.
2. **Non-starter void rule:** If a selected player does not tee off their first hole, bets on that player are void.
3. **Abbreviated tournaments:** If fewer than **36 holes** are completed, all futures bets are void. If 36 or more holes are completed, futures stand and are settled on the final leaderboard.
4. **Timing of entry:** Bets placed after the final shot of the last completed round and before the event is called or resumed are void.

### Darts 🎯

1. **Moneyline / Winner:** If a match begins but is not completed, the competitor who is officially **awarded the win** or advances to the next round is deemed the winner for settlement. In 2‑way Winner markets, an official tie is graded as a push.
2. **Ties in single‑stat props** (Highest Checkout, Most 180s) are settled using the General dead‑heat rule unless the market text specifies otherwise.

### Politics 🗳️

1. **Source:** Official Electoral Commission declaration.
2. **Void criteria:** Candidate‑to‑announce markets void if deadline passes without announcement.
3. **Result final** once settled; subsequent legal challenges ignored.

### Futures & Outrights 📈

1. **Action** as soon as competition starts; dead‑heat applies to ties.
2. **Season Win markets:** Settle when total cannot be overturned given remaining games.
3. **Championship/Conference/Division Futures:** Governed by official league definitions (e.g., NFL conference champion = Super Bowl participant).

<p align="center"><img src="/files/11kES3L5InfjwN2eULDw" alt=""></p>


# Overtime Account Migration

Smart Account Architecture Upgrade: Biconomy V2 → Biconomy Nexus (MEE)

## Overview

Overtime is upgrading user smart accounts from Biconomy V2 to Biconomy Nexus Accounts with Modular Execution Environment.

This upgrade is required to keep user accounts compatible with the latest account abstraction infrastructure and future roadmap, improve reliability, and unlock potential new features. To complete the upgrade, users must click the UPGRADE button in the Overtime frontend and execute the onchain signature.

This is a one-time, user-triggered migration. No funds are at risk and ownership of the account remains fully with the user with the same individual Overtime Account address.

### What Is Being Upgraded?

Overtime Accounts on the Overtime dapp are smart contract wallets (also called smart accounts) that simplify user experience from regular EOAs, while maintaining full non-custodial and onchain nature of the product.

Historically, these accounts were deployed using Biconomy V2 Smart Accounts. The platform is now migrating to Biconomy Nexus Accounts, which are built on MEE.<br>

**In short:**

| **Before**                  | **After**                           |
| --------------------------- | ----------------------------------- |
| Biconomy V2 Smart Account   | Biconomy Nexus Smart Account        |
| Legacy account architecture | Modular, future-proof architecture  |
| Limited extensibility       | Native support for advanced modules |

### Why This Upgrade Is Necessary

#### 1. End of Lifecycle for Biconomy V2

Biconomy V2 Smart Accounts are part of an older generation of account abstraction infrastructure. While still functional, they are no longer the recommended standard and will not receive the same level of feature support moving forward.

Upgrading ensures long-term compatibility and avoids technical debt.

#### 2. Nexus Accounts Are the New Standard

Biconomy Nexus introduces a modular smart account architecture. This design allows:

* Safer upgrades in the future
* Cleaner separation of logic (validation, execution, permissions)
* Better compatibility with evolving ERC-4337 tooling

For users, this means a more robust and maintainable account, even if the day-to-day UX stays the same.

#### 3. Required for Upcoming Features & Fixes

Some upcoming improvements on Overtime Markets depend on Nexus-specific functionality, including:

* Improved transaction handling
* More reliable gas abstraction and relaying
* Safer extensibility for future account features

Without upgrading, older smart accounts may become partially incompatible with new releases.

***

## Wha**t** Happens When You Click `UPGRADE`

When a user clicks **`UPGRADE`**, the frontend initiates a *single atomic onchain transaction* that performs the smart account migration from **Biconomy V2 Smart Account** to a **Biconomy Nexus smart account built on the Modular Execution Environment (MEE)**.

{% hint style="info" %}
The Overtime Account upgrade is **network-specific**. If the Overtime Account is upgraded on one network, the upgrade will **not** carry over to other networks. To use the Overtime Account on a different network, the user must execute the **`UPGRADE`** process again on that network.
{% endhint %}

Here’s exactly what the upgrade process does:

<details>

<summary><strong>1️⃣ Prepares an Onchain Upgrade Operation</strong></summary>

* The upgrade constructs **low-level calldata** that encodes two actions:\
  • Update the smart account’s implementation logic to the Nexus version\
  • Initialize the Nexus account environment for this user
* Both of these actions are bundled into a single batched execution so they run **atomically** in one state transition. If one part fails, nothing is applied.

</details>

<details>

<summary><strong>2️⃣ Upgrade the Smart Account Implementation (Onchain Logic)</strong></summary>

* The smart contract wallet’s internal implementation pointer is updated in-place to the new **Nexus/MEE implementation** — this does *not* change the account’s address or storage.
* This step preserves:\
  • The existing account address\
  • All funds and assets\
  • All relationships with other contracts
* The implementation update is performed via an encoded function call to `updateImplementation`.

</details>

<details>

<summary><strong>3️⃣ Initialize the Nexus Environment</strong></summary>

* After the implementation pointer is updated, the account must be *initialized as a Nexus account*.
* This involves setting up the **modular execution environment (MEE)** and a default validator so the account can operate under Nexus rules and standards.
* A separate encoded function call to `initializeAccount` is prepared with all necessary initialization data.

</details>

<details>

<summary><strong>4️⃣ Batch Execution — Single Atomic Action</strong></summary>

* Both the **implementation upgrade** and **Nexus initialization** calls are combined via a `executeBatch` call inside the smart account.
* This ensures **no partial upgrade state** can occur — either the whole migration executes, or it doesn’t.

</details>

<details>

<summary><strong>5️⃣ Wrap It in an ERC-4337 UserOperation</strong></summary>

* To make this upgrade usable in an account abstraction flow:\
  • A standard ERC-4337 `UserOperation` is built\
  • The upgrade calldata becomes the transaction payload\
  • The operation is signed by the existing account owner using normal account signing logic
* This allows the upgrade to be processed through the EntryPoint as a normal user operation, even after Biconomy’s bundled service shuts down.

</details>

<details>

<summary><strong>6️⃣ POST DISCONTINUATION: Submit Through a Mini Bundler or EntryPoint</strong></summary>

* Because Biconomy’s hosted bundler service is being discontinued, the EOA wallets can act as a **mini bundler**:\
  • It packages the user operation\
  • Submits it directly to the ERC-4337 EntryPoint contract\
  • Handles gas and transaction submission without reliance on external bundlers
* The result is the same as a regular transaction: it gets mined, confirmed, and the account is migrated.

</details>

**🧠 What the Upgrade&#x20;*****Doesn’t*****&#x20;Do**

✔ It does **not transfer funds**\
✔ It does **not change account ownership**\
✔ It does **not generate a new wallet key or new address**\
✔ It does **not require manual asset movement**

All balances, ownership, and external contract relationships remain intact. The only change is the **underlying account logic and execution environment**.

**🎯 End Result**

Once the upgrade transaction is confirmed:

* Your smart account now runs on **Biconomy Nexus with MEE support**
* The same account address continues to be used
* The account is ready for future features, modules, and upgrades supported by Nexus and MEE
* You can continue using the dapp exactly as before now on an improved account backbone.

{% hint style="warning" %}

## **Is This Upgrade Mandatory?**

**Yes.**

Users must upgrade to continue using Overtime without interruptions. Biconomy V2 accounts lose compatibility with new transactions flow or features.
{% endhint %}

***

## Biconomy Nexus Advantages <a href="#biconomy-nexus-advantages" id="biconomy-nexus-advantages"></a>

#### [​](https://docs.biconomy.io/new/learn-about-biconomy/nexus#performance-&-cost-efficiency)Performance & Cost Efficiency <a href="#performance-and-cost-efficiency" id="performance-and-cost-efficiency"></a>

**25% lower gas costs** compared to alternative implementations through optimized contract design

* **Batched operations** via ERC-7579 modules reduce transaction overhead
* **Efficient calldata encoding** minimizes L2 data availability costs

#### [​](https://docs.biconomy.io/new/learn-about-biconomy/nexus#composable-batching)Composable Batching <a href="#composable-batching" id="composable-batching"></a>

Nexus is the only smart account solution on the market enabling composable batch execution. It allows developers to encode batch calls where the next instruction depends on the output of the previous one.

* **EIP-7702 compatibility** ensures forward compatibility with Ethereum’s account abstraction roadmap
* **Modular design** (ERC-7579) enables you to install third-party modules on user accounts
* **Cross-chain support** includes all major EVM networks with unified deployment addresses

For developers

* **AbstractJS SDK** provides type-safe interfaces for account interactions
* **Pre-built modules** for common features (recovery, spending limits, session keys)
* **Standardized interfaces** ensure compatibility with ecosystem tooling
* **Comprehensive documentation** with implementation examples and best practices

Security

* **92% DefiSafety score** demonstrates adherence to security best practices
* **Battle-tested contracts** with 2M+ smart accounts, $500M+ value processed without incidents
* [Contracts and Audits of Biconomy MEE Contracts Suite](https://docs.biconomy.io/contracts-and-audits)

***

## Summary

* Overtime is upgrading smart accounts from Biconomy V2 to Biconomy Nexus (MEE)
* This ensures long-term compatibility, security, and feature support
* Users must execute **`UPGRADE`** once to migrate their account
* Funds, ownership, and access remain unchanged

{% hint style="warning" %}
If you see the **`UPGRADE`** prompt, please complete it to continue using the dapp seamlessly.
{% endhint %}


# Introduction to Overtime Casino

The Casino Is a Smart Contract Now.

## Welcome to [Overtime Casino](https://overtimemarkets.xyz/casino):link:

Overtime Casino is a fully onchain casino built on the same architecture that powers the Overtime sportsbook. Twelve games, **Roulette, Blackjack, Dice, Baccarat, Slots, Plinko, Keno, HI-LO and 4 types of Poker** each implemented as a separate, audited smart contract, each using **Chainlink VRF v2.5** as the source of randomness, and each playable directly from any wallet on Base, Optimism and Arbitrum.

There is no "casino backend." There is no operator-controlled RNG. There is no admin function that can void a winning bet. The contract code is the casino.

***

### Why we built it

Overtime began with a single position: **betting infrastructure should not depend on trust in the operator.**

Sportsbooks shouldn't be allowed to limit, ban or shadow-cap winners. Casinos shouldn't be allowed to run RNGs nobody can audit. Liquidity shouldn't sit in a black box. Withdrawals shouldn't be stalled when the books look bad that month. Affiliate payouts shouldn't be subject to retroactive "review."

Over the past four-plus years, Overtime has shown that this works for sports. The existing Overtime sportsbook offers:

* Onchain parlays, system bets, SGPs and live betting
* Onchain digital options on ETH/BTC price (1-minute markets)
* No registration, no KYC choke point, no ability to limit or ban a winning user - the contracts simply don't have those functions

Overtime Casino extends the same architecture to the casino floor. The same wallet, the same collateral balance ($USDC, $WETH, $OVER), the same free-bet system, and the same referrals registry - now exposed to all  game contracts.

> *Sunlight is the best disinfectant.*

The casino industry has had a hundred years to live up to that idea and chose not to. Provably fair sites publish hashes nobody verifies. Streamers play on house accounts and pretend the variance is real. Withdrawal queues stretch to weeks. Affiliate earnings get clawed back. The entire model relies on the assumption that the player can't see inside the box.

Overtime Casino removes the box.

***

### What "fully onchain" actually means here

Every Overtime Casino game follows the same lifecycle. It's worth walking through it once, because this is where most "crypto casinos" quietly cheat.

#### 1. You call the game contract directly

You (or a frontend acting on your behalf) call `placeBet` on the game contract. Your collateral (USDC, WETH or $OVER) is pulled into the contract via `safeTransferFrom`. The contract validates your selection, checks the bet meets the `MIN_BET_USD` floor, and **reserves the worst-case payout liability** against its bankroll so the house can't oversell its book.

#### 2. The contract requests randomness from Chainlink VRF v2.5

The contract calls `vrfCoordinator.requestRandomWords(...)` with a configured key hash, subscription ID and callback gas limit. Your bet enters `PENDING` status, indexed by both an internal `betId` and the Chainlink `requestId`.

At this point, **the outcome of your bet does not exist anywhere.** Not on a server. Not in the contract. Not in some buffer waiting to be revealed. The randomness has not been generated yet.

#### 3. Chainlink fulfills the request

Chainlink's decentralized oracle network generates a cryptographically verifiable random number and calls back into the contract via `rawFulfillRandomWords`. This function is gated to the VRF coordinator address, no other caller, including Overtime, can fulfill a randomness request.

#### 4. The contract resolves the bet

Inside the same callback, the contract:

* Derives the game outcome from the random word using pure onchain logic (`randomWords[0] % 37` for roulette, weighted symbol sampling for slots, card draws for blackjack and baccarat, etc.)
* Marks the bet `RESOLVED` and emits a `BetResolved` event with the result
* Transfers the payout to the user immediately if they won
* Pays the referrer their share automatically if the user lost

#### 5. Everything is public

Every parameter, `houseEdge`, `maxProfitUsd`, supported collaterals, slot symbol weights, the configurable Banker payout in baccarat, is a public state variable. Every state transition emits a named event. Every step shows up on a block explorer.

#### And if a bet ever stalls

If Chainlink fulfillment fails for any reason, the contract has a `cancelTimeout` (minimum 30 seconds, configurable per game). After that timeout, **the user themselves** can call `cancelBet` and recover their full stake. The house cannot strand player funds. The escape hatch is enforced by code.

***

### What this means in practice

* **No operator can void a resolved win.** The function doesn't exist.
* **No operator can bias the RNG.** Chainlink VRF generates the randomness, not Overtime.
* **No operator can quietly inflate the house edge.** It's a public state variable, capped on-chain (`MAX_HOUSE_EDGE = 5%` on Dice and Slots).
* **No operator can hold up a withdrawal.** The payout transfer happens inside the same VRF callback that resolves the bet.
* **No operator can claw back a referral payout.** The referral fee is paid by the contract, in the same transaction, on every losing bet.

This is what "fully onchain" should mean. Not "the deposit is onchain and the rest is a centralized API." Not "trust us, our RNG is fair." The entire game lives in a contract you can read, simulate and verify.

***

### What you'll find in these docs

* **Game guides**: All guides, each with rules, payout tables, and a walkthrough of the user flow.
* **Become an Overtime Casino Affiliate**: how to generate a referral link and earn up to 20% of generated fees, paid directly by the contracts.
* **Integrate Overtime Casino**: developer guide for wiring the contracts into your own product, with notes for vibe coders and AI agents.

If you already have an Overtime account, you already have a casino account. Same wallet, same balance, same UX. Head to [**overtimemarkets.xyz/casino**](https://overtimemarkets.xyz/casino) and pick a game.


# How the Games are Built

Overtime Casino has twelve games built across two generations of architecture. They play the same way from a user's seat - connect a wallet, place a bet, get a verifiable result from Chainlink VRF - but under the hood there are two designs, and the differences matter if you're integrating, auditing, or just want to understand exactly what guarantees you're getting.

This page explains both. You don't need it to play. You do need it to build.

***

### The two generations at a glance

**The original five** - Roulette, Dice, Blackjack, Baccarat, Slots - are standalone contracts. Each one holds its own bankroll, talks to Chainlink VRF directly, and manages its own reservations, free bets, and referrals.

**The newer seven** - Plinko, Hi-Lo, Keno, Video Poker, Three Card Poker, Ultimate Texas Hold'em, Bonus Texas Hold'em - are built on a shared core. A single contract, `CasinoCoreV2`, holds the treasury and the shared services; each game contract is thin, containing only its own rules and bet state.

Here's the contrast, dimension by dimension:

|                     | Original five                                            | Newer seven                                                      |
| ------------------- | -------------------------------------------------------- | ---------------------------------------------------------------- |
| **Funds**           | Each game holds its own bankroll                         | One shared treasury (`CasinoCoreV2`)                             |
| **Randomness**      | Game calls VRF and receives the callback directly        | Core calls VRF and routes the callback to the game               |
| **User cancel**     | Yes - after a timeout, you can cancel your own stuck bet | No - recovery is operator-only                                   |
| **Free bets**       | Separate `…WithFreeBet` functions                        | A flag on `placeBet` (or a separate function for side-bet games) |
| **Circuit breaker** | None                                                     | Per-game auto-pause on cumulative loss                           |
| **Read aggregator** | `CasinoData`                                             | `CasinoDataV2`                                                   |

Both generations use **Chainlink VRF v2.5**, support **USDC / WETH / $OVER**, enforce a **3 USD minimum bet**, and are deployed as upgradeable proxies. Neither has a function to void a resolved win, bias the RNG, or ban a winning wallet.

***

### The original five: standalone contracts

Each of the first five games is a self-contained contract that holds its own liquidity.

**Lifecycle.** You call `placeBet` (or `placeMultiBet` for Roulette, or the per-action functions in Blackjack) directly on the game contract. It pulls your collateral via `safeTransferFrom` into its own balance, validates your selection, and reserves the worst-case payout. It requests a random word from Chainlink VRF. When the VRF coordinator calls the game's own `rawFulfillRandomWords`, the game derives the outcome, pays you if you won, pays your referrer if you lost, and emits a resolution event.

**Full reservation.** This is the defining property of the V1 design. Every game tracks `reservedProfitPerCollateral` - the sum of the worst-case payouts of *all* its pending bets. Before accepting a new bet, it checks that its entire balance covers that entire cumulative liability:

```
balanceOf(this) >= reservedProfitPerCollateral[collateral]
```

If a new bet would push reserved liability past the bankroll, it reverts with `InsufficientAvailableLiquidity`. In other words, every pending bet in a V1 game is fully backed at all times - the contract could pay every outstanding bet's maximum simultaneously and still be solvent. This is conservative and capital-heavy, but it means a V1 game can never be caught short.

**User-callable cancel.** Each V1 game lets *you* recover a stuck bet. If Chainlink fails to fulfill within `cancelTimeout` (a minimum of 30 seconds, set per game), you can call the cancel function yourself - `cancelBet` in Roulette, Dice, and Baccarat; `cancelHand` in Blackjack; `cancelSpin` in Slots - and get your stake back. You don't need to wait for an operator. There's also an `adminCancelBet`-style path (resolver-only) for emergencies, but the user path is the primary one.

**Free bets and referrals.** Free bets use dedicated entry points - `placeBetWithFreeBet`, and `placeMultiBetWithFreeBet` for Roulette - that pull from the free-bets holder instead of your wallet. Referrals are wired per-game through the shared `IReferrals` registry; a losing real-money bet pays the referrer automatically.

**Reading them.** A separate read-only aggregator, `CasinoData`, merges paginated bet history across all five games into a uniform record shape, so a frontend can fetch a page of history in one call per page rather than one call per bet.

***

### The newer seven: one shared core

The seven newer games share `CasinoCoreV2`, a singleton treasury and services contract. The game contracts hold no funds; they're pure game logic and lifecycle state.

`CasinoCoreV2` handles:

* **Funds** - pulling stakes from your wallet (`pullFromUser`) or your free-bet balance (`useFreeBet`), and paying out (`payOut`)
* **Randomness** - requesting words from Chainlink VRF (`requestRandomWords`) and routing the fulfilled callback to the right game
* **Reservations** - reserving and releasing worst-case payouts
* **Free bets and referrals** - the shared wiring, identical in spirit to V1 but centralized
* **Limits** - effective minimum bet, maximum bet, and maximum profit, per game
* **Circuit breaker** - per-game cumulative-loss accounting that auto-pauses a game that's bleeding

Each game - `Plinko`, `Keno`, `HiLo`, and the rest - implements only its rules and its bet's state machine. When a VRF word arrives, core calls the game's `onVrfFulfilled`, the game derives its outcome, and tells core how to settle.

There's also a third contract: **`CasinoDataV2`**, a read-only aggregator over core and all seven games - a treasury overview, per-game status (including live circuit-breaker state), and paginated bet records, all from one place. (See Integrate Overtime Casino for how to use it.)

**Lifecycle.** You call `placeBet` on the game contract (passing an `isFreeBet` flag, or using `placeBetWithFreeBet` for the side-bet games). The game asks core to pull your stake and reserve the worst case, then requests a VRF word. Single-shot games (Plinko, Keno) resolve on the first callback. Multi-step games (Hi-Lo, Video Poker, the poker games) take further actions via a `makeAction(betId, action)` dispatcher, each potentially triggering a new VRF request, until the bet resolves. The VRF coordinator calls **core's** `rawFulfillRandomWords`, which looks up which game owns that request and forwards to its `onVrfFulfilled`.

**Multi-step games use an action dispatcher.** The games where you make mid-hand decisions expose one `makeAction(betId, action)` function with a small integer action code, which keeps them uniform and easy to drive from a frontend, bot, or AI agent:

* **Hi-Lo:** `0` = guess Above, `1` = guess Below, `2` = cash out
* **Three Card Poker:** `0` = Play, `1` = Fold
* **Ultimate Texas Hold'em:** `0` = play pre-flop, `1` = check pre-flop, `2` = play post-flop, `3` = check post-flop, `4` = raise river, `5` = fold
* **Bonus Texas Hold'em:** `0` = play pre-flop, `1` = fold, `2` = raise flop, `3` = check flop, `4` = raise turn, `5` = check turn, `6` = raise river, `7` = check river

(Video Poker uses a dedicated `draw(holdMask)` rather than the dispatcher.) An unknown action code reverts (`InvalidAction`) rather than silently doing nothing.

***

### Staged VRF: hidden cards stay hidden

Several games - in both generations - depend on you acting before you've seen certain cards: the dealer's hand in Blackjack and the poker games, the next street in Hold'em, your draw cards in Video Poker. In every one of those cases, the unseen cards are drawn from a **separate VRF request that fires only when the game needs to reveal them.** They are never written to contract storage before you commit your decision.

This matters because contract storage is publicly readable (`eth_getStorageAt`). If a future card were sitting in storage while you decided, a sophisticated player could read it and play perfectly. Staging the VRF requests so each card is generated only at the moment of reveal closes that hole. The principle was introduced in the original Blackjack contract (the dealer's hole card isn't generated until you stand) and is applied consistently across every newer game that has hidden information.

***

### The circuit breaker (newer seven only)

`CasinoCoreV2` tracks each game's cumulative house net P\&L, in USD, as bets settle. If a game's net result falls below a configured loss threshold - default **1,000 USD**, adjustable per game - that game **auto-pauses**: no new bets until an admin resets it. Pending bets always continue to settle even while a game is paused.

This protects the shared treasury from a single game bleeding out due to a bug or an extreme run of player wins, and it's a feature the V1 games (with their isolated bankrolls) didn't need. The live state - `houseNetUsd`, `maxNetLossUsd`, `autoPaused` - is readable on-chain through `CasinoDataV2`.

***

### Cancellation: the key behavioral difference

If a VRF request stalls, how a bet recovers depends on which generation it belongs to.

**Original five:** you can cancel your own stuck bet after `cancelTimeout` (minimum 30 seconds). The operator can also admin-cancel, but you are never dependent on them.

**Newer seven:** there is **no user-callable cancel.** This was a deliberate decision - a user cancel sitting in the mempool alongside a pending VRF request is a front-run surface (a player could cancel selectively based on the pending result). The only recovery path is `adminCancelBet`, callable by the resolver role. Core still exposes a `cancelTimeout` value (minimum 30s), but for the newer games it's an **operational SLA, not an on-chain rule** - the soonest the operator commits to admin-cancelling a stalled bet, surfaced so a frontend can show a "maximum wait before refund." It is not enforced by the contract, because there's no user-callable cancel for it to gate.

A cancel - in either generation - refunds your original stake; for the multi-step newer games it forfeits any accumulated multiplier or raises and returns the base stake. Free-bet cancels route the refund back to your free-bet balance.

***

### House edge, transparently bounded

Across both generations, each game's economics are bounded in code and readable on-chain:

* **Roulette** - European single-zero, house edge fixed at \~2.7% by the wheel
* **Dice** - house edge configurable, capped at 5%; payout derived from `(1 − houseEdge) / probability`
* **Blackjack** - 3:2 naturals, dealer hits soft 17; edge depends on rules and play
* **Baccarat** - Banker payout a public parameter, bounded \[1.00×, 2.00×]
* **Slots** - pay table fully public; house edge capped at 5%
* **Plinko** - RTP capped at 98% (≥2% edge), enforced on every paytable update
* **Hi-Lo** - house edge configurable within 2%–5%; per-guess multiplier from a published formula
* **Keno** - paytables calibrated to \~1.9%–3.1% edge per pick count; multipliers capped at 300×
* **Video Poker** - 8/5 Jacks or Better, \~96.5% RTP under optimal play
* **Three Card Poker** - locked paytables with a guaranteed ≥2% edge
* **Ultimate / Bonus Hold'em** - locked Vegas-standard paytables, side-bet ceilings at 500×

In every case you can read the relevant parameters off-chain and verify the math yourself before you play. That's the whole point: the casino's edge is a number you can check, not a claim you have to trust.


# GAMES


# Table Games


# Roulette

European single-zero roulette, fully onchain. Every spin is resolved by a single Chainlink VRF random word.

## Roulette

European single-zero roulette, fully onchain. Every spin is resolved by a single Chainlink VRF random word.

***

### How it works

The Overtime Roulette contract implements a **European wheel with 37 pockets** (0 through 36). When you place a bet, the contract:

1. Pulls your collateral and validates your selection
2. Reserves the worst-case payout against the bankroll
3. Requests a random word from Chainlink VRF
4. On fulfillment, computes the result as `randomWords[0] % 37`
5. Pays out winning bets and transfers them to your wallet immediately

There is no PRNG seed managed by the operator. There is no "house variance adjustment." 0 through 36, uniformly, sourced from a decentralized oracle network.

***

### Bet types and payouts

| Bet type        | Selection              | Payout (profit) | Total return on win |
| --------------- | ---------------------- | --------------- | ------------------- |
| **Straight**    | A single number, 0–36  | 35 : 1          | 36× stake           |
| **Red / Black** | Color                  | 1 : 1           | 2× stake            |
| **Odd / Even**  | Parity (excluding 0)   | 1 : 1           | 2× stake            |
| **Low / High**  | 1–18 or 19–36          | 1 : 1           | 2× stake            |
| **Dozen**       | 1–12, 13–24, or 25–36  | 2 : 1           | 3× stake            |
| **Column**      | 1st, 2nd or 3rd column | 2 : 1           | 3× stake            |

A spin of `0` loses every outside bet (Red/Black, Odd/Even, Low/High, Dozen, Column). Only a Straight bet on 0 wins on a zero spin.

***

### Multi-pick bets

You can place up to **10 picks on a single spin**, all sharing one Chainlink VRF request. This is the equivalent of dropping multiple chips on the felt before the dealer waves their hand.

For example, in one bet you can stake:

* 10 USDC on Red
* 5 USDC on Dozen 1
* 2 USDC Straight on number 17

When the wheel result is revealed, every pick is evaluated against it. Winning legs are paid, losing legs are not. The contract correctly handles cases where mutually exclusive picks (e.g. Dozen 1 + Dozen 2) appear in the same multi-bet — the bankroll reservation only covers the maximum possible payout across all 37 outcomes, not the sum of all picks.

***

### Limits

| Parameter                   | Value                                                |
| --------------------------- | ---------------------------------------------------- |
| Minimum bet                 | 3 USD per pick (normalized via Chainlink price feed) |
| Maximum picks per multi-bet | 10                                                   |
| Maximum profit per bet      | Set per deployment (`maxProfitUsd`)                  |
| Cancel timeout              | 30 seconds minimum (in case of VRF stall)            |

Supported collaterals: **USDC**, **WETH**, **$OVER**.

***

### User guide

#### 1. Log In to Overtime

Visit **overtimemarkets.xyz/casino** and Log In.

#### 2. Pick the Roulette table

Select **Roulette** from the casino lobby.

#### 3. Choose your collateral

Switch between USDC, WETH and $OVER from the collateral selector. The minimum-bet floor is enforced in USD, so the equivalent collateral amount adjusts automatically based on the Chainlink price feed.

<figure><img src="/files/GKSKp9gxIXXeCAJRa2EV" alt=""><figcaption></figcaption></figure>

#### 4. Input your desired buy-in amount per chip

In the `Enter amount` input field, enter the buy-in amount you want to bet with per chip.

#### 5. Place chips on the table

Click any betting area on the roulette layout: a number for a Straight bet, a color box for Red/Black, the dozen or column markers for outside bets. Each click drops a chip equal to your selected stake amount. You can stack up to 10 picks on a single spin.

<figure><img src="/files/ZjuA13YQ6ryzLmoGnb8T" alt=""><figcaption></figcaption></figure>

#### 6. Spin

Hit **Spin**.

After the bet is confirmed onchain, your bet enters `PENDING` while the contract waits for the VRF callback. This typically takes a few seconds.

#### 7. Result

When Chainlink fulfills the randomness, the wheel result is revealed. Winning picks pay out automatically in the same transaction. You can see the resolved bet and the payout in your bet history, and on a block explorer if you want to verify it directly.

#### Cancelling a stuck bet

If a spin somehow doesn't resolve within the cancel timeout (very rare, but possible if Chainlink fulfillment is delayed), you can cancel the bet from your bet history and recover your full stake. No customer support ticket required.

***

### Free bets

If you have an Overtime free-bet balance, the Roulette interface will offer a "Use free bet" toggle on supported collaterals. Free-bet roulette bets work identically to staked bets — they call `placeBetWithFreeBet` instead of `placeBet`, and any winnings are settled through the existing Overtime free-bets infrastructure.


# Blackjack

Single-player heads-up blackjack against a deterministic onchain dealer. Every card you draw is a separate Chainlink VRF random word.

### How it works

Blackjack is the most stateful of the Overtime Casino games, because the player makes choices mid-hand. The contract handles this with a proper **state machine** — and every state transition that requires randomness issues its own Chainlink VRF request.

The hand lifecycle:

```
NONE
  → AWAITING_DEAL (initial 4 cards: 2 player, 2 dealer)
  → PLAYER_TURN
      → AWAITING_HIT          (player draws another card)
      → AWAITING_STAND        (dealer plays out per house rules)
      → AWAITING_DOUBLE       (player doubles stake, draws one card, dealer plays)
      → AWAITING_SPLIT        (player splits a pair into two parallel hands)
  → RESOLVED
```

Each of those `AWAITING_*` states corresponds to a pending VRF request. **You cannot be dealt a card that the dealer "already knew."** The contract literally does not know your next card until Chainlink's oracle network returns the random word.

***

### House rules

* **European single-deck logic** with rank values Ace through King
* **Blackjack pays 3:2** on a natural (Ace + 10-value card on the initial deal, when the dealer doesn't also have blackjack)
* **Regular wins pay 1:1**
* **Push** refunds the stake (player and dealer tie)
* **Dealer hits on soft 17** (`DEALER_STAND_THRESHOLD = 17`)
* **Doubling** doubles your stake, draws exactly one card, and stands automatically — the contract re-checks bankroll liquidity at the moment you double
* **Splitting** a pair creates a second parallel hand with its own VRF lifecycle and independent resolution
* **Maximum cards per hand**: 11

***

### Possible outcomes

| Result           | Description                                         | Payout                   |
| ---------------- | --------------------------------------------------- | ------------------------ |
| Player Blackjack | Natural 21 on initial deal, dealer doesn't have one | 2.5× stake (3:2 + stake) |
| Player Win       | Player total > dealer total, neither busts          | 2× stake (1:1 + stake)   |
| Dealer Bust      | Dealer > 21                                         | 2× stake                 |
| Push             | Player and dealer same total, or both blackjack     | Stake refunded           |
| Player Bust      | Player > 21                                         | Loss                     |
| Dealer Win       | Dealer total > player total, neither busts          | Loss                     |

For split hands, each sub-hand resolves independently. You can win one and lose the other.

***

### Limits

| Parameter               | Value                               |
| ----------------------- | ----------------------------------- |
| Minimum bet             | 3 USD                               |
| Maximum profit per hand | Set per deployment (`maxProfitUsd`) |
| Cancel timeout          | 30 seconds minimum                  |

Supported collaterals: **USDC**, **WETH**, **$OVER**.

***

### User guide

#### 1. Open the Blackjack table

Select **Blackjack** from the casino lobby. Pick your collateral and stake.

> *\[Screenshot — Blackjack lobby tile and stake entry]*

#### 2. Deal

Click **Deal**, sign the deal transaction. The contract requests randomness for the initial four cards (your two cards + dealer's two cards, with one face-down).

> *\[Screenshot — initial deal animation]*

#### 3. Make your move

Once the deal resolves, you'll see your hand and the dealer's face-up card. Choose:

* **Hit** — draw one more card
* **Stand** — end your turn, dealer plays out
* **Double Down** — double your stake, draw exactly one card, end turn (only available on first move)
* **Split** — if your two starting cards are a pair, split them into two hands (creates a parallel hand)

Each action is a separate transaction. Each draw is a separate Chainlink VRF request.

> *\[Screenshot — player turn with action buttons]*

#### 4. Dealer plays

When you stand (or bust), the dealer's hidden card is revealed and the dealer plays out: hits until reaching at least 17. The contract enforces this deterministically — there's no human dealer making decisions.

> *\[Screenshot — dealer plays out]*

#### 5. Resolution

The contract computes the winner, transfers your payout if you won (or refunds on push), and emits a `BetResolved` event with the full result. The hand's complete history — every card, every action — is reconstructable from the event log.

> *\[Screenshot — final hand result]*

#### Cancelling a stuck hand

If a VRF request stalls, the cancel timeout applies the same way it does in every other game. After 30+ seconds you can cancel the pending action and recover your committed stake.

***

### Why this matters

Online blackjack has always asked you to trust the operator's "shoe." Some sites publish hashes you can verify after the fact. Some don't. Some operators have been caught dealing from non-uniform decks; some affiliated streamers have been caught playing against scripted shoes.

Overtime Blackjack closes that entire category of question:

* **There is no shoe.** Cards are sampled fresh from a Chainlink VRF random word every time you draw.
* **There is no dealer who knew your next card.** The contract doesn't know it until Chainlink fulfills.
* **There is no operator who can replay a hand to a more favorable outcome.** State transitions are one-way; each one is committed to chain.

If you've ever wondered whether an online blackjack site is dealing from a fair shoe, here's your answer: **the shoe doesn't exist until Chainlink generates it.**

***

### Free bets

Blackjack supports `placeBetWithFreeBet` for the initial deal. Free-bet hands play through the same state machine and settle through the existing Overtime free-bets infrastructure.


# Baccarat

Standard Punto Banco baccarat (Player, Banker, Tie) with the third-card draw rules implemented in pure Solidity.

### How it works

The Overtime Baccarat contract implements the classic third-card rules of Punto Banco baccarat. When you place a bet:

1. You stake on **Player**, **Banker** or **Tie**
2. The contract requests a random word from Chainlink VRF
3. From that random word, the contract deals the initial four cards (Player + Banker, two each)
4. The third-card draw rules are applied deterministically based on the totals
5. The hand totals are computed, the winner is determined, and your payout is transferred

The hand is dealt and resolved in the same VRF callback — there's no stateful turn-by-turn UX as in blackjack, because in Punto Banco the player makes no decisions after placing the bet.

***

### Bet types and payouts

| Bet                                      | Win condition                  | Total payout                                                  |
| ---------------------------------------- | ------------------------------ | ------------------------------------------------------------- |
| **Player**                               | Player hand wins               | **2.00×** (1:1 + stake)                                       |
| **Banker**                               | Banker hand wins               | **1.95×** default (configurable, capped 1.00×–2.00× on-chain) |
| **Tie**                                  | Player and Banker totals equal | **9.00×** (8:1 + stake)                                       |
| Player or Banker bet, when result is Tie | /                              | Stake refunded (push)                                         |

The Banker payout being slightly under 2× reflects the standard 5% commission found at any traditional baccarat table — except in Overtime's case the multiplier is a public state variable. Any change emits a `BankerPayoutMultiplierChanged` event. Every bettor who comes after sees the new number before they place their stake.

The contract structurally enforces that the Banker payout cannot be set outside the `[1.00×, 2.00×]` range. **It is not possible to deploy a configuration that under-pays Banker bets to a degrading degree.**

***

### Limits

| Parameter                | Value                                          |
| ------------------------ | ---------------------------------------------- |
| Minimum bet              | 3 USD                                          |
| Banker payout multiplier | 1.95× default, configurable in \[1.00×, 2.00×] |
| Maximum profit per bet   | Set per deployment (`maxProfitUsd`)            |
| Cancel timeout           | 30 seconds minimum                             |

Supported collaterals: **USDC**, **WETH**, **$OVER**.

***

### Punto Banco rules in plain text

After the initial four cards:

1. If either Player or Banker has a **natural 8 or 9**, the hand stands. No third cards.
2. Otherwise, **Player rule**: Player draws if total is 0–5, stands on 6–7.
3. **Banker rule** (depends on whether Player drew, and on Player's third card):
   * If Player stood: Banker draws on 0–5, stands on 6–7.
   * If Player drew: Banker's draw rule depends on Banker's current total and the value of Player's third card, per the standard Punto Banco draw chart.
4. Final hand totals are computed (modulo 10), and the higher total wins. Equal totals = Tie.

The full rule logic is implemented in the contract and can be inspected directly. Card values follow the standard convention: 2–9 are face value, 10 / J / Q / K count as 0, Ace counts as 1.

***

### User guide

#### 1. Open the Baccarat table

Select **Baccarat** from the casino lobby.

> *\[Screenshot — Baccarat lobby tile]*

#### 2. Place your stake

Choose your collateral, enter your stake, and click on the **PLAYER**, **BANKER** or **TIE** betting area.

> *\[Screenshot — bet placement on Player/Banker/Tie]*

#### 3. Confirm the bet

Sign the transaction. The bet enters `PENDING` while waiting for Chainlink VRF to fulfill.

> *\[Screenshot — pending bet]*

#### 4. Cards are dealt and resolved

When the random word arrives, the entire hand plays out at once: initial four cards, third-card draws (if applicable), final totals, and the winner. The cards and result are revealed in your bet UI.

> *\[Screenshot — hand reveal with Player and Banker totals]*

#### 5. Payout

If you won, your payout is transferred in the same transaction that resolved the hand. If your Player or Banker bet pushed because of a Tie, your stake is refunded. The full result is in your bet history and on-chain.

> *\[Screenshot — resolved hand with payout]*

***

### Why this matters

Baccarat is one of the simpler casino games — but it's also one of the most heavily abused by predatory operators, especially around variable Banker commissions and "house rule" surprises. Overtime makes that impossible:

* **The Banker payout multiplier is a public number.** You can read it from the contract before you bet.
* **The cap is welded in.** The owner cannot drop it below 1.00× or push it above 2.00×.
* **The third-card rules are code, not house policy.** They cannot be adjusted between hands.
* **The cards do not exist until Chainlink generates the random word.** No pre-shuffled shoe. No operator-chosen sequence.

***

### Free bets

Baccarat supports `placeBetWithFreeBet` for users with an Overtime free-bet balance. The mechanics are identical, and resolution flows through the existing free-bets infrastructure.


# Three Card Poker

Three cards each, you versus the dealer. Decide whether your hand is worth playing, with an optional Pair Plus side bet that pays on its own regardless of the dealer. Two VRF requests keep the dealer's hand genuinely hidden.

***

### How it works

Overtime Three Card Poker uses a two-stage VRF flow so the dealer's cards are not on-chain before you decide:

1. **Place bet** - you post an **Ante**, and optionally a **Pair Plus** side bet. The contract requests its first VRF word and deals you **three cards**. (If you played Pair Plus, it settles right here, off your own three cards.)
2. **Play or Fold** - having seen your hand, you choose to **Play** (matching your Ante with a Play bet) or **Fold** (surrendering the Ante). If you Play, the contract requests a second VRF word, deals the **dealer's three cards**, compares hands, and resolves.

The dealer's cards are drawn from the *second* VRF request - they literally do not exist in contract storage while you're deciding whether to Play or Fold. This closes the door on any `eth_getStorageAt` exploit where a sophisticated player could read the dealer's hand before committing.

***

### Hand rankings (3-card)

Three-card poker uses its own ranking order, because probabilities differ with only three cards. Notably, **a straight beats a flush** here - straights are rarer than flushes in three-card hands:

1. Straight Flush (highest)
2. Three of a Kind
3. Straight
4. Flush
5. Pair
6. High Card (lowest)

***

### The dealer qualifier

The dealer must have **Queen-high or better** to qualify.

* **Dealer doesn't qualify** → your Ante pays even money and your Play bet pushes (returned).
* **Dealer qualifies, you win** → both Ante and Play pay even money (1:1).
* **Dealer qualifies, you lose** → both Ante and Play are lost.
* **Tie** → push.

***

### Ante Bonus

The Ante Bonus pays on strong hands **regardless of the dealer** - even if you lose the hand or the dealer doesn't qualify. It's a pure bonus on top of the Ante, paid on:

| Hand            | Ante Bonus |
| --------------- | ---------- |
| Straight Flush  | 5:1        |
| Three of a Kind | 4:1        |
| Straight        | 1:1        |

***

### Pair Plus (optional side bet)

Pair Plus is bet at the start and resolves entirely off your own three cards - the dealer is irrelevant. It wins if you're dealt a pair or better:

| Hand            | Pair Plus payout |
| --------------- | ---------------- |
| Straight Flush  | 40:1             |
| Three of a Kind | 30:1             |
| Straight        | 6:1              |
| Flush           | 4:1              |
| Pair            | 1:1              |
| High card       | Loss             |

Pair Plus settles at the deal (the first VRF request), before you even decide to Play or Fold. Both paytables are locked in the contract and calibrated for a guaranteed house edge of at least 2%.

***

### Limits

| Parameter        | Value                                                      |
| ---------------- | ---------------------------------------------------------- |
| Minimum bet      | 3 USD (configurable per game via core)                     |
| Dealer qualifier | Queen-high or better                                       |
| Ante Bonus       | SF 5:1 / Trips 4:1 / Straight 1:1                          |
| Pair Plus        | SF 40:1 / Trips 30:1 / Straight 6:1 / Flush 4:1 / Pair 1:1 |
| Cancellation     | Admin/resolver only                                        |

Supported collaterals: **USDC**, **WETH**, **$OVER**. Free bets are supported through a dedicated `placeBetWithFreeBet` entry point - but **Pair Plus cannot be played with a free bet** (the side-bet stake can't be cleanly settled through the free-bet system).

***

### User guide

#### 1. Open Three Card Poker

Select **Three Card Poker** from the casino lobby.

#### 2. Place Ante (and optional Pair Plus)

Set your Ante. Optionally add a Pair Plus side bet. Choose collateral and confirm.

#### 3. See your three cards

The first VRF request deals your hand. If you played Pair Plus, you'll see it settle immediately based on your three cards.

#### 4. Play or Fold

Decide whether your hand is worth matching your Ante. Play to continue to the dealer; Fold to surrender the Ante.

#### 5. Dealer reveal and resolution

If you Play, the second VRF request deals the dealer's hand. Hands are compared, the qualifier is checked, the Ante Bonus is applied, and everything resolves in one transaction.

***

### Why this matters

The whole game hinges on a single information asymmetry: you decide whether to Play *before* you see the dealer's hand. If the dealer's cards were sitting in contract storage during your decision, a determined player could read them and never lose - and the game would be broken. Overtime's two-VRF design means the dealer's hand is generated only after you commit, from an independent random word. The qualifier, the rankings, the Ante Bonus, and the Pair Plus paytable are all fixed in code. You get exactly the game you think you're playing.


# Ultimate Texas Hold'em

Heads-up Texas Hold'em against the dealer, with the twist that defines the game: the earlier you commit to your hand, the bigger you're allowed to raise. Staged VRF reveals keep every unseen card out of storage until you've acted.

{% content-ref url="/spaces/qSlj8vWOOVBuhXhcN6iy/pages/NZrywrDfHMp3ldl3BIfA" %}
[OVERTIME CASINO](/overtime-casino/introduction-to-overtime-casino)
{% endcontent-ref %}

***

### How it works

You post two equal bets up front, an **Ante** and a **Blind,** and then play out a hand of Hold'em against the dealer across three decision points. At each one, you can raise once (and only once per hand); the size you're allowed depends on how early you act:

1. **Pre-flop** (you've seen only your two hole cards): raise **3× your ante**, or check.
2. **Post-flop** (you've seen the flop) only if you checked pre-flop: raise **2× your ante**, or check.
3. **Post-river** (all five community cards are out) only if you've checked all the way: raise **1× your ante**, or fold.

Once you raise, you're done raising. The earlier you're confident enough to commit, the more you can put behind your hand, which rewards reading a strong hole-card start.

Each decision triggers a **separate Chainlink VRF request** for the cards it reveals. The flop doesn't exist until you act pre-flop; the turn and river don't exist until you act post-flop; the dealer's hole cards aren't drawn until showdown. Future cards are never sitting in contract storage while you decide, which blocks any attempt to read them via `eth_getStorageAt` and act on them.

***

### How the bets resolve

After the river, your best five-card hand is compared to the dealer's. The three bets settle independently:

**Ante** - the dealer must qualify (have at least a pair) for the Ante to be in play:

* Dealer doesn't qualify → Ante pushes (returned)
* You win → Ante pays 1:1
* Dealer wins → Ante lost

**Play** (your raise) — resolves on hand comparison regardless of dealer qualification:

* You win → Play pays 1:1
* Tie → Play pushes
* Dealer wins → Play lost

**Blind** — pays only when you win, on a bonus scale based on your hand strength. On a tie it pushes; on a loss it's lost. Below a Straight, a winning Blind simply returns your stake.

| Winning hand       | Blind payout      |
| ------------------ | ----------------- |
| Royal Flush        | 500:1             |
| Straight Flush     | 50:1              |
| Four of a Kind     | 10:1              |
| Full House         | 3:1               |
| Flush              | 1:1               |
| Straight           | 1:1               |
| Less than Straight | Push (stake back) |

These are the standard Vegas / Shuffle Master Ultimate Texas Hold'em rules, with the Flush Blind payout set to 1:1 for margin.

***

### Limits

| Parameter        | Value                                          |
| ---------------- | ---------------------------------------------- |
| Minimum bet      | 3 USD (configurable per game via core)         |
| Ante / Blind     | Equal, posted at start                         |
| Max raise        | 3× ante (pre-flop), 2× (post-flop), 1× (river) |
| Blind top payout | 500:1 (Royal Flush)                            |
| Dealer qualifier | Pair or better (affects Ante only)             |
| Cancellation     | Admin/resolver only                            |

Supported collaterals: **USDC**, **WETH**, **$OVER**. Free bets supported via the `isFreeBet` flag — Ante/Blind and all raises route through the free-bet system.

***

### User guide

#### 1. Open Ultimate Texas Hold'em

Select it from the casino lobby. Set your Ante (the Blind matches it automatically) and your collateral.

#### 2. See your hole cards, decide pre-flop

The first VRF request deals your two hole cards. Raise 3× now if you like your start, or check to see the flop.

#### 3. Post-flop decision (if you checked)

The flop is dealt by the next VRF request. Raise 2×, or check to see the turn and river.

#### 4. River decision (if you checked through)

The turn and river complete the board. Make your final call: raise 1×, or fold.

#### 5. Showdown

The dealer's hole cards are revealed by the final VRF request, hands are compared, and the Ante, Play, and Blind all settle in one transaction.

***

### Why this matters

Ultimate Texas Hold'em lives or dies on information ordering. The strategy is built entirely around acting before you've seen the next card — that's why an early raise is allowed to be bigger. If the unseen cards were readable from contract storage during your decision, the entire strategic structure collapses. Overtime's staged VRF means each card is generated only when the game needs to show it to you, from an independent verifiable random word. The dealer's hole cards come last, at showdown, and never exist before that. You play the same game a Vegas table offers — except you can verify the deck was never stacked.


# Bonus Texas Hold'em

A Casino Hold'em / Texas Hold'em Bonus variant against the dealer, where you can keep raising at every street and an optional Bonus side bet pays on your starting two cards alone. Staged VRF reveals keep unseen cards genuinely hidden.

***

### How it works

You post an **Ante** (required) and optionally a **Bonus** side bet. Then you play a hand of Hold'em against the dealer, with a decision at every street:

1. **Pre-flop** (you've seen your two hole cards): **Play 2× your ante**, or fold.
2. **Flop** (after the first three community cards): optionally raise **1× your ante**, or check.
3. **Turn** (after the fourth card): optionally raise **1×**, or check.
4. **River** (after the fifth card): optionally raise **1×**, or check.

Unlike Ultimate Texas Hold'em - where you raise once and you're done - Bonus Hold'em lets you keep adding 1× raises at the flop, turn, and river after you've committed to playing pre-flop. There is **no dealer qualification** in this variant.

Cards are revealed in stages, each by its own Chainlink VRF request: the flop isn't drawn until you've played pre-flop, the turn until you act on the flop, and so on. The dealer's hole cards come last. Nothing you haven't seen is ever sitting in contract storage while you decide - which blocks `eth_getStorageAt` peeking.

***

### How the bets resolve

After the river, your best hand is compared to the dealer's.

**Ante** - pays 1:1 only when your final hand is a **Straight or better** *and* you win; otherwise it pushes on a player win. A tie pushes all main-game bets; a dealer win loses them.

**Play and raises** (pre-flop Play 2×, plus any Flop / Turn / River 1× raises) - each pays 1:1 on a player win, pushes on a tie, and loses on a dealer win.

The "Straight or better for the Ante to pay" rule is what makes the Ante a genuine bonus on premium hands rather than an automatic even-money win.

***

### Bonus side bet

The Bonus bet resolves entirely off the **player's and dealer's hole cards** - it's about the quality of the starting hands, independent of the board or who wins. It pays on premium starting combinations:

| Starting hand       | Bonus payout |
| ------------------- | ------------ |
| AA vs AA            | 499:1        |
| Pair of Aces (AA)   | 30:1         |
| A-K suited          | 25:1         |
| A-Q / A-J suited    | 20:1         |
| A-K offsuit         | 15:1         |
| KK / QQ / JJ        | 10:1         |
| A-Q / A-J offsuit   | 5:1          |
| Pair, 22 through TT | 3:1          |
| Anything else       | Loss         |

The top "AA vs AA" tier is capped at 499:1 (net) to match the project-wide 500× ceiling shared with Video Poker's Royal Flush and Ultimate Hold'em's Blind.

***

### Limits

| Parameter                  | Value                                           |
| -------------------------- | ----------------------------------------------- |
| Minimum bet                | 3 USD (configurable per game via core)          |
| Pre-flop Play              | 2× ante                                         |
| Flop / Turn / River raises | 1× ante each, optional                          |
| Ante pays                  | 1:1 on Straight-or-better player win, else push |
| Dealer qualifier           | None                                            |
| Bonus top payout           | 499:1 (AA vs AA)                                |
| Cancellation               | Admin/resolver only                             |

Supported collaterals: **USDC**, **WETH**, **$OVER**. Free bets are supported through a dedicated `placeBetWithFreeBet` entry point - but **the Bonus side bet cannot be played with a free bet** (the side-bet stake can't be cleanly settled through the free-bet system).

***

### User guide

#### 1. Open Bonus Texas Hold'em

Select it from the casino lobby. Set your Ante, optionally add a Bonus side bet, choose collateral.

#### 2. See your hole cards, decide pre-flop

The first VRF request deals your two hole cards. Play 2× to continue, or fold.

#### 3. Flop, Turn, River

Each street's cards are dealt by their own VRF request. At each one you can add a 1× raise or check.

#### 4. Showdown

The dealer's hole cards are revealed by the final VRF request. Hands are compared and the Ante, all your Plays/raises, and the Bonus settle in one transaction.

***

### How it differs from Ultimate Texas Hold'em

Both are heads-up Hold'em against the dealer with staged VRF, but they're different games:

|                  | Ultimate Texas Hold'em                          | Bonus Texas Hold'em                                         |
| ---------------- | ----------------------------------------------- | ----------------------------------------------------------- |
| Raise structure  | One raise only (3× / 2× / 1×, earlier = bigger) | Play 2× pre-flop, then optional 1× at flop, turn, and river |
| Dealer qualifier | Yes (affects Ante)                              | None                                                        |
| Ante pays        | 1:1 on win when dealer qualifies                | 1:1 only on Straight-or-better player win                   |
| Side bet         | Blind (scales with your winning hand)           | Bonus (scales with starting hole cards)                     |

Ultimate rewards committing early with a big single raise. Bonus rewards staying in and adding pressure street by street, and its side bet is a bet on the quality of the hole cards rather than the final hand.

***

### Why this matters

Multi-street Hold'em against a dealer only works if the board and the dealer's hand are genuinely unknown when you decide to keep raising. If the turn or the dealer's hole cards were readable from storage, a player could raise only when guaranteed to win. Overtime's staged VRF generates each street's cards exactly when the game reveals them, from independent verifiable random words, with the dealer's hand drawn last. The paytables - Ante rule, raise structure, and the full Bonus ladder - are fixed in code. You can verify, hand by hand, that nothing was ever stacked against you.


# Quick Games


# Keno

Pick up to 10 numbers from a pool of 80, watch 20 get drawn, and get paid on how many you matched. An ancient lottery game with a fully onchain, verifiable draw.

***

### How it works

1. You pick between **1 and 10 numbers** from the pool of 80, and place your bet
2. The contract reserves the worst-case payout and requests one random word from Chainlink VRF
3. On fulfillment, the contract draws **20 unique numbers** from the 80 using a partial Fisher-Yates shuffle seeded entirely by that one random word
4. Your payout is `bet × paytable[picks][hits]`, where `hits` is how many of your picked numbers appeared in the 20 drawn

A single 256-bit random word carries enough entropy to perform all 20 draws — the contract slices the word into chunks (16 bits per swap) and re-hashes once partway through to complete the shuffle. The draw is uniform and unbiased; the bias on any individual swap is under 0.04%.

Your picks and the drawn numbers are both stored as compact bitmasks, so the entire game state — what you picked, what came up, how many you hit - is on-chain and verifiable.

***

### Payouts

Keno's payout depends on **how many numbers you picked** and **how many you hit**. More picks means each individual hit is rarer, so the multipliers climb steeply. Each pick count has its own paytable.

Default top-end payouts (multiplier on bet) by pick count:

| Picks | Hit all? | Top multiplier | Approx. RTP |
| ----- | -------- | -------------- | ----------- |
| 1     | 1/1      | 3.92×          | 98.0%       |
| 2     | 2/2      | 10×            | 98.1%       |
| 3     | 3/3      | 50×            | 97.1%       |
| 4     | 4/4      | 80×            | 97.7%       |
| 5     | 5/5      | 80×            | 97.3%       |
| 6     | 6/6      | 100×           | 97.9%       |
| 7     | 7/7      | 250×           | \~97%       |
| 8     | 8/8      | 300×           | \~97.8%     |
| 9     | 9/9      | 300×           | \~97.6%     |
| 10    | 10/10    | 300×           | \~97%       |

Lower hit counts on higher pick selections pay smaller multiples, and the very lowest hit counts pay nothing - the paytables are calibrated so most of the return comes from the middle of the range (3–6 hits), where the probability actually lives.

All multipliers are hard-capped at **300×**. Hitting all 10 of a Pick-10 is astronomically rare (probability ≈ 1.12 × 10⁻⁷), so the cap barely affects the real RTP - the bulk of expected value sits in the common outcomes.

Every paytable is calibrated to a house edge in the **1.9% to 3.1%** range per pick count, and you can read each one off-chain (`getPaytable(picks)`) to verify it yourself.

***

### Limits

| Parameter          | Value                                  |
| ------------------ | -------------------------------------- |
| Minimum bet        | 3 USD (configurable per game via core) |
| Pool size          | 80 numbers                             |
| Numbers drawn      | 20                                     |
| Picks per bet      | 1 to 10                                |
| Maximum multiplier | 300× (hard cap)                        |
| House edge         | \~1.9%–3.1% per pick count             |
| Cancellation       | Admin/resolver only                    |

Supported collaterals: **USDC**, **WETH**, **$OVER**. Free bets supported via the `isFreeBet` flag on `placeBet`.

***

### User guide

#### 1. Open Keno

Select **Keno** from the casino lobby. You'll see the 80-number grid.

#### 2. Pick your numbers

Tap between 1 and 10 numbers. The interface shows the live paytable for your current pick count, so you can see exactly what each hit count pays before you commit.

#### 3. Set your stake and play

Enter your stake, choose your collateral, and confirm. The bet enters pending while the draw is generated.

#### 4. The draw

When the VRF callback arrives, 20 numbers light up across the grid. Your matched numbers are highlighted, and your hit count and payout are computed instantly.

#### 5. Payout

Winnings are transferred in the same transaction that resolves the draw. The full result — your picks, the 20 drawn numbers, your hit count, and the multiplier — is recorded on-chain.

***

### Why this matters

Keno is the highest-house-edge game in most physical casinos, often running 25–35% against the player - precisely because the draw is opaque and the paytables are tuned in the operator's favor without disclosure. Overtime inverts both problems. The 20-number draw comes from a single verifiable Chainlink VRF word using a transparent shuffle, and the paytables are published on-chain and capped to a house edge under \~3%. You can compute the exact expected value of any pick count from public data. A Keno game you can actually verify is, historically, a genuinely unusual thing.


# HI-LO

Guess whether the next card lands above or below 8, build a multiplier with every correct call, and cash out before you're wrong. A pure nerve game, fully onchain.

***

### How it works

Overtime Hi-Lo is a streak game played against a fixed reference point: the card **8**.

1. You place a bet and make your first guess in one transaction - **Above** or **Below**
2. The contract requests a random word from Chainlink VRF and draws a card from a 52-card deck
3. If the card's rank is on the side you guessed, your running multiplier grows. If it's wrong, you lose the bet. If it's exactly an 8, it's a push - multiplier unchanged, the run continues
4. After a correct guess, you choose again: guess once more to grow the multiplier, or **cash out** to take `bet × current multiplier`
5. You can keep going until you hit the multiplier cap or guess wrong

The comparison point is always the same. This is not a "higher or lower than the last card" game - every guess is measured against rank 8. The deck splits cleanly: ranks 2 through 7 are **below**, ranks 9 through Ace are **above**, and 8 itself is the push. Six ranks each direction means a **6 in 13** chance your guess is correct on any given card.

Cards are drawn fresh each round from the full 52 - there's no card-counting edge, because the deck doesn't deplete.

***

### The multiplier

Every correct guess multiplies your running total by a fixed factor:

```
factor = (12 − 13 × houseEdge) / 6
```

At the default 2% house edge, that's about **1.9567×** per correct guess. The factor is constant - it doesn't change based on which card showed or how long your streak is. Five correct guesses in a row compounds to roughly 1.9567⁵ ≈ 28.6×, which is why the default multiplier cap sits at 25×.

The house edge is configurable within a hard-coded band of **2% to 5%**. You can read the live value (`houseEdgeE18`) and compute the exact per-guess factor before you play.

***

### Cashing out

This is the heart of the game. After any correct guess, your accumulated multiplier is locked in *as long as you stop*. The moment you guess again, you're risking the entire accumulated amount on a 6-in-13 flip.

* **Cash out** → you receive `bet × current multiplier`, the bet resolves, done.
* **Guess again** → correct grows the multiplier; wrong loses everything.

There is no partial cash-out and no insurance. The tension is the product.

***

### Limits

| Parameter                   | Value                                                                        |
| --------------------------- | ---------------------------------------------------------------------------- |
| Minimum bet                 | 3 USD (configurable per game via core)                                       |
| House edge                  | Configurable, 2%–5%                                                          |
| Per-guess multiplier factor | \~1.9567× at 2% edge                                                         |
| Default multiplier cap      | 25× (\~5 consecutive correct guesses)                                        |
| Push                        | Drawing an 8 - multiplier unchanged, run continues                           |
| Cancellation                | Admin/resolver only; refunds original stake, forfeits accumulated multiplier |

Supported collaterals: **USDC**, **WETH**, **$OVER**. Free bets supported via the `isFreeBet` flag on `placeBet`.

***

### User guide

#### 1. Open Hi-Lo

Select **Hi-Lo** from the casino lobby. Set your stake and collateral.

#### 2. Make your first guess

Choose **Above** or **Below**. This places the bet and submits your first guess in a single transaction.

#### 3. See the card

When the VRF callback arrives, the card is revealed. If you were right, your multiplier ticks up and it's your turn again. If wrong, the bet is over.

#### 4. Press or cash out

Decide: guess again to push your multiplier higher, or hit **Cash Out** to bank `bet × multiplier`.

#### 5. Resolution

Cashing out (or guessing wrong, or hitting the cap) resolves the bet. Your full run - every guess, every card, the multiplier after each step - is stored on-chain and shown in your history.

***

### Why this matters

The appeal of Hi-Lo is entirely psychological: the question of whether to press your luck one more time. That only works if you trust that the next card is genuinely random and not weighted against you precisely when your multiplier gets juicy.

On a centralized site, nothing stops the operator from nudging the draw against players sitting on a big multiplier - and you'd never know. On Overtime, each card comes from a fresh Chainlink VRF request that doesn't exist until you commit to the guess. The 6-in-13 odds are fixed by the rank of 8 splitting the deck, the multiplier factor is a published formula, and the whole run is reconstructable from the chain. The only thing deciding whether you win is the card. Which is the entire point.


# Plinko

Drop a chip down an 8-row pin pyramid and watch it bounce into one of nine payout slots. Every bounce is derived from a single Chainlink VRF random word - the path isn't animation, it's math.

***

### How it works

Overtime Plinko is a single-shot game: one bet, one VRF word, one result.

1. You pick a **risk level** - Low, Medium, or High - and place your bet
2. The contract reserves the worst-case payout and requests one random word from Chainlink VRF
3. On fulfillment, the contract takes the **low 8 bits** of the random word. Each bit is one row of pins: a `0` bounces the chip left, a `1` bounces it right
4. The final slot is the number of `1` bits (the "popcount") - a value from 0 to 8, giving 9 possible slots
5. Your payout is `bet × paytable[risk][slot]`

Because the slot is the count of right-bounces across 8 independent coin-flips, the outcome follows a **binomial distribution** - the classic Pascal's-triangle bell curve. The center slots are common; the edge slots are rare.

The outcome weights for the 9 slots are `[1, 8, 28, 56, 70, 56, 28, 8, 1]`, summing to 256. The middle slot (slot 4) is 70× more likely than either edge slot (slot 0 or slot 8). This is not a tunable parameter - it's the mathematics of an 8-row board, and it's the same for every player.

***

### Risk levels and payouts

Each risk level has its own paytable. Higher risk concentrates more of the payout at the rare edge slots and pays less in the common center.

Default paytables (multiplier on your bet):

| Slot (right-bounces) | Probability | Low   | Medium | High |
| -------------------- | ----------- | ----- | ------ | ---- |
| 0 (edge)             | 1/256       | 5.6×  | 13×    | 29×  |
| 1                    | 8/256       | 2.05× | 3×     | 4×   |
| 2                    | 28/256      | 1.05× | 1.2×   | 1.4× |
| 3                    | 56/256      | 1.0×  | 0.7×   | 0.3× |
| 4 (center)           | 70/256      | 0.5×  | 0.4×   | 0.2× |
| 5                    | 56/256      | 1.0×  | 0.7×   | 0.3× |
| 6                    | 28/256      | 1.05× | 1.2×   | 1.4× |
| 7                    | 8/256       | 2.05× | 3×     | 4×   |
| 8 (edge)             | 1/256       | 5.6×  | 13×    | 29×  |

The table is symmetric - landing at slot 0 pays the same as slot 8, because both require the same improbable run of identical bounces.

Low risk gives you frequent small returns and a soft landing in the middle. High risk turns the center into a near-total loss (0.2×) in exchange for a 29× payout on the edges.

***

### The house edge is enforced in the contract

Plinko's paytables are bound by a hard rule: the **weighted RTP across the binomial slot distribution can never exceed 98%**, which guarantees a house edge of at least 2%. This is checked in code (`_checkRtp`) every time a paytable is set - including at deployment and on any owner update. A paytable that would push RTP above 98% reverts with `EdgeFloorBreached`.

This is the inverse of a hidden-RTP slot machine. You can read the full paytable for any risk level off-chain (`getPaytable(risk)`), apply the fixed binomial weights, and confirm the exact house edge yourself before you drop a single chip.

***

### Limits

| Parameter              | Value                                             |
| ---------------------- | ------------------------------------------------- |
| Minimum bet            | 3 USD (configurable per game via core)            |
| Rows / slots           | 8 rows, 9 slots                                   |
| House edge floor       | 2% (enforced - RTP capped at 98%)                 |
| Maximum profit per bet | Set in `CasinoCoreV2` (`effectiveMaxProfitUsd`)   |
| Cancellation           | Admin/resolver only (no mid-game state to cancel) |

Supported collaterals: **USDC**, **WETH**, **$OVER**. Free bets supported via the `isFreeBet` flag on `placeBet`.

***

### User guide

#### 1. Open Plinko

Select **Plinko** from the casino lobby.

#### 2. Pick your risk

Choose Low, Medium, or High. The board's payout slots update to show that risk level's multipliers.

#### 3. Set your stake

Enter your amount and choose your collateral.

#### 4. Drop

Click **Drop**, sign the transaction. The bet enters pending while the contract waits for the VRF callback.

#### 5. Result

When the random word arrives, the chip's full path is revealed bounce-by-bounce, landing in its final slot. Your payout (if any) is transferred in the same transaction. The slot index, multiplier, and payout are in your bet history and on-chain.

***

### Why this matters

The bounce path in a traditional online Plinko is decided by the operator's server and shown to you as a pre-rendered animation. You see a ball "bounce," but the slot was chosen before the first pin. You have no way to know whether the displayed physics matched the actual probability distribution.

On Overtime, the path is the binary expansion of a verifiable random number. The bell curve isn't a claim - it's the arithmetic of counting bits. The RTP isn't a number on a help page - it's bounded in the contract and computable from the public paytable. There is no server deciding where the chip lands.


# Dice

A 20-sided die with a configurable, capped house edge and payouts derived from probability, not from a marketing page.

### How it works

The Overtime Dice contract simulates a fair `d20` (20-sided die). When you place a bet:

1. You pick a **target number** between 1 and 20
2. You pick a direction: **Roll Under** or **Roll Over**
3. The contract requests a random word from Chainlink VRF
4. The result is computed as `(randomWords[0] % 20) + 1`
5. The bet wins if the result lands on the side of the target you chose

The total payout multiplier is derived from a single formula:

```
payoutMultiplier = (1 - houseEdge) / probability
```

That's the entire pricing model. The `houseEdge` is a public state variable, capped at `MAX_HOUSE_EDGE = 5%` and enforced by the contract, the operator cannot set a slot quietly extracting more.

***

### Bet types

#### Roll Under

Pick a target between **2 and 20**. You win if the rolled number is **less than** your target.

* Target = `2` → 1 winning face (only `1` wins) → \~1/20 probability → near-19× payout
* Target = `20` → 19 winning faces (`1`–`19`) → \~19/20 probability → near-1× payout

#### Roll Over

Pick a target between **1 and 19**. You win if the rolled number is **greater than** your target.

* Target = `19` → 1 winning face (only `20` wins) → \~1/20 probability → near-19× payout
* Target = `1` → 19 winning faces (`2`–`20`) → \~19/20 probability → near-1× payout

The target you pick determines both your odds and your payout, deterministically. There is no asymmetry between the contract's quoted multiplier and the math.

***

### Sample payouts (at 1% house edge)

| Bet type   | Target | Win probability | Total return on win |
| ---------- | ------ | --------------- | ------------------- |
| Roll Under | 2      | 5%              | \~19.80×            |
| Roll Under | 11     | 50%             | \~1.98×             |
| Roll Under | 20     | 95%             | \~1.04×             |
| Roll Over  | 1      | 95%             | \~1.04×             |
| Roll Over  | 10     | 50%             | \~1.98×             |
| Roll Over  | 19     | 5%              | \~19.80×            |

The actual `houseEdge` set on the deployed contract is readable directly from chain state. Verify it at any time, it can never silently exceed 5%.

***

### Limits

| Parameter              | Value                                         |
| ---------------------- | --------------------------------------------- |
| Minimum bet            | 3 USD                                         |
| House edge             | Configurable, capped at 5% (`MAX_HOUSE_EDGE`) |
| Maximum profit per bet | Set per deployment (`maxProfitUsd`)           |
| Cancel timeout         | 30 seconds minimum                            |

Supported collaterals: **USDC**, **WETH**, **$OVER**.

***

### User guide

#### 1. Open the Dice table

From the casino lobby, select **Dice**.

> *\[Screenshot — dice game interface]*

#### 2. Choose your direction

Toggle between **Roll Under** and **Roll Over**.

> *\[Screenshot — direction toggle]*

#### 3. Set your target

Drag the slider to your target number. The interface live-updates the win probability and the total payout multiplier as you move it. **The riskier the bet, the higher the multiplier — and the math is exact, not promotional.**

> *\[Screenshot — slider with live multiplier display]*

#### 4. Set your stake

Enter the amount and pick your collateral. The minimum bet is 3 USD equivalent.

> *\[Screenshot — stake entry]*

#### 5. Roll

Click **Roll**, sign the transaction. The bet enters `PENDING` while waiting for the VRF callback.

> *\[Screenshot — pending roll]*

#### 6. Result

When the random word arrives, the d20 result is revealed. If you won, the payout is in your wallet in the same transaction. Your bet history shows the result, the random word and the payout — verifiable on a block explorer.

> *\[Screenshot — resolved roll]*

***

### Why this matters

A traditional Vegas table will not give you its true RTP. A traditional online casino will quote one and reserve the right to change it. **Overtime Dice publishes its house edge as a public state variable, hard-capped on-chain, with a payout formula that is mathematical rather than editorial.**

If the contract ever changes its house edge, it emits a `HouseEdgeChanged` event. Every bettor who comes after sees the new number before they place their stake. There is no fine-print version of the game.

***

### Free bets

Dice supports `placeBetWithFreeBet` for users with an Overtime free-bet balance. The mechanics are identical, pick a target, set a direction, roll, and the contract settles the result through the existing free-bets infrastructure.


# Video Poker

Jacks or Better, the classic. Get five cards, hold the ones you want, draw new ones for the rest, and get paid on your final poker hand. Two VRF requests, one verifiable shoe.

***

### How it works

Overtime Video Poker uses a two-stage VRF flow — one request to deal, one to draw:

1. **Place bet** — you ante up. The contract requests its first VRF word and deals you **five cards**. The hand enters your turn.
2. **Draw** — you choose which cards to **hold** (any subset of the five), then submit. The contract requests a second VRF word, replaces every non-held card with a fresh one, evaluates the final five-card hand, and pays out.

Your replacement cards do not exist until you've committed your hold decision. The second VRF request is what generates them — so there's no way for the draw to be pre-determined or for anyone to peek at what you'd draw before you decide what to keep.

The hand is evaluated against the standard Jacks-or-Better paytable. A pair only pays if it's Jacks or better; anything lower is a loss.

***

### Paytable

This is an **8/5 Jacks or Better** machine — meaning Full House pays 8 and Flush pays 5. Multipliers are "for 1" (total return per unit staked on a win):

| Hand                   | Multiplier               |
| ---------------------- | ------------------------ |
| Royal Flush            | 500×                     |
| Straight Flush         | 50×                      |
| Four of a Kind         | 25×                      |
| Full House             | 8×                       |
| Flush                  | 5×                       |
| Straight               | 4×                       |
| Three of a Kind        | 3×                       |
| Two Pair               | 2×                       |
| Jacks or Better (pair) | 1× (stake back — a push) |
| Anything less          | Loss                     |

Under optimal play, this paytable returns about **96.5%**, for a house edge near **3.5%** — better than a standard single-coin machine (which pays Royal at 250 for \~96.15%) and close to the 5-coin variant, but with single-coin simplicity.

A Royal Flush pays 500×, which is also the contract's maximum payout multiplier — every bet reserves `500 × stake` against the bankroll up front, so each bet's worst case is covered at placement. (Reservations are per-bet rather than cumulative; see the architecture page for how the shared treasury and its circuit breaker manage risk across all games.)

***

### Strategy is real

Video Poker is one of the few casino games where your decisions materially change your expected return. Holding the right cards — keeping a low pair over a single high card, chasing a flush draw when the math supports it — is the difference between the 96.5% optimal RTP and something considerably worse. The contract enforces the rules and pays the paytable; the hold decision is entirely yours, and it matters.

***

### Limits

| Parameter      | Value                                  |
| -------------- | -------------------------------------- |
| Minimum bet    | 3 USD (configurable per game via core) |
| Paytable       | 8/5 Jacks or Better, single coin       |
| Maximum payout | 500× (Royal Flush)                     |
| Optimal RTP    | \~96.5% (house edge \~3.5%)            |
| Cancellation   | Admin/resolver only                    |

Supported collaterals: **USDC**, **WETH**, **$OVER**. Free bets supported via the `isFreeBet` flag on `placeBet`.

***

### User guide

#### 1. Open Video Poker

Select **Video Poker** from the casino lobby. Set your stake and collateral.

#### 2. Deal

Click **Deal**, sign the transaction. The first VRF request deals your five cards.

#### 3. Hold

Tap the cards you want to keep. The paytable is on screen so you can see what each potential hand pays.

#### 4. Draw

Submit your hold. The second VRF request replaces your non-held cards, the final hand is evaluated, and the result is shown.

#### 5. Payout

If your final hand is Jacks-or-Better or higher, your payout is transferred in the same transaction. The initial deal, your hold mask, the final hand, and the hand class are all recorded on-chain.

***

### Why this matters

Every online Video Poker machine asks you to trust that the deck is fair and the draw isn't rigged against a hand that's one card away from a Royal. Overtime's two-stage VRF means your draw cards are generated *after* you lock your holds, from an independent verifiable random word. The deck isn't a server-side object you can't see — it's the deterministic consequence of two Chainlink random words, and the paytable that decides your payout is a set of public constants in the contract. The strategy is yours; the fairness is verifiable.


# Slots

A 3-reel slot machine with weighted symbols, configurable payouts, and a verifiably-onchain RTP you can compute yourself before you spin.

### How it works

The Overtime Slots contract implements a 3-reel slot machine. When you spin:

1. You stake an amount in your chosen collateral
2. The contract requests a random word from Chainlink VRF
3. From the random word, three reels are sampled independently using the configured `symbolWeights`
4. The result is checked against the pay table:
   * **Triple** (all three reels match) → pays the symbol's `triplePayout` multiplier
   * **Adjacent pair** (reels 1+2 match, or reels 2+3 match) → pays the symbol's `pairPayout` multiplier
   * Otherwise → no payout
5. If you won, the payout is transferred immediately

Every component of this is configurable per deployment, and every component is **public state**.

***

### What's onchain

| Parameter             | What it is                                                                                  |
| --------------------- | ------------------------------------------------------------------------------------------- |
| `symbolCount`         | Number of distinct symbols on the reels                                                     |
| `symbolWeights[i]`    | Weight of symbol `i` in the reel sampling distribution                                      |
| `symbolWeightsTotal`  | Cached sum of weights (probability of symbol `i` = `symbolWeights[i] / symbolWeightsTotal`) |
| `triplePayout[i]`     | Payout multiplier for three of symbol `i`                                                   |
| `pairPayout[i]`       | Payout multiplier for an adjacent pair of symbol `i`                                        |
| `maxPayoutMultiplier` | Cap used to size the bankroll reservation                                                   |
| `houseEdge`           | Public state variable, capped at `MAX_HOUSE_EDGE = 5%`                                      |

You can read every one of these directly from the contract. The probability of any outcome is a pure function of these public variables, meaning the **expected return-to-player (RTP) of the slot is something you can calculate yourself before staking a single token**.

***

### Why this is unusual

Most online slots ask you to trust an RTP figure printed in the game info modal. There is no way to verify it. Even regulated jurisdictions only require periodic audits, not real-time verifiability.

Overtime Slots is the inverse:

* **The RTP is computable from public state.** Anyone can sum `weight × payout` across all winning combinations and compare to the stake.
* **The house edge is hard-capped at 5%.** The contract structurally cannot be configured to extract more.
* **Any payout-table change emits an event.** Every spin from that block onward uses the new table, and every spinner can read it before they spin.

***

### Limits

| Parameter               | Value                                         |
| ----------------------- | --------------------------------------------- |
| Minimum bet             | 3 USD                                         |
| House edge              | Configurable, capped at 5% (`MAX_HOUSE_EDGE`) |
| Maximum profit per spin | Set per deployment (`maxProfitUsd`)           |
| Cancel timeout          | 30 seconds minimum                            |

Supported collaterals: **USDC**, **WETH**, **$OVER**.

***

### User guide

#### 1. Open the Slots machine

Select **Slots** from the casino lobby. The pay table is visible in the interface and matches the on-chain configuration exactly.

> *\[Screenshot — Slots interface with visible pay table]*

#### 2. Set your stake and collateral

Choose your collateral, enter your stake amount.

> *\[Screenshot — stake entry]*

#### 3. Spin

Click **Spin** and sign the transaction. The spin enters `PENDING` while waiting for the VRF callback.

> *\[Screenshot — pending spin]*

#### 4. Result

When the random word arrives, all three reels resolve at once. The contract checks for a triple match, then for adjacent pairs, and pays out accordingly.

> *\[Screenshot — resolved spin with reel result]*

#### 5. Payout

Winning spins transfer the payout to your wallet in the same transaction. The result, the random word and the payout are all in your bet history and on a block explorer.

> *\[Screenshot — winning spin with payout]*

***

### How to verify RTP yourself

Want to confirm the slot's RTP before you stake? At a high level:

1. Read `symbolCount`, `symbolWeights[]`, `triplePayout[]`, `pairPayout[]` from the contract
2. Compute the probability of each outcome:
   * Triple of symbol `i`: `(weight[i] / total)^3`
   * Adjacent pair of `i` (positions 1+2 or 2+3, third reel anything else): `2 × (weight[i] / total)^2 × ((total - weight[i]) / total)`
3. Multiply each probability by the corresponding payout multiplier
4. Sum across all symbols → that's the expected return per unit staked

The complement of that sum is the effective house edge.

You don't have to take Overtime's word for it. You don't have to trust an audit firm. You can read the chain.

***

### Free bets

Slots supports `placeBetWithFreeBet` for users with an Overtime free-bet balance. Mechanics are identical, and free-bet wins are settled through the existing Overtime free-bets infrastructure.


# Casino Affiliate

## Become an Overtime Casino Affiliate

Every casino contract on Overtime has affiliate revenue baked into the bet flow. You can earn **up to 20% of generated fees** from any user you refer, paid programmatically, by the contract, in the same transaction as the user's losing bet.

There is no application form, no monthly statement, no minimum payout threshold, no "review" step where the operator decides how much you earned. The smart contract is the affiliate manager.

***

### How it works

Every game contract (Roulette, Dice, Blackjack, Baccarat, Slots) has an `IReferrals` integration baked in. When a user places a bet, they can pass a `_referrer` address as a parameter:

```solidity
function placeBet(
    address collateral,
    uint amount,
    BetType betType,
    uint8 selection,
    address _referrer    // ← your affiliate wallet
) external;
```

The first time a user bets with your address as the referrer, the Overtime referrals registry **registers the relationship permanently for that user**. From that point on, every losing bet that user makes — across **every** Overtime Casino game, automatically pays out your share, in the same collateral and transaction.

When a user wins, the contract pays the user. When a user loses, the contract pays your referral share to your wallet, then keeps the rest as bankroll.

The relevant contract code:

```solidity
function _payReferrer(address _user, address _collateral, uint _amount) internal {
    if (address(referrals) == address(0)) return;
    address referrer = referrals.referrals(_user);
    if (referrer == address(0)) return;
    uint referrerFee = referrals.getReferrerFee(referrer);
    if (referrerFee == 0) return;
    uint referrerAmount = (_amount * referrerFee) / ONE;
    if (referrerAmount > 0) {
        // transfer the cut, emit event
    }
}
```

Every successful affiliate payout emits a `ReferrerPaid(referrer, user, amount, betAmount, collateral)` event. You can index it. You can verify every cent.

***

### How to set up

#### 1. Get a wallet to receive payouts

Use any EVM wallet that supports Base, Optimism and Arbitrum (the chains the Casino contracts are deployed on). This is the address Overtime will pay your share to.

#### 2. Generate a referral link

The Overtime frontend supports referral links of the form:

```
https://overtimemarkets.xyz/casino?referrer=0xYOUR_AFFILIATE_ADDRESS
```

Anyone who connects their wallet via your link will be tagged with your address as their referrer when they place their first bet. Once tagged, the relationship persists.

#### 3. Distribute your link

Share it however you reach your audience, Twitter, Discord, Telegram, your blog, an embedded widget, your own custom frontend. Wherever you can drive bettors, plug your referrer address into the `placeBet` calls and earn.

#### 4. (Optional) Embed the contracts in your own product

This is where it gets interesting. **You don't have to use the Overtime frontend to capture the referral revenue.** If you build your own UI, your own bot, your own AI agent that wraps the Overtime contracts, and you pass your referrer address into every bet your product makes on behalf of users, every trade your users take pays you, programmatically, forever.

See Integrate Overtime Casino for the developer guide.

***

### How much you earn

The default referral fee is **up to 20%** of generated fees, configured in the Overtime referrals registry. The exact percentage applied to your address is read at the moment of each bet via `referrals.getReferrerFee(referrer)`.

If a user you referred loses a 100 USDC bet, your share (at 20%) is paid to your wallet in USDC, in the same transaction, with `ReferrerPaid` emitted. No batching. No claim step. No delay.

***

### Why this is structurally different from a traditional affiliate program

Traditional online casino affiliate programs run on the operator's good-faith. Some examples of what those programs *can* do, and have done, that Overtime structurally cannot:

* **Retroactive review.** A trad affiliate program can decide your earnings were "fraud-tagged" months later and claw them back.
* **Negative carryover.** Some affiliate programs roll your account into negative balance when your referred users win big, locking you out of future earnings until the deficit clears.
* **Unilateral fee changes.** A trad operator can drop your % from 30 to 5 with notice, or sometimes without.
* **Frozen accounts.** A trad operator can suspend your account during payout review, indefinitely.
* **Geo-restrictions on your referrals.** Some programs disallow specific markets after the fact, voiding earnings.

The Overtime contracts don't have most of these levers. The referrer fee paid on each bet is calculated and transferred inside the bet's resolution transaction. There's no centralized statement to review. There's no operator approving payouts. The contract pays, the event emits, and it's settled.

The fee percentage *is* a parameter the Overtime referrals registry can change for new bets going forward. But it cannot be changed retroactively — past `ReferrerPaid` events stand permanently.

***

### Best practices

* **Use one consistent referrer address across your distribution channels** so all your traffic accrues to the same wallet.
* **Index `ReferrerPaid` events** to build your own dashboard. The Overtime subgraph indexes them, but you can also self-host an indexer over the Casino contracts if you want full control.
* **Be transparent with your audience.** Onchain settlement means anyone can verify your address received payouts. That's a feature, turn it into a credibility signal.
* **Don't promise outcomes you can't deliver.** Never represent gambling as risk-free. Make sure your audience understands the games involve financial risk.
* **Comply with your local laws.** Promoting gambling content has different rules in different jurisdictions. The contracts don't enforce that for you.

***

### Frequently asked

**Do I need to apply or be approved?** No. Pass any address as the `_referrer` parameter on a bet, and the Overtime referrals registry will tag the user. Your payouts begin from that user's next losing bet.

**Can my % be changed without my consent?** The fee is configured in the central referrals registry and can be updated for new bets going forward. Past payouts are permanent.

**What if my referred user only ever wins?** Then you don't earn anything from them — the referrer fee is paid on losing bets. (You also don't lose anything: there's no negative carryover.)

**Can I refer myself?** Technically the contract does not prevent you from passing your own address as `_referrer` on a bet from another wallet you control. Whether that's allowed by the protocol's terms of service or by your local law is your responsibility — the contracts don't police it.

**Is there a payout minimum?** No. Every losing bet that triggers a non-zero referral fee is settled immediately, in the same transaction, in the bet's collateral.


# Casino Integration

The five Overtime Casino contracts are not a backend behind a proprietary UI. They are not a gated SDK. They are public, deployed, and callable by any wallet: yours, your users', or an AI agent's.

This page is for developers, vibe coders and AI agents who want to wrap the contracts in their own product. Whether you're building a Telegram bot, a Farcaster Frame, a custom skinned frontend, an AI agent that plays Blackjack on its own terms, or a niche-language UI for a community Overtime hasn't reached, everything you need is in the repo.

***

### TL;DR for the impatient

* **Contracts:** [`github.com/thales-markets/contracts-v2`](https://github.com/thales-markets/contracts-v2), in `contracts/core/Casino/` five Solidity files, MIT-licensed, \~5k lines total.
* **Networks:** Base, Optimism, Arbitrum.
* **Collaterals:** USDC, WETH, $OVER.
* **Randomness:** Chainlink VRF v2.5 (`IVRFCoordinatorV2Plus`).
* **Each game = one contract.** Same shape:&#x20;
  * `placeBet` → `requestRandomWords` → `rawFulfillRandomWords` → resolved.
* **Pass a `_referrer` address** on every bet you make on behalf of users to capture up to 20% of generated fees automatically.
* **Free bets supported** via `placeBetWithFreeBet` against the existing Overtime `IFreeBetsHolder`.

***

### A note for AI agents and vibe coders: use Eth Skills

If you're an AI agent, or you're prompting one, building on Ethereum, the best starting point isn't this page or even the Overtime repo. It's [**ethskills.com**](https://ethskills.com/).

ETHSKILLS is an open library of skill files that fix the things LLMs get wrong about Ethereum out of the box. Stale gas prices. Hallucinated contract addresses. Outdated patterns. Wrong terminology ("on-chain" vs "onchain"). It's structured as fetch-on-demand markdown files an agent can pull at runtime.

Recommended skills to read before integrating with Overtime Casino:

* [**`ethskills.com/SKILL.md`**](https://ethskills.com/SKILL.md): table of contents and overall framing
* [**`ethskills.com/tools/SKILL.md`**](https://ethskills.com/tools/SKILL.md): current tooling (Foundry, Scaffold-ETH 2, abi.ninja, MCPs)
* [**`ethskills.com/standards/SKILL.md`**](https://ethskills.com/standards/SKILL.md): ERC-20, EIP-7702, ERC-8004 (agent identity)
* [**`ethskills.com/orchestration/SKILL.md`**](https://ethskills.com/orchestration/SKILL.md): three-phase build pattern (localhost → live testnet → production)
* **The Chainlink VRF skill in cryptoskills.dev**, VRF v2.5 specifics, subscription management, callback patterns

Bootstrap your project with `npx create-eth@latest` if you want a working Scaffold-ETH 2 frontend wired to a local hardhat fork in 60 seconds. Then point it at the Casino contracts.

The rest of this guide assumes you have basic web3 tooling set up. If you don't, the Eth Skills route will get you there faster than reading 50 docs pages.

***

### Repository layout

```
contracts-v2/
└── contracts/
    └── core/
        └── Casino/
            ├── Roulette.sol     # 6 bet types, up to 10 picks per spin
            ├── Dice.sol         # d20, ROLL_OVER / ROLL_UNDER
            ├── Blackjack.sol    # state machine, hit/stand/double/split
            ├── Baccarat.sol     # Player/Banker/Tie, full Punto Banco
            └── Slots.sol        # 3-reel, configurable symbols/payouts
```

Each file is self-contained, written in Solidity 0.8.20, follows OpenZeppelin upgradeable patterns (`Initializable`, `ProxyOwned`, `ProxyPausable`, `ProxyReentrancyGuard`), and has `@notice` natspec on virtually every public function.

***

### The shape every Casino contract shares

This is the part worth internalizing. Once you understand the lifecycle of one contract, you understand all five.

#### Public entry points

```solidity
// Place a real-money bet
function placeBet(
    address collateral,    // USDC, WETH, or $OVER
    uint amount,           // collateral amount, in token-native decimals
    /* game-specific args (bet type, selection, target, etc.) */
    address _referrer      // your affiliate wallet, or address(0)
) external returns (uint betId, uint requestId);

// Place a bet using the user's free-bet balance
function placeBetWithFreeBet(
    address collateral,
    uint amount,
    /* game-specific args */
) external returns (uint betId, uint requestId);

// Cancel a stuck bet after cancelTimeout
function cancelBet(uint betId) external;
```

Roulette additionally exposes `placeMultiBet` and `placeMultiBetWithFreeBet` for multi-pick spins; Blackjack exposes per-action entrypoints (`hit`, `stand`, `doubleDown`, `split`) on top of the initial `placeBet` (named `deal` in some flows).

#### Internal lifecycle

```
user calls placeBet
  ├─ pulls collateral via safeTransferFrom
  ├─ validates selection / target / pick list
  ├─ computes worst-case payout, reserves it against bankroll
  ├─ calls vrfCoordinator.requestRandomWords(...)
  ├─ stores Bet struct, status = PENDING
  └─ emits BetPlaced(betId, requestId, user, collateral, amount, ...)

[time passes — Chainlink generates randomness]

vrfCoordinator calls rawFulfillRandomWords(requestId, randomWords[])
  ├─ msg.sender check: only vrfCoordinator can call this
  ├─ derives game outcome from randomWords[0]
  ├─ updates bet status = RESOLVED
  ├─ transfers payout (if won), pays referrer (if lost)
  └─ emits BetResolved(betId, requestId, user, result, won, payout)
```

That's the whole loop. Every game contract follows it. The only differences are what happens between "derive outcome" and "compute payout", game-specific math.

#### Events you'll want to index

| Event                                                                                   | When it fires                             |
| --------------------------------------------------------------------------------------- | ----------------------------------------- |
| `BetPlaced(betId, requestId, user, collateral, amount, ...)`                            | User places a bet, before VRF callback    |
| `MultiBetPlaced(betId, requestId, user, collateral, totalAmount, pickCount, isFreeBet)` | Roulette only, multi-pick bets            |
| `BetResolved(betId, requestId, user, result, won, payout)`                              | VRF fulfills and bet resolves             |
| `BetCancelled(betId, requestId, user, refundedAmount, adminCancelled)`                  | User or admin cancels a stuck bet         |
| `ReferrerPaid(referrer, user, amount, betAmount, collateral)`                           | Affiliate fee transferred on a losing bet |

For Blackjack, additional events fire for action transitions (`HandActionRequested`, `CardDealt`, etc.). The full event list lives at the bottom of each contract source file.

***

### Quickstart: place a Roulette bet from a TypeScript frontend

```typescript
import { ethers } from "ethers";
import RouletteABI from "./abi/Roulette.json";
import IERC20ABI from "./abi/IERC20.json";

const ROULETTE_ADDRESS = "0x..."; // deployed Roulette address on your target chain
const USDC_ADDRESS    = "0x..."; // USDC on the same chain
const REFERRER        = "0xYOURAFFILIATEWALLET"; // or ethers.ZeroAddress

const provider = new ethers.BrowserProvider(window.ethereum);
const signer   = await provider.getSigner();

const usdc     = new ethers.Contract(USDC_ADDRESS,    IERC20ABI,    signer);
const roulette = new ethers.Contract(ROULETTE_ADDRESS, RouletteABI, signer);

// 1. One-time approval
const stake = 5_000_000n; // 5 USDC (6 decimals)
await (await usdc.approve(ROULETTE_ADDRESS, stake)).wait();

// 2. Place a STRAIGHT bet on number 17
const BetType = { STRAIGHT: 0, RED_BLACK: 1, ODD_EVEN: 2, LOW_HIGH: 3, DOZEN: 4, COLUMN: 5 };
const tx = await roulette.placeBet(USDC_ADDRESS, stake, BetType.STRAIGHT, 17, REFERRER);
const receipt = await tx.wait();

// Extract betId from the BetPlaced event
const event = receipt.logs
  .map(l => { try { return roulette.interface.parseLog(l); } catch { return null; } })
  .find(e => e && e.name === "BetPlaced");
const betId = event.args.betId;

// 3. Wait for resolution by listening for BetResolved
roulette.on("BetResolved", (resolvedBetId, requestId, user, result, won, payout) => {
  if (resolvedBetId === betId) {
    console.log(`Spin result: ${result}, won: ${won}, payout: ${payout}`);
  }
});
```

This is the complete pattern. Substitute the bet type, args and contract address for each game, and the same flow applies.

***

### Quickstart: place a Dice bet from an AI agent (viem)

```typescript
import { createPublicClient, createWalletClient, http, parseAbi } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base } from "viem/chains";

const account = privateKeyToAccount(process.env.AGENT_KEY as `0x${string}`);
const wallet  = createWalletClient({ account, chain: base, transport: http() });
const client  = createPublicClient({ chain: base, transport: http() });

const DICE      = "0x...";
const USDC      = "0x...";
const REFERRER  = "0xYOURAFFILIATEWALLET";

const diceAbi = parseAbi([
  "function placeBet(address collateral, uint256 amount, uint8 betType, uint8 target, address referrer) external returns (uint256, uint256)",
  "event BetResolved(uint256 indexed betId, uint256 indexed requestId, address indexed user, uint8 result, bool won, uint256 payout)",
]);

// ROLL_UNDER 11 = 50% probability
const BetType = { ROLL_UNDER: 0, ROLL_OVER: 1 };

const hash = await wallet.writeContract({
  address: DICE,
  abi: diceAbi,
  functionName: "placeBet",
  args: [USDC, 5_000_000n, BetType.ROLL_UNDER, 11, REFERRER],
});

const receipt = await client.waitForTransactionReceipt({ hash });
// ... parse logs the same way as above
```

For agents specifically, the design is friendly:

* **Each contract is a single-purpose machine.** Small public surface, well-named functions, deterministic behavior.
* **State is queryable.** Read `bets[betId]` (or game-equivalent) to recover any bet's full state at any time.
* **Events are reliable.** Index `BetResolved` to build a "watch and react" loop without polling state.
* **No hidden auth.** No API keys. No login. No CAPTCHA. The wallet *is* the auth.

***

### Reading game configuration from chain

Before you place bets at scale (or expose a slot's RTP to your users), read the relevant configuration directly:

```typescript
// Dice — what's the current house edge?
const houseEdge = await dice.read.houseEdge();
// Returns 1e18-precision; 1e16 = 1%

// Slots — what's the pay table?
const symbolCount = await slots.read.symbolCount();
const weights: bigint[] = [];
const triples: bigint[] = [];
const pairs:   bigint[] = [];
for (let i = 0; i < Number(symbolCount); i++) {
  weights.push(await slots.read.symbolWeights([i]));
  triples.push(await slots.read.triplePayout([i]));
  pairs.push  (await slots.read.pairPayout([i]));
}

// Baccarat — what's the current Banker payout multiplier?
const bankerMul = await baccarat.read.bankerPayoutMultiplier();
// 1.95e18 = 1.95×

// Roulette — what's the maxProfitUsd cap?
const maxProfitUsd = await roulette.read.maxProfitUsd();
```

There is no "pull this from the API and trust the operator." The chain *is* the API.

***

### Free bets

If your product serves users who already have an Overtime free-bet balance, call `placeBetWithFreeBet` (or `placeMultiBetWithFreeBet` in Roulette) instead of `placeBet`. The signature is identical except no collateral pull happens — the contract debits the user's free-bet balance via the existing `IFreeBetsHolder`.

```solidity
function placeBetWithFreeBet(
    address collateral,
    uint amount,
    BetType betType,
    uint8 selection
) external returns (uint betId, uint requestId);
```

Free-bet wins are settled to `freeBetsHolder` automatically. Your frontend doesn't need to do anything special beyond the call itself.

***

### Bankroll, liquidity, and bet sizing

Every Casino contract maintains a **per-collateral bankroll reservation** (`reservedProfitPerCollateral`). When a bet is placed, the contract reserves the worst-case payout against the bankroll. If the bankroll is insufficient at that moment, the bet reverts with `InsufficientAvailableLiquidity`.

For Roulette specifically, multi-pick bets compute the **worst-case net liability across all 37 wheel outcomes**, not the naive sum of all picks' payouts. Mutually exclusive picks (e.g. Dozen 1 + Dozen 2) don't double-reserve. This is implemented in `_worstCaseProfit`. If you write a custom client, mirror this logic when validating bets locally to avoid wasted reverts.

There's also a per-bet `maxProfitUsd` cap, normalized through the Chainlink price feed. Large bets that would exceed it revert with `MaxProfitExceeded`. Your frontend should query `maxProfitUsd` and `getCollateralPrice(collateral)` and gate the user before submission.

***

### Cancellation flow

If a Chainlink VRF callback never arrives (very rare; possible during Chainlink network incidents):

```solidity
function cancelBet(uint betId) external;
```

After `cancelTimeout` (minimum 30 seconds, configurable per game) has passed since the bet was placed, the user can cancel and recover their full stake. Your frontend should expose this as a "Recover stake" button on stuck bets, and ideally hide it behind a 30+ second elapsed-time check so users don't see it on bets that will resolve normally.

There is also `adminCancelBet`, callable only by addresses with the `MARKET_RESOLVING` role on the Overtime manager. Operators (including 3rd-party integrations using their own deployment) can use this for ops emergencies, but **on the canonical Overtime deployment, the user-driven `cancelBet` is the path.**

***

### Pausability

Every contract is `ProxyPausable`. The owner (or addresses with the `TICKET_PAUSER` role) can pause new bets via `setPausedByRole`. **Already-pending bets continue to resolve.** Cancellation paths remain available.

Your frontend should handle the `Paused` revert gracefully and surface a clear "casino paused" state. The pause state itself is readable via `paused()`.

***

### Subgraph and indexing

Overtime maintains a public subgraph that indexes all Casino events across supported chains. If you don't want to run your own indexer, query that. URL and schema are at **docs.overtime.io**.

If you do want your own indexer:

* **Self-host with The Graph node**, Goldsky, Envio, or Ponder
* **Index every contract per chain** (5 contracts × 3 chains = 15 contract instances)
* **Watch for proxy upgrades** — these are upgradeable proxies. Address is stable, but ABI may change. Re-pull ABIs after major version bumps.

***

### Security and operational notes

* **Always validate user input client-side** before submitting bets, wrong selection encodings will revert. The interface clarity (`enum BetType`, `uint8 selection`) is a feature; mirror those types in your frontend.
* **Watch for `requestId == 0` collision**: the contracts use `requestIdToBetId` mapping. A `requestId` of zero is treated as "unknown." This is a Chainlink-side guarantee; just be aware.
* **Reentrancy is handled** by `ProxyReentrancyGuard` on every state-mutating function. You don't need to wrap calls in your own reentrancy protection.
* **The CEI pattern** (Checks → Effects → Interactions) is followed in all resolution paths. Bet status flips to `RESOLVED` *before* payout transfers go out. If a payout transfer fails, the resolution still stands; the user retains a claim against the contract balance.
* **Don't hardcode contract addresses.** Read them from the Overtime documentation site or the deployments JSON in the repo. Addresses can vary per chain. **Never hallucinate**, verify on a block explorer.

***

### Don't like the canonical frontend? Build your own.

This is the point. The contracts are public infrastructure. The frontend at overtimemarkets.xyz is *one* possible interface, not *the* interface.

A few examples of what you can ship in an afternoon:

* **A Telegram bot** that lets users place dice rolls in chat, with their own wallet, your address as referrer
* **A Discord game** that runs Blackjack hands inside a server's casino channel
* **A Farcaster Frame** with a "spin slots" button
* **An AI agent** that plays Blackjack autonomously, sized to a budget, optimizing for variance
* **A specialized roulette UI** for a community that wants different table aesthetics, language localization, custom multi-pick presets
* **An embedded widget** on your existing crypto site that lets your users bet from your platform

Pass your `_referrer` address into every bet, and you capture **up to 20% of generated fees** from every interaction. See Become an Overtime Casino Affiliate for the affiliate side.

***

### Resources

* **Contracts repo:** [github.com/thales-markets/contracts-v2](https://github.com/thales-markets/contracts-v2) → `contracts/core/Casino/`
* **Overtime docs:** [docs.overtime.io](https://docs.overtime.io)
* **Chainlink VRF v2.5 docs:** [docs.chain.link/vrf/v2-5/overview](https://docs.chain.link/vrf/v2-5/overview)
* **Eth Skills (for AI agents and vibe coders):** [ethskills.com](https://ethskills.com/)
* **Scaffold-ETH 2:** `npx create-eth@latest`

The casino is a public utility, we want to see what gets built on top!


# Introduction to Speed Markets

### Speed Markets Application :point\_down:

{% embed url="<https://www.speedmarkets.xyz/>" %}

Digital Options get kicked into overdrive with the **fast-paced excitement of Speed Markets!**  Speed Markets allow users to purchase UP or DOWN positions in **digital options built on short time frames** and **strike prices based on a snapshot of the current price**.  This new product under the Overtime umbrella is the result of [TIP-149](https://github.com/thales-markets/thales-improvement-proposals/blob/main/TIPs/TIP-149.md) and the communities' need for speed!

{% hint style="info" %}
Speed Markets are currently available on:

**Optimism, Arbitrum, and Base**
{% endhint %}

### How Speed Markets work

Typical Positional and Ranged Markets close for positioning when the maturity date/time is less than 24 hours away due to protocol risk management, but some traders couldn't wait on the sidelines for that long.  To satisfy the community Thales developed Speed Markets to **work with nearly instantaneous pricing data**, made possible with the use of [Pyth Benchmarks](https://pyth.network/blog/introducing-the-pyth-benchmarks).&#x20;

Traders choose an asset, direction (UP or DOWN) and strike time for that asset based on the trader's predicted price movement from the asset's current price.  Once a trader submits a transaction to purchase a position, a snapshot of the asset's current price is taken to define the strike price. Because the strike price is always taken from the current price of an asset at the time of a buy, **all positions will have 50:50 implied probabilities**. This means that **a winning trader will see a 2x payout** (minus the quoted LP fee and a fixed 2% Safebox fee) on a single winning position.&#x20;

***

<figure><img src="/files/W3nTLTJNefzYiKZisXIY" alt=""><figcaption></figcaption></figure>

Pyth Benchmark on-demand oracles provide historically queryable prices that can be used to validate trades in near real-time, an important factor for risk management of intraday markets such as Speed Markets.  **Every second, Pyth Benchmark price feeds are updated** using source data from reputable third-party data publishers that can be easily verified from the Pythnet blockchain. &#x20;

### Parameters for Speed Markets&#x20;

The parameters for Speed Markets will be maintained via the Overtime Governance process. Configuration TIPs for considerations like opening the SpeedMarketAMM up for LPing will need to be submitted by the community and voted in by the Thales Council.  Initial funding will be provided by the TreasuryDAO, but future LPing could take it's place to provide liquidity for Speed Markets. &#x20;

* Speed Markets offer a **minimum epoch of 1 minute.**
* The maximum time to maturity will be 24 hours. &#x20;
* ETH and BTC will be the supported assets.
* Speed Markets will include an LP fee that changes depending of a Strike Time and a protocol fee of 2%.

| Strike Time             | LP fee |
| ----------------------- | ------ |
| 1 min - 4 min 59s       | X      |
| 5 min - 9 min 59s       | X      |
| 10 min - 14 min 59s     | 15%    |
| 15 min - 59 min 59 sec  | 13%    |
| 60 min - 119 min 59 sec | 12%    |
| 120 min - 24 h          | 10%    |

* The minimum buy-in will be 3 USD, with a maximum of 200 USD
* The AMM Risk Cap per Asset per Day will begin at 5000 USD.

Positions can be purchased using the several forms of collateral, with the minimum amount of each adjusted to equal 5 USDC.  The following forms of collateral are accepted:

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FBumbqmPN4BNJ9rxleI2T%2Fimage.png?alt=media&token=ad4ff1f7-c68b-46d1-8836-32f8d035318c>" %}

{% hint style="info" %}
Speed Markets on Optimism, Arbitrum and Base also support Multicollateral offramping, meaning you can choose the form of collateral you'd like to receive when claiming a winning position.
{% endhint %}


# Chained Speed Markets

### What are Chained Speed Markets

Chained Speed Markets are the next evolution of classic [Speed Markets](broken://pages/ShvLYDVQNkNAGLafp74y), allowing you to predict multiple sequential price movements in one go for explosive leveraged payouts up to **47x** !

Chained Speed Markets allow you to create a series of **2** to **6 sequential price predictions** with a fixed Strike Time each and with an increasing payout multiplier per each added market. This product has also been voted in by the Thales Governance, under the [TIP-174 Chained Speed Markets](https://github.com/thales-markets/thales-improvement-proposals/blob/main/TIPs/TIP-174.md).

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FEFyDaKNJzBcFW9izzw17%2Fimage.png?alt=media&token=06367dc6-fced-4c8c-8c6c-70f594067c6e>" %}

### How Chained Markets work

#### Deposit and Engage

With [Speed Markets](https://www.speedmarkets.xyz/), we allowed the users to bypass the limitations of the classic crypto trading markets. They could now trade short term markets, and not really worry about maturity dates. However, the Speed markets had a different limitation - in one trade, you could at most double your position. In order to accommodate the needs of users looking for a **more leveraged exposure**, we created Chained Speed Markets.

Users can initiate their Chain Speed Markets journey by depositing a modest $5, unlocking a world of strategic trading possibilities. The player then selects the number of rounds, ranging from **2 to 6**, with each round swiftly lasting 10 minutes.

#### Precision

At the deposit stage, traders can show their **strategic thinking and analytical skills**, predicting whether the price of the chosen asset will be above or below its initial value at the **conclusion of each 5 or 10-minute round**. The users are required to submit **all predictions** for the selected rounds at the time of deposit. Once set, these **predictions are immutable and cannot be altered.**

Success in each round means advancement to the next, with the potential for multiplied returns. However, an **incorrect prediction at any stage** results in the loss of the initial $10 deposit. The challenge lies in maintaining accuracy across **all selected rounds.**

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2F1mCPWHn2UWDL4WYS9QLa%2Fimage.png?alt=media&token=514b2b50-f0fe-43ea-942d-8308b05dfacd>" %}

With an increasing multiplier for each correctly predicted round, ranging from 1.7 for  the second round, up to 1.9 for 6 rounds, the excitement intensifies as traders witness their potential returns grow. For instance, a 2-round chained market boasts a thrilling 2.89x payoff if both rounds are picked successfully (up to 47x for 6 rounds )

#### Powered by Pyth Network

Chained Speed Markets leverage the power of [Pyth Benchmark](https://pyth.network/benchmarks) on-demand oracles, offering historically queryable prices that validate trades in **near real-time**. These oracles play a crucial role in risk management for intraday markets like Speed (and Chained) Markets. Pyth Benchmark price feeds are updated every second using source data from reputable third-party publishers, providing **verifiable transparency** through the Pythnet blockchain.

Chained Speed Markets represent a fusion of **speed, strategy, and multiplied** returns, offering traders an exhilarating platform to navigate the dynamic landscape of financial markets.&#x20;

### Chained Markets parameters

The parameters for  **Chained Speed Markets** will be maintained via the Governance process. Configuration TIPs for considerations like opening the **ChainedSpeedMarketAMM** up for LPing will need to be submitted by the community and voted in by the Thales Council.  Initial funding will be provided by the TreasuryDAO, but future LPing could take it's place to provide liquidity for Speed Markets. &#x20;

* **Volume generated on  Chained Speed Markets will count towards gamified staking rewards**.
* Chained Speed Markets currently offer **5 and** **10 minute rounds**, but there might be other options in the future
* **ETH and BTC** will be the supported assets, with expansion to more assets planned in the future.
* Speed Markets will include a **SafeBox** fee of **2%**.
* The number of round can be between **2 and 6**
* The multiplier starts from **2.89x** for two markets, with a max **47x for 6 rounds**
* The minimum buy-in will be **5 USD,** with a maximum of **10 USD** (but both can be changed).
* The AMM Risk Cap per Day will begin at 10.000 USD.

Positions can be purchased using the several forms of collateral, with the minimum amount of each adjusted to equal 5 USDC.  The following forms of collateral are accepted:

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FD9Hoe5Vcu6NiwwiHsijg%2Fimage.png?alt=media&token=808cdde6-b67c-46fb-932b-12976c00c338>" %}


# Speed Markets Trading Guide

How to use the Speed Markets dapp with full Account Abstraction

<figure><img src="/files/d6k2KSHvMYjRS7K3YWhH" alt=""><figcaption></figcaption></figure>

The brand new Speed Markets application offers seamless user experience paired with a lot of fun speculating short term crypto prices!\
\
This guide will help you navigate the dapp.

## Getting Started

To start using the Speed Markets dapp, the first step is to log in.

When visiting the dapp on the link [www.speedmarkets.xyz/speed-markets](https://docs.overtime.io/www.speedmarkets.xyz/speed-markets) you will be greeted with the **`Get Started`** menu.&#x20;

<figure><img src="/files/OKzcT7LJs0xECSapShby" alt=""><figcaption><p>Get Started menu</p></figcaption></figure>

The Get Started menu will guide you to onboard the dapp in three steps.

The first step is the `Sign up` step.&#x20;

Click on the `LOGIN` button, tick the Terms of Use checkbox and then click on the login method you want to use.

<figure><img src="/files/mGuxE6X5Frru5M0wH7j0" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
***Social Login*****&#x20;methods (Google, Twitter, Discord, Guthub, Apple etc.) generates a wallet for you via Particle Network, creates you a Smart Accounts and enables for a full Account Abstraction experience.** \
\
C*onnect with Wallet* method onboards you **without** a smart account with regular wallet connection.
{% endhint %}

If you logged in successfully with Social Login, you will unlock step 2 of the Get Started process: the **`Deposit funds`** step.

<figure><img src="/files/sJT2rm7szrCY6qhRxMaE" alt=""><figcaption></figcaption></figure>

Deposit funds in your Speed Markets smart account by sending USDT and/or USDC to the address generated for you. If you don't have USDT or USDC, you can also directly deposit them via Credit Card using the FUND WITH CARD button. [Click here for Deposit Tutorials.](broken://pages/mlMz6apCMXeTkiWhPMjF)

## Start Trading

After your Smart Account has funds deposited, you can start using the dapp!\
\
With Paymaster integrated in the backend, you don't have to worry about having an ETH balance for gas fees, so you can immediately start trading with a stablecoin deposit.

On the main dapp trading page, you'll see the price chart with a constantly-updating asset price, based on a data feed from Pyth Oracles. In the other corner of the chart you'll see the liquidity available for the chosen asset. Below the chart are different time frames and a summary of your position once the variables are selected.

<figure><img src="/files/9hQUaUIeDNdW5lMbhdBp" alt=""><figcaption></figcaption></figure>

**To create a position, first choose an asset (BTC or ETH) and a direction.**

This is the direction you think the price will have moved at the end of your selected time frame based on the current price **(at the time the purchase transaction is submitted).**

Next, **choose the position duration**, and then enter the dollar **amount** you'd like to purchase. You can either click on one of the prefilled dollar amount buttons, or enter your own amount in the custom input field.

<figure><img src="/files/8HK3GQVZvgHSwBSe780v" alt=""><figcaption></figcaption></figure>

After building your position with all the parameters above, click on the BUY button to confirm your trade!<br>

<figure><img src="/files/htjWBQEBGJvzwkP6T4mI" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
After confirming your first BUY with a Particle Wallet pop up signature, you also start a **Account Abstraction Session**.

\
After this, all subsequent transactions will require no signature or pop up confirmation. **You just click buttons and its confirmed!**
{% endhint %}

Your open positions will be visible on the bottom of the trading page. If your position is a winning one, you'll see the blue "Claim Win $XX.XX" button next to a winning position. Click on the button to complete the transaction and claim your payout!&#x20;

{% hint style="info" %}
You can also use the **`CLAIM ALL WINS`** button to batch all winning positions at once!
{% endhint %}

<figure><img src="/files/jH6sOiWKHGD51xtO2MUB" alt=""><figcaption></figcaption></figure>


# Build Your Own Speed Markets App

## Speed Markets API

In order to ensure easy integration with external partners Speed Markets API is created. API returns all required data to interact with Speed Markets AMM contract. Using Speed Markets API endpoints someone can get data about:

* Buy
* User claimable markets
* Resolve markets (single or multiple markets)
* Resolve market with different collateral (single market)

More details about each API endpoint with request/response examples can be found under [Postman documentation](https://documenter.getpostman.com/view/2415538/2sA358e6Hi#d2c04294-f5d5-4afb-a0c8-a3ceb9f07c59).

## Contract integration

Once all data are fetched from API, the next step is integration with Speed Markets contract. Depending on whether someone wants to buy a position or resolve a market (claim win) integration should be done with Speed Markets AMM contract.

The next sections describe integration with Speed Markets API and Speed Markets contract together with JS code examples.

### Buy a UP/DOWN position

Let's say someone wants to buy **UP** position on the **BTC** market with a current strike price ($ 63,622.56) in **10 minutes** from market creation and with a buy-in amount of **5 sUSD:**

<figure><img src="https://docs.thalesmarket.io/~gitbook/image?url=https:%2F%2F288840232-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FKSZyDhrhMxBqaXew1MHD%252Fuploads%252Ft73JSZxCV7BP6QM2WD3A%252Fbuy.png%3Falt=media%26token=aa214f54-d258-404e-8960-fc847ff0a0aa&#x26;width=768&#x26;dpr=1&#x26;quality=100&#x26;sign=47dd6c40bcd853959b8a5ce41556a5d2bc904668994df42c2d68b65aa97a011a" alt=""><figcaption><p>Buy UP position for 5 sUSD on BTC in 10 min from creation</p></figcaption></figure>

Integration with Speed Markets API and Speed Markets AMM contract should include the following steps:

1. Get a buy parameters for the market from Speed Markets API
2. Get a Speed Markets AMM contract address for a specific network from [Thales contracts](https://contracts.thalesmarket.io/)
3. Get a Speed Markets AMM contract ABI from Speed Markets AMM [contract repository](https://github.com/thales-markets/contracts/blob/main/scripts/abi/SpeedMarketsAMM.json)
4. Create Speed Markets AMM contract instance
5. Call `createNewMarket` or `createNewMarketWithDifferentCollateral` method on  Speed Markets AMM contract with input parameters fetched from Speed Markets API in step #1

The JS code snippet below implements these steps:

```javascript
const ethers = require('ethers');
const fetch = require('node-fetch');
const dotenv = require('dotenv');

// SpeedMarketsAMM contract ABI
const { speedAMMContract } = require('./speedAmmContractAbi.js');

dotenv.config();

const API_URL = 'https://overtimemarketsv2.xyz'; // base API URL
const NETWORK_ID = 10; // optimism network ID
const NETWORK = 'optimism'; // optimism network
// SpeedMarketsAMM contract address on optimism
const AMM_CONTRACT_ADDRESS = '0xE16B8a01490835EC1e76bAbbB3Cadd8921b32001'; 

const ASSET = 'BTC';
const DIRECTION = 'UP';
const COLLATERAL = 'sUSD';
const BUY_IN = 5; // 5 sUSD
const DELTA_TIME = 600; // 10 min

// create instance of Infura provider for optimism network
const provider = new ethers.providers.InfuraProvider(
    { chainId: Number(NETWORK_ID), name: NETWORK },
    process.env.INFURA
);

// create wallet instance for provided private key and provider
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);

// create instance of Speed AMM contract
const speedAmm = new ethers.Contract(AMM_CONTRACT_ADDRESS, speedAMMContract.abi, wallet);

const createNewMarket = async () => {
    try {
        // Get contract method (createNewMarket/createNewMarketWithDifferentCollateral) parameters from Speed Markets API
        // for provided asset, direction, buy-in amount, collateral and delta time on optimism network
        const buyResponse = await fetch(
            `${API_URL}/speed-markets/networks/${NETWORK_ID}/buy/?asset=${ASSET}&direction=${DIRECTION}&buyin=${BUY_IN}&collateral=${COLLATERAL}&deltaTimeSec=${DELTA_TIME}`
        );

        const buyData = await buyResponse.json();
        console.log('Buy data', buyData);

        let tx;
        if (buyData.methodName == 'createNewMarketWithDifferentCollateral') {
            // call createNewMarketWithDifferentCollateral method on Speed Markets AMM contract
            tx = await speedAmm.createNewMarketWithDifferentCollateral(
                buyData.asset,
                buyData.strikeTime,
                buyData.delta,
                buyData.direction,
                buyData.priceUpdateData,
                buyData.collateral,
                buyData.collateralAmount,
                buyData.isEth,
                buyData.referrer,
                buyData.skewImpact,
                {
                    value: buyData.value,
                    type: 2,
                    maxPriorityFeePerGas: 10, // 10 wei
                }
            );
        } else {
            // call createNewMarket method on Speed Markets AMM contract
            tx = await speedAmm.createNewMarket(
                buyData.asset,
                buyData.strikeTime,
                buyData.delta,
                buyData.direction,
                buyData.buyinAmount,
                buyData.priceUpdateData,
                buyData.referrer,
                buyData.skewImpact,
                { value: buyData.value, type: 2, maxPriorityFeePerGas: 10 } // 10 wei
            );
        }

        // wait for the result
        const txResult = await tx.wait();
        console.log(`Successfully bought from Speed AMM. Transaction hash: ${txResult.transactionHash}`);
    } catch (e) {
        console.log('Failed to buy from Speed AMM', e);
    }
};

createNewMarket();
```

### Resolve market(s)

Let's say someone wants to **claim** winnings on two markets (resolve markets) in **sUSD**:

<figure><img src="https://docs.thalesmarket.io/~gitbook/image?url=https:%2F%2F288840232-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FKSZyDhrhMxBqaXew1MHD%252Fuploads%252FI6XsggxzwwH5I9G7k2VP%252Fclaim.png%3Falt=media%26token=39eac6bd-11c2-410a-9a16-b0a6f7edeefa&#x26;width=768&#x26;dpr=1&#x26;quality=100&#x26;sign=4e1abf17ed7dcef7663a592417157b6384158192ec6c7aec204c9d2641f090c5" alt=""><figcaption><p>Resolve (claim) two markets wins</p></figcaption></figure>

Integration with Speed Markets API and Speed Markets AMM contract should include the following steps:

1. Get a resolve parameters for the markets from Speed Markets API
2. Get a Speed Markets AMM contract address for a specific network from [Thales contracts](https://contracts.thalesmarket.io/)
3. Get a Speed Markets AMM contract ABI from Speed Markets AMM [contract repository](https://github.com/thales-markets/contracts/blob/main/scripts/abi/SpeedMarketsAMM.json)
4. Get a user claimable markets from Speed Markets API
5. Create Speed Markets AMM contract instance
6. Call `resolveMarketsBatch` method on  Speed Markets AMM contract with input parameters fetched from Speed Markets API in step #1

The JS code snippet below implements these steps:

```javascript
const ethers = require('ethers');
const fetch = require('node-fetch');
const dotenv = require('dotenv');
// SpeedMarketsAMM contract ABI
const { speedAMMContract } = require('./speedAmmContractAbi.js'); 

dotenv.config();

const API_URL = 'https://overtimemarketsv2.xyz'; // base API URL
const NETWORK_ID = 10; // optimism network ID
const NETWORK = 'optimism'; // optimism network
// SpeedMarketsAMM contract address on optimism
const AMM_CONTRACT_ADDRESS = '0xE16B8a01490835EC1e76bAbbB3Cadd8921b32001'; 

// Speed markets addresses to resolve
const MARKET_1 = '0x5ef786087d122b9056f351Cf3B52E5A7B0d5277D'; 
const MARKET_2 = '0x2542906FE4701A8c930427c2ff6Db1C948B91571';

// create instance of Infura provider for optimism network
const provider = new ethers.providers.InfuraProvider(
    { chainId: Number(NETWORK_ID), name: NETWORK },
    process.env.INFURA
);

// create wallet instance for provided private key and provider
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);

// create instance of Speed AMM contract
const speedAmm = new ethers.Contract(AMM_CONTRACT_ADDRESS, speedAMMContract.abi, wallet);

const resolveMarkets = async () => {
    try {
        // Get contract method (resolveMarketsBatch) parameters from Speed Markets API
        // for provided market address on optimism network
        const resolveResponse = await fetch(
            `${API_URL}/speed-markets/networks/${NETWORK_ID}/resolve?markets[]=${MARKET_1}&markets[]=${MARKET_2}`
        );

        const resolveData = await resolveResponse.json();
        console.log('Resolve data', resolveData);

        // call resolveMarketsBatch method on Speed Markets AMM contract
        const tx = await speedAmm.resolveMarketsBatch(
            resolveData.markets, 
            resolveData.priceUpdateData, 
            {
                value: resolveData.value,
                type: 2,
                maxPriorityFeePerGas: 10, // 10 wei
            }
        );

        // wait for the result
        const txResult = await tx.wait();
        console.log(`Successfully resolved market on Speed AMM. Transaction hash: ${txResult.transactionHash}`);
    } catch (e) {
        console.log('Failed to resolve market on Speed AMM', e);
    }
};

resolveMarkets();
```

### Resolve market with different collateral

If someone wants to **claim** winning in different collateral than default one for a network (resolve market) process is the same as previous one, just using appropriate API and contract method. Corresponding API is "Resolve market with different collateral" and contract method `resolveMarketWithOfframp.` Currently batch is not available for claim with different collateral.


# Speed Market Deposit Guides

Guides on how to deposit funds to your Speed Markets account and start trading!

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td></td><td><a href="/pages/Yon1Dq50fsPgUQyE5jv3">Deposit USDC from Coinbase</a></td><td></td><td><a href="/files/IZ0MwEiUEmvqijTMJP3x">/files/IZ0MwEiUEmvqijTMJP3x</a></td></tr><tr><td></td><td><a href="/pages/bVGHiqz4NMXZAxtLSieB">Deposit from Binance Mobile App</a></td><td></td><td><a href="/files/VosN1Yk2pL5u5ACFOEHn">/files/VosN1Yk2pL5u5ACFOEHn</a></td></tr><tr><td><p></p><p><a href="/pages/ndfJRoTxlXgVAxJWm32N">Deposit from Binance Website</a></p></td><td></td><td></td><td><a href="/files/QXWUPpOXCbV6oXp4wBHR">/files/QXWUPpOXCbV6oXp4wBHR</a></td></tr></tbody></table>


# Deposit USDC from Coinbase

## **If you don’t have USDC on Coinbase** <a href="#block-0f9873169aa34fb683817303806dc44b" id="block-0f9873169aa34fb683817303806dc44b"></a>

**Step by step guide how to acquire USDC on Coinbase before depositing to Thales Markets**

1\. Click **‘Buy & Sell’** on the Coinbase homepage.

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/QXGPUG8rpfkcsgLgsJYa/image.png>" %}

2. Click **‘Buy’** then under *Select Asset*, click **USD Coin (USDC).**

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/JPBewJmJZCWsVkDythgk/image.png>" %}

3. **Enter an amount & connect a payment method under ‘*****Pay with’.***

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/wXq7Vh5o7KujLvVUiVgT/image.png>" %}

4. Click **‘Preview Buy’**, review the *Order Preview,* then click **Buy Now.**

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/KKTXjGA2fHjSuiNO6LFl/image.png>" %}

5. You’ll see a “*Your order was submitted”* screen, then will receive a confirmation email when your USDC purchase is successful.

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/exYLci5gRyzhGNr5LgxM/image.png>" %}

## **You have acquired USDC on Coinbase** <a href="#block-3886d7582aa848faa176ee8e9351cc83" id="block-3886d7582aa848faa176ee8e9351cc83"></a>

1. 1\. Click **Send & Receive.**

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/FjTmPWdicDpoTUjwMoNz/image.png>" %}

2. Under *Asset*, select **USD Coin.**

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/hWSwiVVkbIkd8DamZSD0/image.png>" %}

3. **Enter the amount** you wish to deposit to your Speed Markets account.

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/tJu2AJRQwZkKWaBSGrgO/image.png>" %}

4. **Under ‘*****to*****’, enter your Overtime deposit address.** You can find yours on the Speed Markets **Deposit Page**. Then **click ‘*****Continue’***.

5. Under ‘*Network*’, select **the network you want to use Speed Markets on.**

{% hint style="danger" %}
**Make sure you are choosing the network that is the same as the one you chose on the top right corner of the Speed Markets webpage:**

![](/files/XePmePrbpTAkgfRI3LzU)
{% endhint %}

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/5QDQKH8xvjcVheaR9pXR/annotely_image%20(6).png>" fullWidth="false" %}

6. Click **Send Now** and wait for your your deposit to land on Thales Markets Deposit page (usually in a couple minutes).

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/T8wm6xeu8j4Sr0ckLrKg/image.png>" %}

7. **You are now ready to trade on Speed Markets!**&#x20;


# Deposit from Binance Mobile App

Log in to your Binance App and tap **\[Wallets]** - **\[Spot]** - **\[Withdraw]**.

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/HEEZp8qpBX7usjB2odjI/image.png>" %}

2. Choose USDC or USDT (whichever of the two you own in your Binance account). Then, tap **\[Send via Crypto Network]**.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2F6i6Hkfa6IgJcetiKddMq%2Fannotely_image%20(7).png?alt=media&token=40d699e0-bf05-49ff-afec-3154fcfe145c>" %}

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FcaHyrrIOZhgsKtVJkFNR%2Fannotely_image%20(8).png?alt=media&token=610081fa-a934-4e3c-8d90-7a0a034d3e3e>" %}

3. In the `Address` input field , paste the destination address copied from your **Speed Markets Deposit page**.
4. &#x20;Select the network

{% hint style="danger" %}
**Make sure you are choosing the network that is the same as the one you chose on the top right corner of the Speed Markets webpage:**

![](/files/XePmePrbpTAkgfRI3LzU)
{% endhint %}

<div><figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2Ft1WBnJbLKcmJTFvO4ptl%2Fviber_image_2023-12-12_13-47-27-762.jpg?alt=media&#x26;token=22d0a9df-1041-4961-bc4a-9a122e502a12" alt=""><figcaption><p>Optimism button</p></figcaption></figure> <figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FMrzk4rqcZHxD7pA4m1SI%2Fviber_image_2023-12-12_13-47-27-782.jpg?alt=media&#x26;token=b01c6c8a-a051-411a-bb1c-446be8a2ff01" alt=""><figcaption><p>Arbitrum button</p></figcaption></figure> <figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FN7OwkoGjEmpDl6ZbN1lt%2Fviber_image_2023-12-12_13-47-27-926.jpg?alt=media&#x26;token=b84dbaf9-0918-485c-a449-6dcca0c98cfd" alt=""><figcaption><p>Polygon button</p></figcaption></figure></div>

5. Enter the withdrawal amount and you will see the corresponding transaction fee and the final amount you will receive. You can also select which wallet to withdraw from by tapping **\[Spot & Funding Wallet].** Tap **\[Withdraw]** to proceed.
6. You will be prompted to confirm the transaction again. Please check carefully before tapping **\[Confirm]**.If you enter the wrong information or select the wrong network when making a transfer, your assets will be permanently lost. **Please make sure the information is correct before you confirm the transaction.**
7. Verify the transaction with your 2FA devices. After confirming the withdrawal request, please wait patiently for the transfer to be processed.


# Deposit from Binance Website

1. Log into your Binance account and click **\[Wallet]** - **\[Overview]**.

{% embed url="<https://public.bnbstatic.com/image/cms/article/body/202303/9723115f02d62c3f91326738626ab848.png>" %}

2. &#x20;Click **\[Withdraw]**.

{% embed url="<https://public.bnbstatic.com/image/cms/article/body/202303/8ce657dc5127d8f89093161e29fec9a5.png>" %}

3. You will be redirected to the withdrawal page. Click **\[Withdraw Crypto]**.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FOhYrCm5gNWPmxmMD9AwL%2F5e9c45de8803fdcfd5aefdfe4212a7fe.png?alt=media&token=15ab7ade-767e-4fd4-8aa5-663041191c9d>" %}

4. Choose USDC or USDT (whichever of the two you own in your Binance account).

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKSZyDhrhMxBqaXew1MHD%2Fuploads%2FpxLymQz92o7Lr7XDeQ3I%2Fannotely_image%20(9).png?alt=media&token=65389c7a-afb0-4aeb-b302-f48b3efd1e7f>" %}

5. Select the network. Depending on the crypto you choose, you will see the corresponding supported networks and network fees for this transaction.&#x20;

{% hint style="danger" %}
**Make sure you are choosing the network that is the same as the one you chose on the top right corner of the Speed Markets webpage:**

![](/files/XePmePrbpTAkgfRI3LzU)
{% endhint %}

{% embed url="<https://content.gitbook.com/content/nJyFkobxrWkQl5YVAtfa/blobs/J3JWmSZpM6Hwcfs43dT7/image.png>" %}

6. In the `Address` input field , paste the destination address copied from your Speed Markets Deposit page.
7. Enter the withdrawal amount. You may choose to use the balance from your Spot or Funding Wallet. You will see the transaction fee and the final amount you will receive. Click **\[Withdraw]** to proceed.
8. You will be prompted to confirm the selected network again. Click **\[Confirm]** if the receiving platform supports the network.
9. Check the withdrawal details carefully. Click **\[Continue]** and verify the transaction with your 2FA devices.
10. Your withdrawal request has been submitted. After confirming your request on Binance, it takes time for the transaction to be confirmed on the blockchain. The [confirmation time](https://academy.binance.com/en/glossary/confirmation-time) varies depending on the blockchain and its network traffic. Please wait patiently for the transfer to be processed.


# Overtime V2 integration

Step-by-step Overtime V2 integration guide.

## Overtime V2 API

In order to ensure easy integration with external partners Overtime V2 API is created. API returns all main data available on Overtime V2. Using Overtime V2 API endpoints someone can get data about:

* [Overtime V2 sports](/overtime-v2-integration/overtime-v2-sports)
* [Overtime V2 market types](/overtime-v2-integration/overtime-v2-market-types)
* [Overtime V2 collaterals](/overtime-v2-integration/overtime-v2-collaterals)
* [Overtime V2 markets](/overtime-v2-integration/overtime-v2-markets-protected)
* [Overtime V2 live markets](/overtime-v2-integration/overtime-v2-live-markets-protected)
* [Overtime V2 user history](/overtime-v2-integration/overtime-v2-user-history)
* [Quote data](/overtime-v2-integration/overtime-v2-quote-data)
* [Overtime V2 games info](/overtime-v2-integration/overtime-v2-games-info)
* [Overtime V2 players info](/overtime-v2-integration/overtime-v2-players-info)
* [Overtime V2 live scores](/overtime-v2-integration/overtime-v2-live-scores)

More details about each API endpoint with request/response examples also can be found under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao).

{% hint style="info" %}
Access to the Overtime API is restricted and requires an approved API key.\
\
API keys are issued only to teams or organizations that can clearly demonstrate how their intended use of the API delivers meaningful value to Overtime, its users, or its ecosystem. Requests must include a concrete description of the proposed use case, scope, and anticipated impact.\
\
**The Overtime API is not intended for experimental, hobbyist, or small personal projects. Requests that do not meet these criteria will not be approved.**
{% endhint %}

## Contract integration

Once all data are fetched from V2 API, the next step is integration with Overtime V2 contracts. Integration for both, a single or a parlay should be done with the [**Sports AMM V2 contract**](https://github.com/thales-markets/contracts-v2/blob/main/contracts/core/AMM/SportsAMMV2.sol). Integration for live markets should be done with the [**Live Trading Processor contract**](https://github.com/thales-markets/contracts-v2/blob/main/contracts/core/LiveTrading/LiveTradingProcessor.sol).

The next sections describe integration with Overtime V2 API and Overtime V2 contracts together with JS code examples.

### Buy a ticket

{% hint style="info" %} <mark style="color:blue;">**Users placing trades with $OVER will get 1% extra payouts for each game they have on their ticket.**</mark>
{% endhint %}

Let's say someone wants to buy a **2-game ticket** with a buy-in amount of **20 $OVER**:

<figure><img src="/files/bfUc8PJPaeBUxJOGdcUX" alt=""><figcaption><p>Ticket on Overtime V2</p></figcaption></figure>

Integration with Overtime V2 API and Sports AMM V2 contract should include the following steps:

1. Get [markets](/overtime-v2-integration/overtime-v2-markets-protected) from Overtime V2 API
2. Select ticket markets and positions and get a [quote](/overtime-v2-integration/overtime-v2-quote-data) for a ticket from Overtime V2 API.\
   *NOTE: This step is not mandatory. The trading method on contract requires a total quote as a parameter, but that can be calculated by simply multiplying market odds. However, the API method returns some additional data, like ticket liquidity or validation errors, if any.*
3. Get a Sports AMM V2 contract address for a specific network from [Thales V2 contracts](https://v2.contracts.thales.io/)
4. Get a Sports AMM V2 contract ABI from the Overtime V2 [contract repository](https://github.com/thales-markets/contracts-v2/blob/main/scripts/abi/SportsAMMV2.json)
5. Create a Sports AMM V2 contract instance
6. Call `trade` method on Sports AMM V2 contract with input parameters fetched from Overtime V2 API in steps #1 and #2

The JS code snippet below implements these steps:

{% code overflow="wrap" fullWidth="false" %}

```javascript
import axios from "axios";
import dotenv from "dotenv";
import { ethers } from "ethers";
import w3utils from "web3-utils";
import sportsAMMV2ContractAbi from "./sportsAMMV2ContractAbi.js"; // Sports AMM V2 contract ABI

dotenv.config();

const API_URL = "https://api.overtime.io"; // base API URL

const NETWORK_ID = 10; // Optimism network ID
const NETWORK = "optimism"; // Optimism network
const SPORTS_AMM_V2_CONTRACT_ADDRESS = "0xFb4e4811C7A811E098A556bD79B64c20b479E431"; // Sports AMM V2 contract address on Optimism

const BUY_IN = 20; // 20 $OVER
const COLLATERAL = "OVER"; // $OVER
const COLLATERAL_DECIMALS = 18; // $OVER decimals: 18
const COLLATERAL_ADDRESS = "0xedF38688b27036816A50185cAA430D5479e1C63e"; // $OVER contract address
const SLIPPAGE = 0.02; // slippage 2%
const REFERRAL_ADDRESS = "0x0000000000000000000000000000000000000000"; // referral address, set to ZERO address for testing

// create instance of Infura provider for Optimism network
const provider = new ethers.providers.InfuraProvider(
  { chainId: Number(NETWORK_ID), name: NETWORK },
  process.env.INFURA,
);

// create wallet instance for provided private key and provider
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);

// create instance of Sports AMM V2 contract
const sportsAMM = new ethers.Contract(SPORTS_AMM_V2_CONTRACT_ADDRESS, sportsAMMV2ContractAbi, wallet);

const getQuoteTradeData = (market, position) => {
  return {
    gameId: market.gameId,
    sportId: market.subLeagueId, // use subLeagueId field from API for sportId
    typeId: market.typeId,
    maturity: market.maturity,
    status: market.status,
    line: market.line,
    playerId: market.playerProps.playerId,
    odds: market.odds.map((odd) => odd.normalizedImplied), // use normalizedImplied odds field from API for odds
    merkleProof: market.proof, // use proof from API for merkleProof
    position,
    combinedPositions: market.combinedPositions,
    live: false,
  };
};

const getTradeData = (quoteTradeData) =>
  quoteTradeData.map((data) => ({
    ...data,
    // multiple lines by 100 because the contract can not accept decimals
    line: data.line * 100,
    // convert odds to BigNumber
    odds: data.odds.map((odd) => ethers.utils.parseEther(odd.toString()).toString()),
    // multiple combined positions lines by 100 because the contract can not accept decimals
    combinedPositions: data.combinedPositions.map((combinedPositions) =>
      combinedPositions.map((combinedPosition) => ({
        typeId: combinedPosition.typeId,
        position: combinedPosition.position,
        line: combinedPosition.line * 100,
      })),
    ),
  }));

const trade = async () => {
  try {
    // get a EURO 2024 markets from Overtime V2 API and ungroup them
    const marketsResponse = await axios.get(
      `${API_URL}/overtime-v2/networks/${NETWORK_ID}/markets?leagueId=50&ungroup=true`,
    );
    const markets = marketsResponse.data;

    // get a Slovakia - Romania child handicap market with line -1.5
    const slovakiaRomaniaHandicapMarket = markets[0].childMarkets[2];
    console.log(`Game: ${slovakiaRomaniaHandicapMarket.homeTeam} - ${slovakiaRomaniaHandicapMarket.awayTeam}`);
    // get a Ukraine - Belgium parent winner market
    const ukraineBelgiumWinnerMarket = markets[1];
    console.log(`Game: ${ukraineBelgiumWinnerMarket.homeTeam} - ${ukraineBelgiumWinnerMarket.awayTeam}`);

    // get a quote from Overtime V2 API for provided trade data (markets and positions), buy-in amount and collateral on Optimism network
    const quoteTradeData = [
      getQuoteTradeData(slovakiaRomaniaHandicapMarket, 1),
      getQuoteTradeData(ukraineBelgiumWinnerMarket, 1),
    ];
    const quoteResponse = await axios.post(`${API_URL}/overtime-v2/networks/${NETWORK_ID}/quote`, {
      buyInAmount: BUY_IN,
      tradeData: quoteTradeData,
      collateral: COLLATERAL,
    });
    const quote = quoteResponse.data;
    console.log("========== Quote ==========", quote);
    /* ========== Quote ==========
    {
      quoteData: {
        totalQuote: {
          american: -132.9670329668595,
          decimal: 1.7520661157034605,
          normalizedImplied: 0.5707547169808125
        },
        payout: {
          OVER: 35.04132231406921,
          usd: 8.913986776864496,
          payoutCollateral: 'OVER'
        },
        potentialProfit: {
          OVER: 15.041322314069212,
          usd: 3.826286776864496,
          percentage: 0.7520661157034605
        },
        buyInAmountInUsd: 5.0877
      },
      liquidityData: { ticketLiquidityInUsd: 19098 }
    }
    */

    // convert total quote got from API to BigNumber
    const parsedTotalQuote = ethers.utils.parseEther(quote.quoteData.totalQuote.normalizedImplied.toString());
    // convert buy-in amount to BigNumber
    const parsedBuyInAmount = ethers.utils.parseUnits(BUY_IN.toString(), COLLATERAL_DECIMALS);
    // convert slippage tolerance to BigNumber
    const parsedSlippage = ethers.utils.parseEther(SLIPPAGE.toString());

    // call trade method on Sports AMM V2 contract
    const tx = await sportsAMM.trade(
      getTradeData(quoteTradeData),
      parsedBuyInAmount,
      parsedTotalQuote,
      parsedSlippage,
      REFERRAL_ADDRESS,
      COLLATERAL_ADDRESS,
      false,
      {
        type: 2,
        maxPriorityFeePerGas: w3utils.toWei("0.00000000000000001"),
      },
    );
    // wait for the result
    const txResult = await tx.wait();
    console.log(`Successfully bought a ticket from Sports AMM V2. Transaction hash: ${txResult.transactionHash}`);
    /*
    Successfully bought a ticket from Sports AMM V2. Transaction hash: 0xe65638720344cc110b77f14f4276be61e7cd767f490927c195f11813c6d39901
    */
  } catch (e) {
    console.log("Failed to buy a ticket from Sports AMM V2", e);
  }
};

trade();

```

{% endcode %}

### Buy a position on live markets

{% hint style="info" %} <mark style="color:blue;">**Users placing trades with OVER will get 1% extra payouts for each game they have on their ticket.**</mark>
{% endhint %}

Let's say someone wants to buy a **live draw position** on the game **Tokyo Verdy 1969  - Consadole Sapporowith** with a buy-in amount of **10 USDC**:

<figure><img src="/files/jd3BlU8lXxYR6I8q7Kqk" alt=""><figcaption><p>Live markets on Overtime V2</p></figcaption></figure>

Integration with Overtime V2 API and Live Trading Processor contract should include the following steps:

1. Get [live markets](/overtime-v2-integration/overtime-v2-live-markets-protected) from Overtime V2 API
2. Select live market and position
3. Get a Live Trading Processor contract address for a specific network from [Thales V2 contracts](https://v2.contracts.thales.io/)
4. Get a Live Trading Processor contract ABI from the Overtime V2 [contract repository](https://github.com/thales-markets/contracts-v2/blob/main/scripts/abi/LiveTradingProcessor.json)
5. Create a Live Trading Processor contract instance
6. Call `requestLiveTrade` method on Live Trading Processor contract with input parameters fetched from Overtime V2 API in steps #1 and #2
7. Wait for the request to finish - fulfilled successfully or failed with some error (e.g. odds changed)

The JS code snippet below implements these steps:

{% code fullWidth="false" %}

```javascript
import axios from "axios";
import bytes32 from "bytes32";
import dotenv from "dotenv";
import { ethers } from "ethers";
import w3utils from "web3-utils";
import liveTradingProcessorContractAbi from "./liveTradingProcessorContractAbi.js"; // Live Trading Processor contract ABI

dotenv.config();

const API_URL = "https://api.overtime.io"; // base API URL

const NETWORK_ID = 10; // Optimism network ID
const NETWORK = "optimism"; // Optimism network
const LIVE_TRADING_PROCCESSOR_CONTRACT_ADDRESS = "0x3b834149F21B9A6C2DDC9F6ce97F2FD1097F8EAB"; // Live Trading Processor contract address on Optimism

const BUY_IN = 10; // 20 USDC
const POSITION = 2; // draw
const COLLATERAL_DECIMALS = 6; // USDC decimals: 6
const COLLATERAL_ADDRESS = "0x0000000000000000000000000000000000000000"; // USDC contract address (can be ZERO address since USDC is default collateral)
const SLIPPAGE = 0.02; // slippage 2%
const REFERRAL_ADDRESS = "0x0000000000000000000000000000000000000000"; // referral address, set to ZERO address for testing

// create instance of Infura provider for Optimism network
const provider = new ethers.providers.InfuraProvider(
  { chainId: Number(NETWORK_ID), name: NETWORK },
  process.env.INFURA,
);

// create wallet instance for provided private key and provider
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);

// create instance of Live Trading Processor contract
const liveTradingProcessor = new ethers.Contract(
  LIVE_TRADING_PROCCESSOR_CONTRACT_ADDRESS,
  liveTradingProcessorContractAbi,
  wallet,
);

const delay = (time) => {
  return new Promise(function (resolve) {
    setTimeout(resolve, time);
  });
};

const convertFromBytes32 = (value) => {
  const result = bytes32({ input: value });
  return result.replace(/\0/g, "");
};

const buyLivePosition = async () => {
  try {
    // get live markets from Overtime V2 API
    const marketsResponse = await axios.get(`${API_URL}/overtime-v2/networks/${NETWORK_ID}/live-markets`);
    const markets = marketsResponse.data.markets;

    // get a Tokyo Verdy 1969 - Consadole Sapporo market
    const market = markets[2];
    console.log(`Game: ${market.homeTeam} - ${market.awayTeam}`);

    // convert market odds got from API to BigNumber
    const parsedQuote = ethers.utils.parseEther(market.odds[POSITION].normalizedImplied.toString());
    // convert buy-in amount to BigNumber
    const parsedBuyInAmount = ethers.utils.parseUnits(BUY_IN.toString(), COLLATERAL_DECIMALS);
    // convert slippage tolerance to BigNumber
    const parsedSlippage = ethers.utils.parseEther(SLIPPAGE.toString());

    // get max allowed execution delay from Live Trading Processor contract
    const maxAllowedExecutionDelay = Number(await liveTradingProcessor.maxAllowedExecutionDelay());

    // call trade method on Sports AMM V2 contract
    const tx = await liveTradingProcessor.requestLiveTrade(
      {
        _gameId: convertFromBytes32(market.gameId), // use converted from bytes32 gameId field from API for gameId
        _sportId: market.subLeagueId, // use subLeagueId field from API for sportId
        _typeId: market.typeId,
        _position: POSITION,
        _line: market.line * 100, // multiple lines by 100 because the contract can not accept decimals
        _buyInAmount: parsedBuyInAmount,
        _expectedQuote: parsedQuote,
        _additionalSlippage: parsedSlippage,
        _referrer: REFERRAL_ADDRESS,
        _collateral: COLLATERAL_ADDRESS,
      },
      {
        type: 2,
        maxPriorityFeePerGas: w3utils.toWei("0.00000000000000001"),
      },
    );

    // wait for the result
    const txResult = await tx.wait();
    if (txResult) {
      console.log("Live trade requested. Fulfilling live trade...");

      const requestId = txResult.events.find((event) => event.event === "LiveTradeRequested").args[2];

      let requestInProgress = true;
      const startTime = Date.now();
      console.log(`Fulfill start time: ${new Date(startTime)}`);

      while (requestInProgress) {
        const isFulfilled = await liveTradingProcessor.requestIdToFulfillAllowed(requestId);
        console.log(`Is fulfilled: ${isFulfilled}`);
        if (isFulfilled) {
          console.log(`Fulfill end time: ${new Date(Date.now())}`);
          console.log(`Fulfill duration: ${(Date.now() - startTime) / 1000} seconds`);
          console.log(`Successfully bought live position from Sports AMM V2`);
          requestInProgress = false;
        } else {
          // Add buffer of 10 seconds to wait for request to start execution
          if (Date.now() - startTime >= (Number(maxAllowedExecutionDelay) + 10) * 1000) {
            console.log("Odds changed while fulfilling the order. Try increasing the slippage.");
            requestInProgress = false;
          } else {
            await delay(1000);
          }
        }
      }
    }
  } catch (e) {
    console.log("Failed to buy live position from Sports AMM V2", e);
  }
};

buyLivePosition();

```

{% endcode %}


# Overtime V2 sports

Get a list of all supported sports and leagues.

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/sports`

See sports API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#79b6a69c-e288-4018-a18d-8faa42f145b4).

### Example Request

<https://api.overtime.io/overtime-v2/sports>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{  
  "4": {
    "sport": "Basketball",
    "id": 4,
    "label": "NBA",
    "opticOddsName": "NBA",
    "provider": "rundown",
    "scoringType": "points",
    "matchResolveType": "overtime",
    "periodType": "quarter",
    "isDrawAvailable": false,
    "live": true,
    "isLiveTestnet": true
  },
  "50": {
    "sport": "Soccer",
    "id": 50,
    "label": "UEFA EURO 2024",
    "opticOddsName": "UEFA - European Championship",
    "provider": "enetpulse",
    "scoringType": "goals",
    "matchResolveType": "regular",
    "periodType": "half",
    "isDrawAvailable": true,
    "live": true,
    "isLiveTestnet": true
  }
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="197">Name</th><th width="141">Type</th><th>Description</th></tr></thead><tbody><tr><td>sport</td><td>string</td><td>Market type ID</td></tr><tr><td>id</td><td>number</td><td>League ID</td></tr><tr><td>opticOddsName</td><td>string</td><td>OpticOdds name (needed for live mapping, not relevant for UI)</td></tr><tr><td>provider</td><td>string</td><td>Odds provider. Supported providers: <code>rundown</code>, <code>enetpulse</code></td></tr><tr><td>scoringType</td><td>string</td><td>Scoring type for sport. Supported scoring types: <code>points</code>, <code>goals</code>, <code>rounds</code>, <code>sets</code> or <code>&#x3C;empty></code>.</td></tr><tr><td>matchResolveType</td><td>string</td><td>When final score is set. Supported resolve types: <code>overtime</code>, <code>regular</code> or <code>&#x3C;empty></code>.</td></tr><tr><td>periodType</td><td>string</td><td>Period of sport. Supported periods: <code>quarter</code>, <code>half</code>, <code>period</code>, <code>round</code>, <code>inning</code>, <code>set</code>  or <code>&#x3C;empty></code>.</td></tr><tr><td>isDrawAvailable</td><td>boolean</td><td>Is draw avaulable for sport: <code>true</code> or <code>false</code>.</td></tr><tr><td>live</td><td>boolean</td><td>Are live markets supported for league: <code>true</code> or <code>false</code>.</td></tr><tr><td>isLiveTestnet</td><td>boolean</td><td>Are live markets supported for league on testnet: <code>true</code> or <code>false</code>.</td></tr></tbody></table>


# Overtime V2 market types

Get a list of all supported market types.

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/market-types`

See market types API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#bb4439de-b50b-47e7-b2ec-a45951ad4b32).

### Example Request

<https://api.overtime.io/overtime-v2/market-types>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{
  "0": {
    "id": 0,
    "key": "winner",
    "name": "Winner",
    "resultType": 1
  },
  "10001": {
    "id": 10001,
    "key": "spread",
    "name": "Handicap",
    "resultType": 4
  }
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="153">Name</th><th width="151">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>number</td><td>Market type ID</td></tr><tr><td>key</td><td>string</td><td>Market type key</td></tr><tr><td>name</td><td>string</td><td>Market type name</td></tr><tr><td>resultType</td><td>number</td><td>Market type result type (needed on the contract side, not used on UI).</td></tr></tbody></table>


# Overtime V2 collaterals

Get a list of all supported collaterals.

{% hint style="info" %} <mark style="color:blue;">**Users placing trades with THALES will get 1% extra payouts for each game they have on their ticket.**</mark>
{% endhint %}

More about the V2 collateral upgrade in [the Medium article](https://medium.com/@OvertimeMarkets.xyz/overtime-v2-public-beta-is-live-e2109ee4d348).

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/collaterals`

See collaterals API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#5e042a42-2df9-4453-8995-a44d32eb80e8).

### Example Request

<https://api.overtime.io/overtime-v2/networks/10/collaterals>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{
  {
    "symbol": "USDC",
    "name": "USD Coin",
    "address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
    "decimals": 6,
    "default": true
  },
  {
    "symbol": "THALES",
    "name": "Thales DAO Token",
    "address": "0x217d47011b23bb961eb6d93ca9945b7501a5bb11",
    "decimals": 18,
    "default": false
  }
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="192">Name</th><th width="178">Type</th><th>Description</th></tr></thead><tbody><tr><td>symbol</td><td>string</td><td>Collateral symbol</td></tr><tr><td>name</td><td>string</td><td>Collateral name</td></tr><tr><td>address</td><td>string</td><td>Collateral address</td></tr><tr><td>decimals</td><td>number</td><td>Number of decimals</td></tr><tr><td>default</td><td>boolean</td><td>Is default collateral: <code>true</code> or <code>false</code>.</td></tr></tbody></table>


# Overtime V2 markets (protected)

Get a list of all markets or a single market details.

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/markets`

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/markets/{{gameId}}`

See the markets API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#74d322b9-bc86-483f-9c59-3eb9ea2cd11f).

All requests to this route must include a valid API key for authentication. The API key should be provided in the request header as `x-api-key`.

{% hint style="info" %}
Access to the Overtime API is restricted and requires an approved API key.\
\
API keys are issued only to teams or organizations that can clearly demonstrate how their intended use of the API delivers meaningful value to Overtime, its users, or its ecosystem. Requests must include a concrete description of the proposed use case, scope, and anticipated impact.\
\
**The Overtime API is not intended for experimental, hobbyist, or small personal projects. Requests that do not meet these criteria will not be approved.**
{% endhint %}

{% hint style="danger" %}
To prevent excessive use, API keys may be blacklisted, resulting in disabled access. The limits are as follows:

* Prematch: One request per league every 5 seconds.
* Live: One request for all leagues every 2 seconds.
  {% endhint %}

### Example Request

<https://api.overtime.io/overtime-v2/networks/10/markets?includeHashInResponse=true&responseHash=MRuJjZAhXzX3LWzZo%2B1q4ohxJpM%3D&onlyBasicProperties=true>

#### Single game request

<https://api.overtime.io/overtime-v2/networks/10/markets/0x3430343338353400000000000000000000000000000000000000000000000000>

### Request Parameters (as query string) <a href="#response-parameters" id="response-parameters"></a>

{% hint style="warning" %}
Use **`responseHash`** and **`includeHashInResponse`** when polling markets to avoid downloading the same data repeatedly. The API will return **`"no change"`** if the computed hash matches your `responseHash`, which significantly reduces payload size, bandwidth, and client/server processing.

Enable **`includeHashInResponse=true`** to get the server-computed `responseHash` in each response, so you can store it and send it back on the next request.
{% endhint %}

{% hint style="warning" %}
Use **`onlyBasicProperties=true`** to return a **reduced market object** with non-essential fields removed, which is recommended for UI “view mode” and frequent polling to **minimize payload size and speed up responses**.
{% endhint %}

<table><thead><tr><th width="223">Name</th><th width="195">Type</th><th>Description</th></tr></thead><tbody><tr><td>responseHash</td><td>string</td><td><p>Client-provided hash of the previous response. Server computes a SHA-1 hash of the would-be response and:</p><p></p><ul><li>returns <code>"no change"</code> if hashes match</li><li>otherwise returns the full payload</li></ul><p></p><p><strong>Notes:</strong> Used for lightweight polling / change detection.</p></td></tr><tr><td>includeHashInResponse</td><td>boolean</td><td><p> If <code>"true"</code>, response becomes:</p><pre class="language-json"><code class="lang-json"> "responseHash": "&#x3C;encoded>", "markets": ... }
</code></pre><p>and markets will be <code>"no change"</code> if it matches <code>responseHash</code>.</p></td></tr><tr><td>onlyBasicProperties</td><td>boolean</td><td>Strips markets down to a minimal set of fields to reduce payload size.</td></tr><tr><td>includeProofs</td><td>boolean</td><td><p>When used with <code>onlyBasicProperties=true</code>, includes proof-related fields (used for the validation of market data on the contract side) instead of stripping them.</p><p><br><strong>Notes:</strong> Proofs are used for the validation of market data on the contract side when placing a bet. Not required for read-only (view) mode.</p></td></tr><tr><td>onlyMainMarkets</td><td>boolean</td><td>For each parent market, returns only the “main” <strong>SPREAD</strong> and/or <strong>TOTAL</strong> child markets.</td></tr><tr><td>ungroup</td><td>boolean</td><td><p>Controls response shape:</p><ul><li><code>"false"</code> (default): markets response is grouped per sport</li><li><code>"true"</code>: response is an ungrouped flat array of markets</li></ul></td></tr><tr><td>minMaturity</td><td>number (timestamp-like numeric value)</td><td>Filters to markets with <code>market.maturity >= minMaturity</code>.</td></tr><tr><td>maxMaturity</td><td>number (timestamp-like numeric value)</td><td>Filters to markets with <code>market.maturity &#x3C;= maxmaturity</code>.</td></tr><tr><td>status</td><td>string</td><td><p>Selects which market-status bucket to return.<br></p><ul><li><strong>Default:</strong> <code>"open"</code></li><li><strong>Allowed:</strong> <code>open | resolved | cancelled | paused | ongoing</code></li></ul></td></tr><tr><td>sport</td><td>string</td><td>Filters markets by sport name.</td></tr><tr><td>leagueId</td><td>number</td><td>Filters markets to a single league ID.</td></tr><tr><td>typeId</td><td>number</td><td>Filters results to a single market type</td></tr><tr><td>leagueIds</td><td>string (comma-separated league IDs)</td><td>Filters markets to any of the specified leagues.</td></tr><tr><td>gameIds</td><td>string (comma-separated game IDs)</td><td>Filters markets to any of the specified game IDs.</td></tr><tr><td>typeIds</td><td>string (comma-separated type IDs)</td><td>Filters markets to any of the specified market type IDs.</td></tr><tr><td>playerIds</td><td>string (comma-separated player IDs)</td><td>Filters <strong>player prop</strong> markets to any of the specified player IDs.</td></tr><tr><td>lines</td><td>string (comma-separated market lines)</td><td>Filters markets by <code>market.line</code>.</td></tr><tr><td>includeFuturesInSport</td><td><code>any</code> (treated as “enabled if present”)</td><td>When <code>sport</code> is provided, also includes futures markets whose “initial sport” matches the requested sport.</td></tr></tbody></table>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{
    "responseHash": "l%2FaLmDc4HsKYGxFy4uMJV5kfEoU%3D",
    "markets": {
        "gameId": "0x3430343338353400000000000000000000000000000000000000000000000000",
        "sport": "Soccer",
        "leagueId": 50,
        "leagueName": "UEFA EURO 2024",
        "subLeagueId": 50,
        "typeId": 0,
        "type": "winner",
        "line": 0,
        "maturity": 1719342000,
        "maturityDate": "2024-06-25T19:00:00.000Z",
        "homeTeam": "Denmark",
        "awayTeam": "Serbia",
        "status": 0,
        "isOpen": true,
        "isResolved": false,
        "isCancelled": false,
        "isPaused": false,
        "isOneSideMarket": false,
        "isPlayerPropsMarket": false,
        "isOneSidePlayerPropsMarket": false,
        "isYesNoPlayerPropsMarket": false,
        "playerProps": {
            "playerId": 0,
            "playerName": ""
        },
        "combinedPositions": [
            [],
            [],
            []
        ],
        "odds": [
            {
                "american": 118.0000000001308,
                "decimal": 2.180000000001308,
                "normalizedImplied": 0.45871559633
            },
            {
                "american": 220.9999999997721,
                "decimal": 3.209999999997721,
                "normalizedImplied": 0.311526479751
            },
            {
                "american": 250.00000000035004,
                "decimal": 3.5000000000035003,
                "normalizedImplied": 0.285714285714
            }
        ],
        "proof": [
            "0xf70b2ac4bc9dd2256176391dac75034bbbf8d0272dc70d46d3d3dc1ff4d3ee9e",
            "0xee9621418b4a6428d60b846c0dc3504b38e6dae3b29f92130d1ea688aae0fd42",
            "0x6e0aa14dae51f4f182ac39008f2e0c7b66c1a032376f5fb5289cbfadc7e348aa",
            "0x778f9ce7f8c283be56bb50276ac8c73eb40b5e333af41f59b45e86569d1dc54a"
        ],
        "childMarkets": [...],
        "statusCode": "open"
    }
}
```

{% endtab %}

{% tab title="200 OK  (no markets changes)" %}

```json
{
    "responseHash":"MRuJjZAhXzX3LWzZo%2B1q4ohxJpM%3D",
    "markets":"no change"
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="266">Name</th><th width="195">Type</th><th>Description</th></tr></thead><tbody><tr><td>responseHash</td><td>string</td><td><p>The hash of the markets response. It can be used in subsequent requests to check if markets have changed.</p><ul><li>Returns <code>"no change"</code> if the markets haven’t changed.</li><li>Returns full market data if there are changes.</li></ul></td></tr><tr><td>gameId</td><td>string</td><td>Game ID</td></tr><tr><td>sport</td><td>string</td><td>Game sport. See <a href="/pages/VUIYQELsI0QLBiqX2zSX">Overtime V2 sports</a>.</td></tr><tr><td>leagueId</td><td>number</td><td>Game league ID. See <a href="/pages/VUIYQELsI0QLBiqX2zSX">Overtime V2 sports</a>.</td></tr><tr><td>leagueName</td><td>string</td><td>Game league name. See <a href="/pages/VUIYQELsI0QLBiqX2zSX">Overtime V2 sports</a>.</td></tr><tr><td>subLeagueId</td><td>number</td><td>Game subleague ID. It is used for some sports (tennis and UFC) to separate different levels and rounds of tournaments. (needed on the contract side, not used on UI).</td></tr><tr><td>typeId</td><td>number</td><td>Type ID of the market. 0 for parent market (moneyline/winner). For other types see <a href="/pages/7KFVAdCVy8Yuhc22tEuJ">Overtime V2 market types</a>.</td></tr><tr><td>type</td><td>string</td><td>Type of the market. See <a href="/pages/7KFVAdCVy8Yuhc22tEuJ">Overtime V2 market types</a>.</td></tr><tr><td>line</td><td>number</td><td>Market line (if available).</td></tr><tr><td>maturity</td><td>number</td><td>Game start timestamp</td></tr><tr><td>maturityDate</td><td>date</td><td>Game start date and time</td></tr><tr><td>homeTeam</td><td>string</td><td>The name of the home team</td></tr><tr><td>awayTeam</td><td>string</td><td>The name of the away team</td></tr><tr><td>status</td><td><a href="#statusenum">StatusEnum</a></td><td>The status of the market</td></tr><tr><td>isOpen</td><td>boolean</td><td>Is market open: <code>true</code> or <code>false</code>.</td></tr><tr><td>isResolved</td><td>boolean</td><td>Is market resolved: <code>true</code> or <code>false</code>.</td></tr><tr><td>isCancelled</td><td>boolean</td><td>Is market cancelled: <code>true</code> or <code>false</code>.</td></tr><tr><td>isPaused</td><td>boolean</td><td>Is market paused: <code>true</code> or <code>false</code>.</td></tr><tr><td>isOneSideMarket</td><td>boolean</td><td>Is one-side market (motosport, golf winner...): <code>true</code> or <code>false</code>.</td></tr><tr><td>isPlayerPropsMarket</td><td>boolean</td><td>Is player props market: <code>true</code> or <code>false</code>.</td></tr><tr><td>isOneSidePlayerPropsMarket</td><td>boolean</td><td>Is one-side player props market (who will score first/last touchdown...): <code>true</code> or <code>false</code>.</td></tr><tr><td>isYesNoPlayerPropsMarket</td><td>boolean</td><td>Is YES/NO player props market (double-double, triple-double...): <code>true</code> or <code>false</code>.</td></tr><tr><td>playerProps</td><td><a href="#playerprops">PlayerProps</a></td><td>Player info (if player props market)</td></tr><tr><td>combinedPositions</td><td><a href="#combinedposition">CombinedPosition</a>[][]</td><td>An array of combined positions if the market is that type (half-time/full-time, winner+total...)</td></tr><tr><td>odds</td><td><a href="#odds">Odds</a>[]</td><td>Market odds</td></tr><tr><td>proof</td><td>string[]</td><td>The Merkle proof used for the validation of market data on the contract side</td></tr><tr><td>childMarkets</td><td><a href="#response-parameters">Market</a>[]</td><td>Child markets with the same structure as parent market</td></tr><tr><td>statusCode</td><td><a href="#statuscodeenum">StatusCodeEnum</a></td><td>Market status code used for grouping markets per status.</td></tr></tbody></table>

#### StatusEnum

| Name      | Value |
| --------- | ----- |
| OPEN      | 0     |
| PAUSED    | 1     |
| RESOLVED  | 10    |
| CANCELLED | 255   |

#### StatusCodeEnum

| Name      | Value     |
| --------- | --------- |
| OPEN      | open      |
| PAUSED    | paused    |
| RESOLVED  | resolved  |
| CANCELLED | cancelled |
| ONGOING   | ongoing   |

#### PlayerProps

<table><thead><tr><th width="196">Name</th><th width="170">Type</th><th>Description</th></tr></thead><tbody><tr><td>playerId</td><td>number</td><td>Player ID</td></tr><tr><td>playerName</td><td>string</td><td>The name of the player</td></tr></tbody></table>

#### CombinedPosition

<table><thead><tr><th width="196">Name</th><th width="173">Type</th><th>Description</th></tr></thead><tbody><tr><td>typeId</td><td>number</td><td>The type ID of single market</td></tr><tr><td>position</td><td>number</td><td>The position on the single market</td></tr><tr><td>line</td><td>number</td><td>Single market line</td></tr></tbody></table>

#### Odds

<table><thead><tr><th width="196">Name</th><th width="173">Type</th><th>Description</th></tr></thead><tbody><tr><td>american</td><td>number</td><td>American format of the odds</td></tr><tr><td>decimal</td><td>number</td><td>Decimal format of the odds</td></tr><tr><td>normalizedImplied</td><td>number</td><td>Normalized Implied format of the odds</td></tr></tbody></table>


# Overtime V2 live markets (protected)

Get a list of all live markets.

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/live-markets`

See the live markets API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#3a10551c-7281-432d-9bbe-dcfc399490a1).

All requests to this route must include a valid API key for authentication. The API key should be provided in the request header as `x-api-key`.

{% hint style="info" %}
Access to the Overtime API is restricted and requires an approved API key.\
\
API keys are issued only to teams or organizations that can clearly demonstrate how their intended use of the API delivers meaningful value to Overtime, its users, or its ecosystem. Requests must include a concrete description of the proposed use case, scope, and anticipated impact.\
\
**The Overtime API is not intended for experimental, hobbyist, or small personal projects. Requests that do not meet these criteria will not be approved.**
{% endhint %}

<https://api.overtime.io/overtime-v2/networks/10/live-markets>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{
  "markets": [
    {
      "gameId": "0x6636646334303563663864396330373365626166363237633239373432653430",
      "sport": "Soccer",
      "leagueId": 19,
      "leagueName": "J1 League",
      "subLeagueId": 19,
      "typeId": 0,
      "type": "winner",
      "maturity": 1717221600,
      "maturityDate": "2024-06-01T06:00:00.000Z",
      "homeTeam": "Machida Zelvia",
      "awayTeam": "Albirex Niigata",
      "homeScore": 3,
      "awayScore": 2,
      "gameClock": 82,
      "gamePeriod": "2H",
      "finalResult": 0,
      "status": 0,
      "isOpen": true,
      "isResolved": false,
      "isCanceled": false,
      "isPaused": false,
      "isOneSideMarket": false,
      "line": 0,
      "isPlayerPropsMarket": false,
      "isOneSidePlayerPropsMarket": false,
      "isYesNoPlayerPropsMarket": false,
      "playerProps": {
        "playerId": 0,
        "playerName": ""
      },
      "combinedPositions": [
        [],
        [],
        []
      ],
      "odds": [
        {
          "american": 0,
          "decimal": 0,
          "normalizedImplied": 0
        },
        {
          "american": 0,
          "decimal": 0,
          "normalizedImplied": 0
        },
        {
          "american": 0,
          "decimal": 0,
          "normalizedImplied": 0
        }
      ],
      "proof": [
        "0xda99ce905965676e20806b901cca63dae78213261ed45921cf6f39bbb4b85c24",
        "0xb1ff121b809fafe4d2f775923ac3bcf2de9ce2db206e5a7472357269f47a18d5",
        "0xe62418bfc7d98a561aaa89e838cd1c2c60b8f1c6502588a7d61002eb648d3390"
      ],
      "childMarkets": [],
      "statusCode": "open"
    }
  ],
  "errors": []
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="146">Name</th><th width="130">Type</th><th>Description</th></tr></thead><tbody><tr><td>markets</td><td><a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Market</a>[]</td><td>Available live markets</td></tr><tr><td>errors</td><td>string[]</td><td>Errors that occurred during live markets fetching, if any</td></tr></tbody></table>

#### Additional live market parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="146">Name</th><th width="130">Type</th><th>Description</th></tr></thead><tbody><tr><td>homeScore</td><td>number</td><td>Home team score</td></tr><tr><td>awayScore</td><td>number</td><td>Away team score</td></tr><tr><td>gameClock</td><td>number</td><td>Current time in the game</td></tr><tr><td>gamePeriod</td><td>string</td><td>Current game period</td></tr></tbody></table>


# Overtime V2 user history

Get a user history. It returns all tickets grouped by status.

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:green;">`GET`</mark> `https://api.overtime.io/overtime-v2/networks/{{network}}/users/{{userAddress}}/history`

See the user history API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#2e93df2f-2636-4544-a82d-5b63d8e795ba).

### Example Request

<https://api.overtime.io/overtime-v2/networks/10/users/0x819a371aB4BfdeD173Edcf12b6D37c6C80E4a8C0/history>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{
  "open": [...],
  "claimable": [
    {
      "id": "0xaDD59A5F6c144B3cBd6AC9d10B848EEABa633f93",
      "timestamp": 1718478509000,
      "collateral": "THALES",
      "account": "0x9f8e4ee788D9b00A3409584E18034aA7B736C396",
      "buyInAmount": 38.58138411178477,
      "fees": 0.7716276822356954,
      "totalQuote": 0.5294647111772277,
      "payout": 72.86866017189656,
      "numOfMarkets": 1,
      "expiry": 1726254509000,
      "isResolved": false,
      "isPaused": false,
      "isCancelled": false,
      "isLost": false,
      "isUserTheWinner": true,
      "isExercisable": true,
      "isClaimable": true,
      "isOpen": false,
      "finalPayout": 0,
      "isLive": true,
      "sportMarkets": [
        {
          "gameId": "0x3430343338343400000000000000000000000000000000000000000000000000",
          "sport": "Soccer",
          "leagueId": 50,
          "subLeagueId": 50,
          "leagueName": "UEFA EURO 2024",
          "typeId": 0,
          "type": "winner",
          "maturity": 1718478569000,
          "maturityDate": "2024-06-15T19:09:29.000Z",
          "homeTeam": "Italy",
          "awayTeam": "Albania",
          "homeScore": 2,
          "homeScoreByPeriod": [
            2
          ],
          "awayScore": 1,
          "awayScoreByPeriod": [
            1
          ],
          "isOpen": false,
          "isResolved": true,
          "isCancelled": false,
          "isWinning": true,
          "isOneSideMarket": false,
          "line": 0,
          "isPlayerPropsMarket": false,
          "isOneSidePlayerPropsMarket": false,
          "isYesNoPlayerPropsMarket": false,
          "playerProps": {
            "playerId": 0,
            "playerName": "Player Name"
          },
          "selectedCombinedPositions": [],
          "position": 0,
          "odd": 0.52941176470611,
          "isGameFinished": true,
          "gameStatus": "finished"
        }
      ]
    }
  ],
  "closed": [...]
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="196">Name</th><th width="172">Type</th><th>Description</th></tr></thead><tbody><tr><td>open</td><td><a href="#response-parameters-1">Ticket</a>[]</td><td>Open tickets</td></tr><tr><td>claimable</td><td><a href="#response-parameters-1">Ticket</a>[]</td><td>Claimable tickets</td></tr><tr><td>closed</td><td><a href="#response-parameters-1">Ticket</a>[]</td><td>Closed tickets</td></tr></tbody></table>

#### Ticket <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="196">Name</th><th width="172">Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>string</td><td>Ticket address</td></tr><tr><td>timestamp</td><td>number</td><td>Ticket created timestamp</td></tr><tr><td>collateral</td><td>string</td><td>Collateral used for ticket</td></tr><tr><td>account</td><td>string</td><td>Ticket owner address</td></tr><tr><td>buyInAmount</td><td>number</td><td>Ticket buy-in amount</td></tr><tr><td>fees</td><td>number</td><td>Ticket fees (paid by LP)</td></tr><tr><td>totalQuote</td><td>number</td><td>Ticket total quote</td></tr><tr><td>payout</td><td>number</td><td>Ticket payout</td></tr><tr><td>numOfMarkets</td><td>number</td><td>Number of markets on the ticket</td></tr><tr><td>expiry</td><td>number</td><td>Ticket expiry timestamp (90 days from creation)</td></tr><tr><td>isResolved</td><td>boolean</td><td>Is ticket resolved (exercised): <code>true</code> or <code>false</code>.</td></tr><tr><td>isPaused</td><td>boolean</td><td>Is ticket paused: <code>true</code> or <code>false</code>.</td></tr><tr><td>isCancelled</td><td>boolean</td><td>Is ticket cancelled (all markets on the ticket are cancelled): <code>true</code> or <code>false</code>.</td></tr><tr><td>isLost</td><td>boolean</td><td>Is ticket lost (by user): <code>true</code> or <code>false</code>.</td></tr><tr><td>isUserTheWinner</td><td>boolean</td><td>Is user the winner: <code>true</code> or <code>false</code>.</td></tr><tr><td>isExercisable</td><td>boolean</td><td>Is ticket exercisable (all markets are resolved): <code>true</code> or <code>false</code>.</td></tr><tr><td>isClaimable</td><td>boolean</td><td>Is ticket claimable (by user - user is the winner and not resolved): <code>true</code> or <code>false</code>.</td></tr><tr><td>isOpen</td><td>boolean</td><td>Is ticket open: <code>true</code> or <code>false</code>.</td></tr><tr><td>finalPayout</td><td>number</td><td>Final payout (set only for resolved tickets, otherwise is 0)</td></tr><tr><td>isLive</td><td>boolean</td><td>Is live ticket (ticket with live market): <code>true</code> or <code>false</code>.</td></tr><tr><td>sportMarkets</td><td><a href="#response-parameters-2">TicketMarket</a>[]</td><td>Selected markets on the ticket</td></tr></tbody></table>

#### TicketMarket <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="266">Name</th><th width="195">Type</th><th>Description</th></tr></thead><tbody><tr><td>gameId</td><td>string</td><td>Game ID</td></tr><tr><td>sport</td><td>string</td><td>Game sport. See <a href="/pages/VUIYQELsI0QLBiqX2zSX">Overtime V2 sports</a>.</td></tr><tr><td>leagueId</td><td>number</td><td>Game league ID. See <a href="/pages/VUIYQELsI0QLBiqX2zSX">Overtime V2 sports</a>.</td></tr><tr><td>leagueName</td><td>string</td><td>Game league name. See <a href="/pages/VUIYQELsI0QLBiqX2zSX">Overtime V2 sports</a>.</td></tr><tr><td>subLeagueId</td><td>number</td><td>Game subleague ID. It is used for some sports (tennis and UFC) to separate different levels and rounds of tournaments. (needed on the contract side, not used on UI).</td></tr><tr><td>typeId</td><td>number</td><td>Type ID of the market. 0 for parent market (moneyline/winner). For other types see <a href="/pages/7KFVAdCVy8Yuhc22tEuJ">Overtime V2 market types</a>.</td></tr><tr><td>type</td><td>string</td><td>Type of the market. See <a href="/pages/7KFVAdCVy8Yuhc22tEuJ">Overtime V2 market types</a>.</td></tr><tr><td>line</td><td>number</td><td>Market line (if available).</td></tr><tr><td>maturity</td><td>number</td><td>Game start timestamp</td></tr><tr><td>maturityDate</td><td>date</td><td>Game start date and time</td></tr><tr><td>homeTeam</td><td>string</td><td>The name of the home team</td></tr><tr><td>awayTeam</td><td>string</td><td>The name of the away team</td></tr><tr><td>isOpen</td><td>boolean</td><td>Is market open: <code>true</code> or <code>false</code>.</td></tr><tr><td>isResolved</td><td>boolean</td><td>Is market resolved: <code>true</code> or <code>false</code>.</td></tr><tr><td>isCancelled</td><td>boolean</td><td>Is market cancelled: <code>true</code> or <code>false</code>.</td></tr><tr><td>isWinning</td><td>boolean</td><td>Is winning market for the user: <code>true</code> or <code>false</code>.</td></tr><tr><td>isOneSideMarket</td><td>boolean</td><td>Is one-side market (motosport, golf winner...): <code>true</code> or <code>false</code>.</td></tr><tr><td>isPlayerPropsMarket</td><td>boolean</td><td>Is player props market: <code>true</code> or <code>false</code>.</td></tr><tr><td>isOneSidePlayerPropsMarket</td><td>boolean</td><td>Is one-side player props market (who will score first/last touchdown...): <code>true</code> or <code>false</code>.</td></tr><tr><td>isYesNoPlayerPropsMarket</td><td>boolean</td><td>Is YES/NO player props market (double-double, triple-double...): <code>true</code> or <code>false</code>.</td></tr><tr><td>playerProps</td><td><a href="#playerprops">PlayerProps</a></td><td>Player info (if player props market)</td></tr><tr><td>selectedCombinedPositions</td><td><a href="#combinedposition">CombinedPosition</a>[]</td><td>Selected combined positions if the market is that type (half-time/full-time, winner+total...)</td></tr><tr><td>position</td><td>number</td><td>Selected position on the market</td></tr><tr><td>odd</td><td><a href="#odds">Odds</a></td><td>Market odds</td></tr><tr><td>gameStatus</td><td>string</td><td>Current game status</td></tr><tr><td>isGameFinished</td><td>boolean</td><td>Is game finished: <code>true</code> or <code>false</code>.</td></tr><tr><td>homeScore</td><td>number | string</td><td>Home team score or player score if the market is player props market</td></tr><tr><td>awayScore</td><td>number | string</td><td>Away team score or 0 if the market is player props market</td></tr><tr><td>homeScoreByPeriod</td><td>number[]</td><td>Home team score by period</td></tr><tr><td>awayScoreByPeriod</td><td>number[]</td><td>Away team score by period</td></tr></tbody></table>

#### PlayerProps

<table><thead><tr><th width="196">Name</th><th width="170">Type</th><th>Description</th></tr></thead><tbody><tr><td>playerId</td><td>number</td><td>Player ID</td></tr><tr><td>playerName</td><td>string</td><td>The name of the player</td></tr><tr><td>playerScore</td><td>number | string</td><td>Player score</td></tr></tbody></table>

#### CombinedPosition

<table><thead><tr><th width="196">Name</th><th width="172">Type</th><th>Description</th></tr></thead><tbody><tr><td>typeId</td><td>number</td><td>The type ID of single market</td></tr><tr><td>position</td><td>number</td><td>The position on the single market</td></tr><tr><td>line</td><td>number</td><td>Single market line</td></tr></tbody></table>

#### Odds

<table><thead><tr><th width="196">Name</th><th width="173">Type</th><th>Description</th></tr></thead><tbody><tr><td>american</td><td>number</td><td>American format of the odds</td></tr><tr><td>decimal</td><td>number</td><td>Decimal format of the odds</td></tr><tr><td>normalizedImplied</td><td>number</td><td>Normalized Implied format of the odds</td></tr></tbody></table>


# Overtime V2 quote data

Get quote data for a ticket.

{% hint style="info" %} <mark style="color:blue;">**Users placing trades with THALES will get 1% extra payouts for each game they have on their ticket.**</mark>
{% endhint %}

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:orange;">`POST`</mark> `https://api.overtime.io/overtime-v2/networks/{{network}}/quote`

See quote API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#c003b5d1-84f1-422c-a7d2-154241aa148c).

### Example Request

<https://api.overtime.io/overtime-v2/networks/10/quote>

#### Request body

```json
{
    "buyInAmount": 20,
    "tradeData": [
        {
            "gameId": "0x3430343338353300000000000000000000000000000000000000000000000000",
            "sportId": 50,
            "typeId": 0,
            "maturity": 1719342000,
            "status": 0,
            "line": 0,
            "playerId": 0,
            "odds": [
                0.740740740741,
                0.102249488753,
                0.208768267223
            ],
            "merkleProof": [
                "0xc4788d799bccce5adea24c9a3088da1072ba0a4e7405184cf164cd8bc8dc715e",
                "0x8f2f3a9252434ac2320a8b9833608ef0bd382a145880216e28fc16048bbdf8b2",
                "0x7fd099566663a5ebede7a59fef79a517fba1d3d41e387393347d7c6934f9d284",
                "0x2673a92127311f5da209b213b893a2593355c8e3861dc58972ce6481a61cdc6e",
                "0x34fb69550251ccd91c37fe74fde3e871edec0cc72b34cf8f81dc062a9576e4e4",
                "0xba41529042360b755dc63ee09acc6e666eeae346d945a1b4067aef22b7e7e2b8"
            ],
            "position": 1,
            "combinedPositions": [
                [],
                [],
                []
            ],
            "live": false
        }
    ],
    "collateral": "THALES"
}
```

### Request Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="213">Name</th><th width="224">Type</th><th>Description</th></tr></thead><tbody><tr><td>buyInAmount<mark style="color:red;">*</mark></td><td>number</td><td>(Required) Buy-in amount</td></tr><tr><td>tradeData<mark style="color:red;">*</mark></td><td><a href="#response-parameters-1">TradeData</a>[]</td><td>(Required) Markets data obtained from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ">Markets API</a>.</td></tr><tr><td>collateral</td><td>string</td><td>(Optional) Collateral used for trade. If omitted, default collateral will be used for quote.</td></tr></tbody></table>

#### TradeData <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="213">Name</th><th width="224">Type</th><th>Description</th></tr></thead><tbody><tr><td>gameId</td><td>string</td><td>Game ID from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>sportId</td><td>number</td><td>Subleague ID from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>typeId</td><td>number</td><td>Type ID from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>maturity</td><td>number</td><td>Maturity from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>status</td><td>number</td><td>Status from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>line</td><td>number</td><td>Line from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>playerId</td><td>number</td><td>Player ID from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>odds</td><td>number[]</td><td>Normalized Implied odds from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>merkleProof</td><td>string[]</td><td>Proof from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>position</td><td>number</td><td>Selected position on the market.</td></tr><tr><td>combinedPositions</td><td><a href="/pages/7KFVAdCVy8Yuhc22tEuJ#combinedposition">CombinedPosition</a>[][]</td><td>Combined positions from <a href="/pages/7KFVAdCVy8Yuhc22tEuJ#response-parameters">Markets API response</a>.</td></tr><tr><td>live</td><td>boolean</td><td>Always <code>false</code>. The quote endpoint is not used for live markets.</td></tr></tbody></table>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{
  "quoteData": {
    "totalQuote": {
      "american": 887.8787878745005,
      "decimal": 9.878787878745005,
      "normalizedImplied": 0.10122699386547
    },
    "payout": {
      "THALES": 197.5757575749001,
      "usd": 49.08809212099907,
      "payoutCollateral": "THALES"
    },
    "potentialProfit": {
      "THALES": 177.5757575749001,
      "usd": 44.11905212099907,
      "percentage": 8.878787878745005
    },
    "buyInAmountInUsd": 4.96904
  },
  "liquidityData": {
    "ticketLiquidityInUsd": 1187
  }
}
```

{% endtab %}

{% tab title="200 OK (validation error)" %}

```json
{
    "quoteData": {
        "error": "Not enough liquidity for provided buy-in amount."
    },
    "liquidityData": {
        "ticketLiquidityInUsd": 1260
    }
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="196">Name</th><th width="140">Type</th><th>Description</th></tr></thead><tbody><tr><td>quoteData</td><td><a href="#response-parameters-3">QuoteData</a></td><td>Ticket quote data</td></tr><tr><td>liquidityData</td><td><a href="#liquiditydata">LiquidityData</a></td><td>Ticket liquidity data</td></tr></tbody></table>

#### QuoteData <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="196">Name</th><th width="143">Type</th><th>Description</th></tr></thead><tbody><tr><td>totalQuote</td><td><a href="/pages/7KFVAdCVy8Yuhc22tEuJ#odds">Odds</a></td><td>Ticket total quote</td></tr><tr><td>payout</td><td><a href="#payoutdata">PayoutData</a></td><td>Ticket payout data</td></tr><tr><td>potentialProfit</td><td><a href="#profitdata">ProfitData</a></td><td>Ticket profit data</td></tr><tr><td>buyInAmountInUsd</td><td>number</td><td>Buy-in amount in default collateral</td></tr></tbody></table>

#### PayoutData

<table><thead><tr><th width="196">Name</th><th width="145">Type</th><th>Description</th></tr></thead><tbody><tr><td>[collateral]</td><td>number</td><td>Potential payout in collateral. Available only for THALES, ETH, or WETH. More about the V2 collateral upgrade in <a href="https://medium.com/@OvertimeMarkets.xyz/overtime-v2-public-beta-is-live-e2109ee4d348">the Medium article</a>.</td></tr><tr><td>usd</td><td>number</td><td>Potential payout in default collateral</td></tr><tr><td>payoutCollateral</td><td>string</td><td>Default payout collateral. For THALES, ETH, or WETH only available payout collateral is the one used for trade. More about the V2 collateral upgrade in <a href="https://medium.com/@OvertimeMarkets.xyz/overtime-v2-public-beta-is-live-e2109ee4d348">the Medium article</a>.</td></tr></tbody></table>

#### ProfitData

<table><thead><tr><th width="196">Name</th><th width="149">Type</th><th>Description</th></tr></thead><tbody><tr><td>[collateral]</td><td>number</td><td>Potential profit in collateral. Available only for THALES, ETH, or WETH. More about the V2 collateral upgrade in <a href="https://medium.com/@OvertimeMarkets.xyz/overtime-v2-public-beta-is-live-e2109ee4d348">the Medium article</a>.</td></tr><tr><td>usd</td><td>number</td><td>Potential profit in default collateral</td></tr><tr><td>percentage</td><td>number</td><td>Potential profit in percentage</td></tr></tbody></table>

#### LiquidityData

<table><thead><tr><th width="196">Name</th><th width="173">Type</th><th>Description</th></tr></thead><tbody><tr><td>ticketLiquidityInUsd</td><td>number</td><td>Available liquidity for the ticket in default collateral</td></tr></tbody></table>


# Overtime V2 games info

Get a list of basic info for all games or per single game.

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/games-info`

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/games-info/{{gameId}}`

See games info API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#8e7b5e23-7a75-4332-b1cc-95d4d503dcea).

### Example Request

<https://api.overtime.io/overtime-v2/games-info>

#### Single game request

<https://api.overtime.io/overtime-v2/games-info/0x3434383338363000000000000000000000000000000000000000000000000000>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{
  "0x3430343338333700000000000000000000000000000000000000000000000000": {
    "lastUpdate": 1718667622606,
    "gameStatus": "finished",
    "isGameFinished": true,
    "tournamentName": "EURO Grp. A",
    "teams": [
      {
        "name": "Germany",
        "isHome": true,
        "score": 5,
        "scoreByPeriod": [
          3
        ]
      },
      {
        "name": "Scotland",
        "isHome": false,
        "score": 1,
        "scoreByPeriod": [
          0
        ]
      }
    ]
  }
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="220">Name</th><th width="195">Type</th><th>Description</th></tr></thead><tbody><tr><td>lastUpdate</td><td>number</td><td>Timestamp of last update </td></tr><tr><td>gameStatus</td><td>string</td><td>Current game status</td></tr><tr><td>isGameFinished</td><td>boolean</td><td>Is game finished: <code>true</code> or <code>false</code>.</td></tr><tr><td>tournamentName</td><td>string</td><td>Name of the tournament (if available)</td></tr><tr><td>tournamentRound</td><td>string</td><td>Round of the tournament (if available)</td></tr><tr><td>teams</td><td><a href="#teaminfo">TeamInfo</a>[]</td><td>Info about teams</td></tr></tbody></table>

#### TeamInfo

<table><thead><tr><th width="221">Name</th><th width="194">Type</th><th>Description</th></tr></thead><tbody><tr><td>name</td><td>string</td><td>The name of the team</td></tr><tr><td>isHome</td><td>boolean</td><td>Is home team: <code>true</code> or <code>false</code>.</td></tr><tr><td>score</td><td>number</td><td>Team score</td></tr><tr><td>scoreByPeriod</td><td>number[]</td><td>Team score by period</td></tr></tbody></table>

###


# Overtime V2 players info

Get a list of basic info for all players or per single player.

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/players-info`

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/players-info/{{playerId}}`

See players info API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#136dda1d-ab97-4652-bd66-586614e8fad0).

### Example Request

<https://api.overtime.io/overtime-v2/players-info>

#### Single player request

<https://api.overtime.io/overtime-v2/players-info/1956>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{
  "361": {
    "playerName": "Blake Walston"
  },
  "386": {
    "playerName": "Jordan Westburg"
  },
  "396": {
    "playerName": "Brayan Bello"
  }
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="215">Name</th><th width="179">Type</th><th>Description</th></tr></thead><tbody><tr><td>playerName</td><td>string</td><td>The name of the player</td></tr></tbody></table>

###


# Overtime V2 live scores

Get a live scores for games or per single game (in case the provider supports live scores).

## REST API <a href="#rest-api" id="rest-api"></a>

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/live-scores`

<mark style="color:green;">`GET`</mark>  `https://api.overtime.io/overtime-v2/live-scores/{{gameId}}`

See live scores API endpoint with request/response examples under [Postman documentation](https://documenter.getpostman.com/view/1435701/2sA3XY5Hao#78bbfe42-8240-431a-bb2f-812df167bdd5).

### Example Request

<https://api.overtime.io/overtime-v2/live-scores>

#### Single game request

<https://api.overtime.io/overtime-v2/live-scores/0x3133386537313735646435636664666431396361323935363931343036613235>

### Example Response

{% tabs %}
{% tab title="200 OK" %}

```json
{
  "period": 9,
  "gameStatus": "STATUS_FINAL",
  "displayClock": "0.00",
  "homeScore": 6,
  "awayScore": 5,
  "homeScoreByPeriod": [
    0,
    0,
    2,
    0,
    3,
    0,
    0,
    1
  ],
  "awayScoreByPeriod": [
    0,
    0,
    0,
    0,
    0,
    1,
    0,
    0,
    4
  ]
}
```

{% endtab %}
{% endtabs %}

### Response Parameters <a href="#response-parameters" id="response-parameters"></a>

<table><thead><tr><th width="219">Name</th><th width="175">Type</th><th>Description</th></tr></thead><tbody><tr><td>period</td><td>number</td><td>Current game period</td></tr><tr><td>gameStatus</td><td>string</td><td>Current game status</td></tr><tr><td>displayClock</td><td>string</td><td>Current time in the game</td></tr><tr><td>homeScore</td><td>number</td><td>Home team score</td></tr><tr><td>awayScore</td><td>number</td><td>Away team score</td></tr><tr><td>homeScoreByPeriod</td><td>number[]</td><td>Home team score by period</td></tr><tr><td>awayScoreByPeriod</td><td>number[]</td><td>Away team score by period</td></tr></tbody></table>


# Marketing Assets

## SVG

#### Logo

<div><figure><img src="/files/xKyrvNbXRUqcTu1gDUMt" alt=""><figcaption><p>Dark</p></figcaption></figure> <figure><img src="/files/5rzm4okM58Uy1aLyjLlY" alt=""><figcaption><p>White</p></figcaption></figure></div>

#### Wordmark

<figure><img src="/files/fCmtyfFTX9FwA3uvad0j" alt=""><figcaption><p>Dark</p></figcaption></figure>

<figure><img src="/files/lHpfx7Qsyr1TEH9ObuY9" alt=""><figcaption><p>White</p></figcaption></figure>

## PNG

#### Logo

<div><figure><img src="/files/LXuRq0pVxBEVwHrI37Ya" alt=""><figcaption><p>Dark</p></figcaption></figure> <figure><img src="/files/XQaGHuEE4JkQMfGZ3HZr" alt=""><figcaption><p>White</p></figcaption></figure></div>

#### Wordmark

<figure><img src="/files/zgrKZ14qSchATyr2cw3N" alt=""><figcaption><p>Dark</p></figcaption></figure>

<figure><img src="/files/PA0bqvsKNdx3sXnBFMTE" alt=""><figcaption><p>White</p></figcaption></figure>


# Terms of Use

Overtime is a platform that people can use to participate in Sports Markets in a permissionless way. Overtime is made up of free, public, open-source or source-available software including a set of smart contracts that are deployed on the Ethereum Blockchain.&#x20;

Your use of Overtime involves various risks, including, but not limited to, smart contracts risk. Before using the Overtime platform, you should review the relevant documentation to ensure you understand how it works.

&#x20;OVERTIME IS PROVIDED "AS IS", AT YOUR OWN RISK, AND WITHOUT WARRANTIES OF ANY KIND. YOU SHOULD NOT USE OVERTIME IF DOING SO IS ILLEGAL OR IMPERMISSIBLE ACCORDING TO ANY APPLICABLE LAWS IN YOUR JURISDICTION. Although individual developers provide most of the code of Overtime they do not provide, own, or control Overtime, which is run by smart contracts deployed on the Ethereum blockchain. Upgrades and modifications to the platform are managed in a community-driven way by holders of the OVER governance token. No developer or entity involved in creating Overtime will be liable for any claims or damages whatsoever associated with your use, inability to use, or your interaction with other users of Overtime, including any direct, indirect, incidental, special, exemplary, punitive or consequential damages, or loss of profits, cryptocurrencies, tokens, or anything else of value.&#x20;

Prohibited Uses:&#x20;

The user may access or use Overtime only for lawful purposes and in accordance with the use cases described in this disclaimer. The user agrees not to use or access Overtime:&#x20;

* In any way that violates any applicable federal, state, local, or international law or regulation (including, without limitation, any laws regarding the export of data or software to and from the US or other countries).&#x20;
* For the purpose of exploiting, harming, or attempting to exploit or harm minors in any way by exposing them to inappropriate content, asking for personally identifiable information, or otherwise.&#x20;
* To transmit, or procure the sending of, any advertising or promotional material, including any “junk mail,” “chain letter,” “spam,” or any other similar solicitation.&#x20;
* To impersonate or attempt to impersonate Overtime Markets, another user, or any other related person or entity (including, without limitation, by using email addresses, screen names, similarly named or commonly misspelt URLs, or associated blockchain identities).&#x20;
* To engage in any other conduct that restricts or inhibits anyone’s use or enjoyment of the Overtime Markets, or which, as determined by us, may harm Overtime Markets or its users, or expose them to liability.&#x20;
* If they are a citizen of or otherwise accessing Overtime Markets from the United States and its territories or from the nations of Belarus, Burma, China, Cuba, Democratic Republic of Congo, Iran, Iraq, Liberia, North Korea, Sudan, Syria, and Zimbabwe (collectively, “Prohibited Jurisdictions”), or if the User is otherwise listed as a Specially Designated National by the United States Office of Foreign Asset Control (OFAC).&#x20;
* If doing so is illegal or impermissible according to any Applicable Laws.&#x20;
* To cause Overtime, any of the Overtime underlying blockchain networks or technologies, or any other functionality with which Overtime interact to work other than as intended.&#x20;
* To take any action that may be reasonably construed as fraud, deceit, or manipulation.


