# Table of Contents - [o1.exchange - Democratizing Alpha for Traders - o1 Exchange](#o1-exchange-democratizing-alpha-for-traders-o1-exchange) - [Integration patterns - o1 Exchange](#integration-patterns-o1-exchange) - [Introduction - o1 Exchange](#introduction-o1-exchange) - [Changelog - o1 Exchange](#changelog-o1-exchange) - [Alliance DAO - o1 Exchange](#alliance-dao-o1-exchange) - [Native ETH - o1 Exchange](#native-eth-o1-exchange) - [Error handling - o1 Exchange](#error-handling-o1-exchange) - [POST /submit - o1 Exchange](#post-submit-o1-exchange) - [Authentication - o1 Exchange](#authentication-o1-exchange) - [POST /execute - o1 Exchange](#post-execute-o1-exchange) - [Bug Bounty Program - o1 Exchange](#bug-bounty-program-o1-exchange) - [GET /health - o1 Exchange](#get-health-o1-exchange) - [Quote freshness - o1 Exchange](#quote-freshness-o1-exchange) - [Router contract - o1 Exchange](#router-contract-o1-exchange) - [Rate limits - o1 Exchange](#rate-limits-o1-exchange) - [ERC-20 approvals - o1 Exchange](#erc-20-approvals-o1-exchange) - [POST /quote - o1 Exchange](#post-quote-o1-exchange) - [Community & Socials - o1 Exchange](#community-socials-o1-exchange) - [Trading API - o1 Exchange](#trading-api-o1-exchange) - [Supported DEXes - o1 Exchange](#supported-dexes-o1-exchange) - [Onramp Fiat to Crypto - o1 Exchange](#onramp-fiat-to-crypto-o1-exchange) - [Quickstart - o1 Exchange](#quickstart-o1-exchange) - [Referrals & Rewards - o1 Exchange](#referrals-rewards-o1-exchange) - [Trading - o1 Exchange](#trading-o1-exchange) - [Platform Metrics - o1 Exchange](#platform-metrics-o1-exchange) - [RoutePlan schema - o1 Exchange](#routeplan-schema-o1-exchange) - [Portfolio - o1 Exchange](#portfolio-o1-exchange) - [Explore Tokens - o1 Exchange](#explore-tokens-o1-exchange) - [Trading Season 1: Early Beta - o1 Exchange](#trading-season-1-early-beta-o1-exchange) - [Zora Trading Contest Season 2 - o1 Exchange](#zora-trading-contest-season-2-o1-exchange) - [Introduction - o1 Exchange](#introduction-o1-exchange) - [Sign Up for o1.exchange - o1 Exchange](#sign-up-for-o1-exchange-o1-exchange) - [Zora Trading Contest - o1 Exchange](#zora-trading-contest-o1-exchange) - [Interface and data flow - o1 Exchange](#interface-and-data-flow-o1-exchange) - [Limits and validation - o1 Exchange](#limits-and-validation-o1-exchange) - [Plan your launch - o1 Exchange](#plan-your-launch-o1-exchange) - [Live configuration - o1 Exchange](#live-configuration-o1-exchange) - [Configuration and governance - o1 Exchange](#configuration-and-governance-o1-exchange) - [Direct contract integration - o1 Exchange](#direct-contract-integration-o1-exchange) - [How it works - o1 Exchange](#how-it-works-o1-exchange) - [Functions and events - o1 Exchange](#functions-and-events-o1-exchange) - [Smart contract architecture - o1 Exchange](#smart-contract-architecture-o1-exchange) - [Trading Season 2: Base - o1 Exchange](#trading-season-2-base-o1-exchange) - [Production contracts - o1 Exchange](#production-contracts-o1-exchange) - [Token creation - o1 Exchange](#token-creation-o1-exchange) - [Data and AI access - o1 Exchange](#data-and-ai-access-o1-exchange) - [Single-sided liquidity - o1 Exchange](#single-sided-liquidity-o1-exchange) - [Allocations and vesting - o1 Exchange](#allocations-and-vesting-o1-exchange) - [Fee and vesting claims - o1 Exchange](#fee-and-vesting-claims-o1-exchange) - [Fees, anti-snipe, and referrals - o1 Exchange](#fees-anti-snipe-and-referrals-o1-exchange) - [MiCA Whitepaper - o1 Exchange](#mica-whitepaper-o1-exchange) - [Disclosure - o1 Exchange](#disclosure-o1-exchange) - [Whitepaper - o1 Exchange](#whitepaper-o1-exchange) - [Community - o1 Exchange](#community-o1-exchange) - [Token Contract Audits - o1 Exchange](#token-contract-audits-o1-exchange) - [Security and audit - o1 Exchange](#security-and-audit-o1-exchange) - [Unknown](#unknown) - [Unknown](#unknown) - [Unknown](#unknown) - [Unknown](#unknown) --- # o1.exchange - Democratizing Alpha for Traders - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/introduction#content-area) ![o1 Exchange Banner](https://mintcdn.com/o1exchange/oT65TLl8ZhYFDcTt/images/o1-banner.png?w=2500&fit=max&auto=format&n=oT65TLl8ZhYFDcTt&q=85&s=387e02f186f030cbab729ce2d7b56f42) o1.exchange represents the pinnacle of high-frequency trading infrastructure on-chain — architected for unparalleled execution speed, engineered for quantitative edge, and optimized for full-range traders, from beginners to the pro. o1.exchange is the next-generation trading platform built for the DeFi ecosystem, combining institutional-grade infrastructure with an intuitive user experience for traders of all levels. [​](https://docs.o1.exchange/introduction#unmatched-trading-performance) Unmatched Trading Performance --------------------------------------------------------------------------------------------------------- Lightning-fast Execution ------------------------ Achieve microsecond-level transaction finality for optimal trade execution Quantitative Edge ----------------- Leverage proprietary algorithms designed for maximum market advantage Seamless Experience ------------------- Intuitive interface that scales from beginners to professional traders [​](https://docs.o1.exchange/introduction#powered-by-advanced-intelligence) Powered by Advanced Intelligence --------------------------------------------------------------------------------------------------------------- Alpha-Generating Opportunities Our platform identifies profitable trading opportunities before they appear in market prices, giving you the edge to act first. Real-time Analytics Comprehensive analysis of on-chain metrics, social sentiment, and liquidity patterns delivered in real-time to inform your trading decisions. Institutional-Grade Insights Access exclusive market insights typically reserved for institutional traders, now available on our platform. [​](https://docs.o1.exchange/introduction#full-spectrum-trading-ecosystem) Full-spectrum Trading Ecosystem ------------------------------------------------------------------------------------------------------------- * Memecoins * Tokenized Assets * Cross-chain Trade memecoins with confidence using our advanced predictive analytics that help identify trends before the market. Access a wide range of tokenized equities and synthetic assets all from one unified platform. Seamlessly trade across multiple blockchains with our unified liquidity pools and cross-chain infrastructure. Experience the future of trading with o1.exchange - where speed, intelligence, and accessibility converge. [Alliance DAO](https://docs.o1.exchange/AllianceDAO) ⌘I --- # Integration patterns - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns#content-area) The DEX Aggregator API supports two integration shapes. They produce equivalent on-chain transactions; the difference is when the routing engine runs. Two-step -------- `/quote` → human reviews price → `/submit` → broadcast.Best for swap UIs. One-step -------- `/execute` → broadcast.Best for one-click flows and bots. [​](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns#two-step-recommended-for-swap-uis) Two-step (recommended for swap UIs) ----------------------------------------------------------------------------------------------------------------------------------------------------- Use this flow when a user reviews the quoted price before they commit. // 1. Quote const quote = await fetch(`${API_URL}/quote`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json" }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", slippageBps: 100, }), }).then((r) => r.json()); // 2. Display to user showQuote({ output: formatUnits(BigInt(quote.routePlan.expectedAmountOut), 18), minOutput: formatUnits(BigInt(quote.routePlan.minAmountOut), 18), route: quote.routePlan.routes .map((r) => r.legs.map((l) => l.dex).join(" → ")) .join(" | "), fee: `${(quote.routePlan.feeBps ?? 0) / 100}%`, }); // 3. User clicks "Swap" → build tx const submit = await fetch(`${API_URL}/submit`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: quote.quoteId, user: walletAddress, }), }).then((r) => r.json()); // 4. Send to wallet const txHash = await walletClient.sendTransaction({ to: submit.to as `0x${string}`, data: submit.data as `0x${string}`, value: BigInt(submit.value), }); ### [​](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns#pros) Pros * User confirms the price they see; no last-second surprise. * You can run validation between quote and submit (e.g. “is this trade > $X? require a confirm dialog”). * Clean separation between read (quote) and write (submit) for caching, analytics, and rate limiting. ### [​](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns#cons) Cons * Quotes have a TTL (~10 seconds). If the user takes too long, `/submit` returns `404` and you must re-quote. See [Quote freshness](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness) . * Two API calls per swap. * * * [​](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns#one-step-instant-swap) One-step (instant swap) ----------------------------------------------------------------------------------------------------------------------------- Use this flow when there’s no preview step. const exec = await fetch(`${API_URL}/execute`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json" }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", slippageBps: 100, user: walletAddress, }), }).then((r) => r.json()); const txHash = await walletClient.sendTransaction({ to: exec.to as `0x${string}`, data: exec.data as `0x${string}`, value: BigInt(exec.value), }); ### [​](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns#pros-2) Pros * Single round trip. * No `quoteId` to track, no expiry to handle. ### [​](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns#cons-2) Cons * The user (or bot) doesn’t see the price before signing. If you still want to show it, log `exec.routePlan.expectedAmountOut` after the fact. * Less flexibility for caching and analytics, since each call rebuilds the full route plan server-side. * * * [​](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns#choosing-the-right-pattern) Choosing the right pattern ------------------------------------------------------------------------------------------------------------------------------------- | Use case | Pattern | | --- | --- | | Standard swap UI with confirm dialog | Two-step | | One-click “swap now” button | One-step | | Server-side market-maker / bot | One-step | | Limit-order style flow with delayed execution | Two-step (re-quote on each tick) | | Mobile UI with poor connectivity | One-step (fewer round trips) | Even when you use `/execute` for the user-facing call, you can still hit `/quote` separately for live price display in the modal. Just be aware they consume separate rate-limit budget. [​](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns#always-handle-expired-quotes) Always: handle expired quotes ------------------------------------------------------------------------------------------------------------------------------------------ Whichever pattern you pick, treat `404 quote not found or expired` from `/submit` as recoverable: re-fetch `/quote` with the same parameters and retry. Don’t surface this as a user-facing error unless it happens repeatedly. See [Quote freshness](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness) for the full pattern. [GET /health](https://docs.o1.exchange/api/dex-aggregator/endpoints/health) [ERC-20 approvals](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals) ⌘I --- # Introduction - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/introduction#content-area) The DEX Aggregator API is currently **Base mainnet only** (`chainId: 8453`). Multi-chain support is on the roadmap. The o1.exchange DEX Aggregator API gives you institutional-grade swap pricing on Base in two HTTP calls. The routing engine searches across 20+ on-chain venues, splits trades when it improves output, and returns broadcast-ready calldata for the canonical `O1Router` contract. Multi-venue routing ------------------- Quotes pulled from Uniswap V2/V3/V4, Aerodrome, PancakeSwap, Curve, DODO, WooFi, Hydrex, and proprietary on-chain PMMs. Split optimization ------------------ A convex solver allocates input across multiple paths when the marginal output beats a single-route quote. Permit-enabled swaps -------------------- Optional EIP-2612 permit payload lets the router pull tokens in the same transaction as the swap, no separate approval needed. [​](https://docs.o1.exchange/api/dex-aggregator/introduction#how-it-works) How it works ------------------------------------------------------------------------------------------ 1 [](https://docs.o1.exchange/api/dex-aggregator/introduction#) POST /quote Send `chainId`, `tokenIn`, `tokenOut`, `amountIn`, and `slippageBps`. Receive a `quoteId`, an `expectedAmountOut`, and a `routePlan` describing which venues will be used. 2 [](https://docs.o1.exchange/api/dex-aggregator/introduction#) POST /submit Echo the `quoteId` plus the user’s wallet address. Receive `{ to, data, value }`, ready to hand to any EVM signer. 3 [](https://docs.o1.exchange/api/dex-aggregator/introduction#) Broadcast The user’s wallet signs and submits the transaction. The router executes all legs atomically and emits the configured slippage check. If you don’t need a price preview step, [`POST /execute`](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute) collapses quote and submit into one call. [​](https://docs.o1.exchange/api/dex-aggregator/introduction#what-you-get) What you get ------------------------------------------------------------------------------------------ Atomic split routes ------------------- Up to 3 hops per route, multiple routes per swap. Slippage is checked per-leg and globally inside the router contract. Native ETH support ------------------ Use `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) as the `tokenIn` / `tokenOut` to swap raw ETH; the router handles the wrap and unwrap automatically. Integrator fees --------------- Pass `feeBps` on the quote request to take a cut of the output. The fee is enforced inside the router contract, not the API. [​](https://docs.o1.exchange/api/dex-aggregator/introduction#architecture-at-a-glance) Architecture at a glance ------------------------------------------------------------------------------------------------------------------ The aggregator has three layers: 1. **Routing engine:** `packages/sdk/src/router` runs beam-search path finding plus split optimization. It calls a pool repository (live Codex queries by default) to fetch reserves and tick state. 2. **HTTP API:** Exposed by Convex HTTP actions in production and a Fastify service for self-hosting. Handles auth, rate limiting, quote storage, and calldata assembly. 3. **On-chain layer:** `O1Router.swapExactIn(...)` dispatches each leg to a venue adapter, enforces slippage, and optionally wraps or unwraps native ETH. For the algorithmic details (beam search, convex split solver, AMM math per venue), see [`docs/ALGORITHM.md`](https://github.com/o1exchange/o1-dex-agg/blob/main/docs/ALGORITHM.md) in the source repo. [​](https://docs.o1.exchange/api/dex-aggregator/introduction#choose-your-integration-pattern) Choose your integration pattern -------------------------------------------------------------------------------------------------------------------------------- * Two-step (recommended for swap UIs) * One-step (instant swap) Best when the user reviews the price before committing. POST /quote → show quote, poll until user clicks "Swap" POST /submit → build the tx sign + send → user wallet broadcasts See the [Quickstart](https://docs.o1.exchange/api/dex-aggregator/quickstart) for full code. Best for one-click flows, bots, and server-side integrations where there’s no price preview. POST /execute → returns quote + calldata in one call sign + send → user wallet broadcasts See [`POST /execute`](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute) for the full request shape. [​](https://docs.o1.exchange/api/dex-aggregator/introduction#next-steps) Next steps -------------------------------------------------------------------------------------- Quickstart ---------- Your first quote and swap in 30 lines of TypeScript. Authentication -------------- How to obtain and use an API key. Endpoint reference ------------------ Request and response schemas for every endpoint. Supported DEXes --------------- The full list of venues in the routing graph. Already integrating? Skim [Quote freshness](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness) and [Error handling](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling) before you ship. They cover the two failure modes that catch most teams. [Trading API](https://docs.o1.exchange/api/trading) [Quickstart](https://docs.o1.exchange/api/dex-aggregator/quickstart) ⌘I --- # Changelog - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/reference/changelog#content-area) This page tracks user-visible changes to the DEX Aggregator API. Breaking changes are flagged explicitly. [​](https://docs.o1.exchange/api/dex-aggregator/reference/changelog#2026-04-30-%E2%80%94-public-docs-published) 2026-04-30 — Public docs published ----------------------------------------------------------------------------------------------------------------------------------------------------- * Initial public documentation for the DEX Aggregator API at `docs.o1.exchange/api/dex-aggregator`. * Endpoints: `/quote`, `/submit`, `/execute`, `/health`. * Live on Base mainnet (chain ID `8453`). * Default rate limit: 120 requests / minute / API key. * Router contract: [`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3`](https://basescan.org/address/0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3) . [​](https://docs.o1.exchange/api/dex-aggregator/reference/changelog#versioning-policy) Versioning policy ----------------------------------------------------------------------------------------------------------- The API does not use a versioned URL prefix today. We treat published behavior as stable and add fields additively whenever possible. Breaking changes will be: 1. Pre-announced here at least two weeks before deployment. 2. Mirrored at a versioned path (`/v1/quote`, `/v2/quote`) for the duration of the migration window. 3. Documented with a migration note describing the old and new shapes. [​](https://docs.o1.exchange/api/dex-aggregator/reference/changelog#what-%E2%80%9Cbreaking%E2%80%9D-means) What “breaking” means ----------------------------------------------------------------------------------------------------------------------------------- * Removing or renaming a field on a response. * Changing the type or units of an existing field. * Tightening a validation rule that previously accepted a value. * Removing or renaming an endpoint. Adding new optional request fields, new optional response fields, or new endpoints is **not** breaking. [​](https://docs.o1.exchange/api/dex-aggregator/reference/changelog#subscribing-to-updates) Subscribing to updates --------------------------------------------------------------------------------------------------------------------- If you’d like change notifications, contact the o1 team to be added to an integrator mailing list. The changelog page here is the canonical record either way. [Rate limits](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits) [Whitepaper](https://docs.o1.exchange/token/whitepaper) ⌘I --- # Alliance DAO - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/AllianceDAO#content-area) ![Alliance DAO Partnership](https://mintcdn.com/o1exchange/oT65TLl8ZhYFDcTt/images/alliancedao.png?w=2500&fit=max&auto=format&n=oT65TLl8ZhYFDcTt&q=85&s=282ab0d25fe320798f3c3d093fde7a8a) [​](https://docs.o1.exchange/AllianceDAO#elite-backing) Elite Backing ------------------------------------------------------------------------ Alliance DAO ------------ First investor in [pump.fun](https://pump.fun/) , [Moonshot](https://moonshot.money/) , [Believe App](https://believe.app//) We’re proud to announce that o1.exchange is backed by these elite investors in the blockchain space and many more, bringing institutional credibility and strategic resources to our platform. These strategic partnerships empower o1.exchange to push the boundaries of DeFi trading technology. We’re rapidly developing cutting-edge solutions to deliver a divine trading experience that sets new standards in the industry. [o1.exchange - Democratizing Alpha for Traders](https://docs.o1.exchange/introduction) [Sign Up for o1.exchange](https://docs.o1.exchange/getting-started/signup) ⌘I --- # Native ETH - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth#content-area) The `O1Router` handles all wrapping and unwrapping internally. From the API caller’s perspective there are two flags: | Flag | Where | What it does | | --- | --- | --- | | `useNativeIn` | `/submit` (and `/execute`) | When `true`, send `msg.value = amountIn` and the router wraps to WETH before dispatching legs. | | `unwrapNativeOut` | `/submit` (and `/execute`) | When `true`, the router unwraps WETH to ETH for the recipient before completing the swap. | [​](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth#sentinel-addresses-for-native-eth) Sentinel addresses for native ETH ----------------------------------------------------------------------------------------------------------------------------------------- When you want to swap **native ETH** in `tokenIn` or `tokenOut`, use one of these sentinels: | Sentinel | Notes | | --- | --- | | `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` | Standard EIP-7528 native sentinel. Recommended. | | `0x0000000000000000000000000000000000000000` | Zero-address fallback, also accepted. | The aggregator detects either form and sets `routePlan.nativeIn` or `routePlan.nativeOut` to `true` automatically. You still need to set the corresponding flag on `/submit` or `/execute`, since the user might have changed their mind about wrapping between quote and submit. [​](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth#the-four-common-cases) The four common cases ----------------------------------------------------------------------------------------------------------------- * ETH → ERC-20 * ERC-20 → ETH * ETH → WETH (or WETH → ETH) * ERC-20 → ERC-20 Sell native ETH, receive an ERC-20 like USDC.**Quote:** { "tokenIn": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "tokenOut": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "amountIn": "1000000000000000000", "slippageBps": 100, "chainId": 8453 } **Submit:** { "quoteId": "...", "user": "0x...", "useNativeIn": true } **Send transaction:** the response `value` will equal `amountIn` (`1000000000000000000`). await walletClient.sendTransaction({ to: submit.to, data: submit.data, value: BigInt(submit.value), // = 1 ETH }); **Approval:** none needed. Sell an ERC-20 like USDC, receive native ETH.**Quote:** { "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "amountIn": "1000000000", "slippageBps": 100, "chainId": 8453 } **Submit:** { "quoteId": "...", "user": "0x...", "unwrapNativeOut": true } **Approval:** standard ERC-20 approve of the router for `amountIn`, or use `permit`.The router pulls USDC, swaps to WETH internally, then unwraps and sends ETH to `user` in the same transaction. A pure wrap or unwrap also goes through the aggregator. The router uses a no-op routing path — there’s no swap math involved, just a `deposit()` or `withdraw()` call against WETH.**Wrap:** { "tokenIn": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "tokenOut": "0x4200000000000000000000000000000000000006", ... } Then on `/submit` set `useNativeIn: true`.**Unwrap:** { "tokenIn": "0x4200000000000000000000000000000000000006", "tokenOut": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", ... } Then on `/submit` set `unwrapNativeOut: true`. No native handling. Don’t set either flag. The router pulls `tokenIn`, swaps to `tokenOut`, sends to the user.**Approval:** required (or use `permit`). [​](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth#common-mistakes) Common mistakes ----------------------------------------------------------------------------------------------------- Forgot useNativeIn ------------------ `/submit` response has `value: "0"` even though `tokenIn` was the native sentinel. Cause: you didn’t set `useNativeIn: true` on `/submit`. The API errs on the side of safety and assumes you might have changed your mind. Sending msg.value with an ERC-20 swap ------------------------------------- The router rejects any non-zero `msg.value` when `useNativeIn` is `false`. If your wallet is sending ETH along, double-check you didn’t carry over `value` from a previous swap. Approving WETH unnecessarily ---------------------------- For an `ETH → ERC-20` swap with `useNativeIn: true`, the user does not need to approve WETH. The router handles the wrap from `msg.value` and the resulting WETH never leaves the router contract. Missing unwrapNativeOut ----------------------- User receives WETH instead of ETH because `unwrapNativeOut` was omitted on `/submit`. Always set it explicitly when you want native ETH back. [​](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth#why-both-quote-and-submit-need-the-flag) Why both quote and submit need the flag ----------------------------------------------------------------------------------------------------------------------------------------------------- The aggregator detects native intent on `/quote` from the sentinel and sets `routePlan.nativeIn` / `routePlan.nativeOut`. But `/submit` requires you to re-confirm with the explicit flag because: 1. The `quoteId` is independent of the user. The same quote can be submitted by different users with different preferences. 2. Some integrators want to auto-wrap on the user’s behalf, e.g. always pull ERC-20 WETH from the user even when the quote was for native ETH. Always pass `useNativeIn` / `unwrapNativeOut` explicitly on `/submit` to remove ambiguity. [ERC-20 approvals](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals) [Quote freshness](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness) ⌘I --- # Error handling - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling#content-area) The API uses HTTP status codes plus a JSON body of the form `{ "error": "" }` for every error. This guide covers what each status code means and the right response. [​](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling#status-code-reference) Status code reference --------------------------------------------------------------------------------------------------------------------- | Status | Meaning | Retry? | | --- | --- | --- | | `200` | Success | n/a | | `400` | Validation error or no routes available | No (fix the request) | | `401` | Missing or invalid `x-api-key` | No (fix the key) | | `404` | Quote expired (only on `/submit`) | Yes (re-quote) | | `429` | Rate limit exceeded | Yes (backoff) | | `5xx` | Internal error | Yes (backoff with jitter) | [​](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling#common-error-messages) Common error messages --------------------------------------------------------------------------------------------------------------------- * 400 examples * 401 example * 404 example (only on /submit) * 429 example * 5xx (internal) { "error": "amountIn must be > 0" } { "error": "no routes for pair" } { "error": "slippageBps out of range" } { "error": "invalid token address" } **Treatment:** show the user a clear message (“This pair has no liquidity right now”), do not retry. If `no routes for pair` happens often for a specific token, the token may not have routable on-chain liquidity on Base. { "error": "unauthorized" } **Treatment:** verify the `x-api-key` header is set, the key is current, and your code isn’t accidentally trimming whitespace. If you’ve recently rotated, redeploy with the new key. { "error": "quote not found or expired" } **Treatment:** call `/quote` with the same parameters and submit again. Don’t show a user-facing error unless this happens twice in a row.See [Quote freshness](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness) for the full recovery pattern. { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } **Treatment:** back off for at least 1 second, ideally with jitter (`1s + random(0..500ms)`). If you sustain this, contact the o1 team to request a higher rate limit. { "error": "internal error" } **Treatment:** retry once after 1-2 seconds with jitter. If the second retry fails, surface a generic error to the user and emit an internal alert. [​](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling#on-chain-transaction-failures) On-chain transaction failures ------------------------------------------------------------------------------------------------------------------------------------- Errors above are HTTP errors. Once you have a `submit` response and broadcast the transaction, a separate class of failures can happen on-chain: | Revert reason | Likely cause | Fix | | --- | --- | --- | | `Slippage` | Pool state moved between `/quote` and inclusion. | Increase `slippageBps`, or re-quote and resend. | | `TRANSFER_FROM_FAILED` / `INSUFFICIENT_ALLOWANCE` | Allowance for `tokenIn` is below `amountIn`. | Approve the router for `amountIn`, or use a `permit` payload. | | `TRANSFER_FROM_FAILED` (with sufficient allowance) | The user’s balance is below `amountIn`. | Validate balance before submitting. | | `Permit failed` | Permit signature invalid or already consumed. | Re-sign with a fresh nonce; verify the EIP-712 domain matches the token. | | `Out of gas` | Gas estimate was too low (rare; happens during chain congestion). | Re-broadcast with a higher gas limit, e.g. `gasEstimate.gasUnits × 1.5`. | The on-chain `Slippage` revert is intentional. It means the safety net worked. If a user complains, the most common fix is “use slightly higher slippage” or “re-quote and retry quickly.” [​](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling#recommended-retry-policy) Recommended retry policy --------------------------------------------------------------------------------------------------------------------------- async function callWithRetry(fn: () => Promise, maxRetries = 2): Promise { for (let attempt = 0; attempt <= maxRetries; attempt++) { const res = await fn(); if (res.ok) return res.json(); const body = await res.json().catch(() => ({})); // Non-retryable: fix the request and return if (res.status === 400 || res.status === 401) { throw new Error(body.error ?? `${res.status}`); } // 404 on /submit: caller must re-quote. Bubble up a typed error. if (res.status === 404) { throw new Error("QUOTE_EXPIRED"); } // 429 / 5xx: back off and retry if (attempt === maxRetries) { throw new Error(body.error ?? `${res.status}`); } const baseDelay = res.status === 429 ? 1000 : 1500; const jitter = Math.random() * 500; await new Promise((r) => setTimeout(r, baseDelay + jitter)); } throw new Error("unreachable"); } Then in the submit handler: try { const submit = await callWithRetry(() => fetch(`${API_URL}/submit`, { /* ... */ }), ); // broadcast as usual } catch (e) { if (e.message === "QUOTE_EXPIRED") { const fresh = await refreshQuote(params); // retry submit with fresh.quoteId } else { showError(e.message); } } [​](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling#what-not-to-do) What NOT to do ------------------------------------------------------------------------------------------------------- Don't retry 400 errors ---------------------- `400` means the request itself is malformed or unroutable. Retrying doesn’t help; fix the request. Don't hammer on 429 ------------------- The rate limit window is per API key. Retrying immediately after a `429` makes the situation worse and burns the rest of your minute. Always back off. Don't surface raw errors to users --------------------------------- Translate `error` strings into UI-friendly copy. “no routes for pair” → “Couldn’t find liquidity for this pair, try a different amount or token.” Don't ignore on-chain reverts ----------------------------- Always check `receipt.status === "success"` after `waitForTransactionReceipt`. A `0x` tx hash is not the same as a successful swap. [Quote freshness](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness) [Router contract](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract) ⌘I --- # POST /submit - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#content-area) Build a broadcast-ready transaction for a previously issued quote cURL curl --request POST \ --url https://quiet-bloodhound-531.convex.site/submit \ --header 'Content-Type: application/json' \ --header 'x-api-key: ' \ --data ' { "quoteId": "", "user": "", "useNativeIn": true, "unwrapNativeOut": true, "gasPriceWei": "", "maxFeePerGasWei": "", "maxPriorityFeePerGasWei": "" } ' import requestsurl = "https://quiet-bloodhound-531.convex.site/submit"payload = { "quoteId": "", "user": "", "useNativeIn": True, "unwrapNativeOut": True, "gasPriceWei": "", "maxFeePerGasWei": "", "maxPriorityFeePerGasWei": ""}headers = { "x-api-key": "", "Content-Type": "application/json"}response = requests.post(url, json=payload, headers=headers)print(response.text) const options = { method: 'POST', headers: {'x-api-key': '', 'Content-Type': 'application/json'}, body: JSON.stringify({ quoteId: '', user: '', useNativeIn: true, unwrapNativeOut: true, gasPriceWei: '', maxFeePerGasWei: '', maxPriorityFeePerGasWei: '' })};fetch('https://quiet-bloodhound-531.convex.site/submit', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err)); "https://quiet-bloodhound-531.convex.site/submit", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode([ 'quoteId' => '', 'user' => '', 'useNativeIn' => true, 'unwrapNativeOut' => true, 'gasPriceWei' => '', 'maxFeePerGasWei' => '', 'maxPriorityFeePerGasWei' => '' ]), CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "x-api-key: " ],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;} package mainimport ( "fmt" "strings" "net/http" "io")func main() { url := "https://quiet-bloodhound-531.convex.site/submit" payload := strings.NewReader("{\n \"quoteId\": \"\",\n \"user\": \"\",\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true,\n \"gasPriceWei\": \"\",\n \"maxFeePerGasWei\": \"\",\n \"maxPriorityFeePerGasWei\": \"\"\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("x-api-key", "") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body))} HttpResponse response = Unirest.post("https://quiet-bloodhound-531.convex.site/submit") .header("x-api-key", "") .header("Content-Type", "application/json") .body("{\n \"quoteId\": \"\",\n \"user\": \"\",\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true,\n \"gasPriceWei\": \"\",\n \"maxFeePerGasWei\": \"\",\n \"maxPriorityFeePerGasWei\": \"\"\n}") .asString(); require 'uri'require 'net/http'url = URI("https://quiet-bloodhound-531.convex.site/submit")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Post.new(url)request["x-api-key"] = ''request["Content-Type"] = 'application/json'request.body = "{\n \"quoteId\": \"\",\n \"user\": \"\",\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true,\n \"gasPriceWei\": \"\",\n \"maxFeePerGasWei\": \"\",\n \"maxPriorityFeePerGasWei\": \"\"\n}"response = http.request(request)puts response.read_body 200 400 401 404 429 { "quoteId": "", "chainId": 123, "to": "", "data": "", "value": "" } { "error": ""} { "error": ""} { "error": ""} { "error": ""} POST / submit Try it Build a broadcast-ready transaction for a previously issued quote cURL curl --request POST \ --url https://quiet-bloodhound-531.convex.site/submit \ --header 'Content-Type: application/json' \ --header 'x-api-key: ' \ --data ' { "quoteId": "", "user": "", "useNativeIn": true, "unwrapNativeOut": true, "gasPriceWei": "", "maxFeePerGasWei": "", "maxPriorityFeePerGasWei": "" } ' import requestsurl = "https://quiet-bloodhound-531.convex.site/submit"payload = { "quoteId": "", "user": "", "useNativeIn": True, "unwrapNativeOut": True, "gasPriceWei": "", "maxFeePerGasWei": "", "maxPriorityFeePerGasWei": ""}headers = { "x-api-key": "", "Content-Type": "application/json"}response = requests.post(url, json=payload, headers=headers)print(response.text) const options = { method: 'POST', headers: {'x-api-key': '', 'Content-Type': 'application/json'}, body: JSON.stringify({ quoteId: '', user: '', useNativeIn: true, unwrapNativeOut: true, gasPriceWei: '', maxFeePerGasWei: '', maxPriorityFeePerGasWei: '' })};fetch('https://quiet-bloodhound-531.convex.site/submit', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err)); "https://quiet-bloodhound-531.convex.site/submit", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode([ 'quoteId' => '', 'user' => '', 'useNativeIn' => true, 'unwrapNativeOut' => true, 'gasPriceWei' => '', 'maxFeePerGasWei' => '', 'maxPriorityFeePerGasWei' => '' ]), CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "x-api-key: " ],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;} package mainimport ( "fmt" "strings" "net/http" "io")func main() { url := "https://quiet-bloodhound-531.convex.site/submit" payload := strings.NewReader("{\n \"quoteId\": \"\",\n \"user\": \"\",\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true,\n \"gasPriceWei\": \"\",\n \"maxFeePerGasWei\": \"\",\n \"maxPriorityFeePerGasWei\": \"\"\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("x-api-key", "") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body))} HttpResponse response = Unirest.post("https://quiet-bloodhound-531.convex.site/submit") .header("x-api-key", "") .header("Content-Type", "application/json") .body("{\n \"quoteId\": \"\",\n \"user\": \"\",\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true,\n \"gasPriceWei\": \"\",\n \"maxFeePerGasWei\": \"\",\n \"maxPriorityFeePerGasWei\": \"\"\n}") .asString(); require 'uri'require 'net/http'url = URI("https://quiet-bloodhound-531.convex.site/submit")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Post.new(url)request["x-api-key"] = ''request["Content-Type"] = 'application/json'request.body = "{\n \"quoteId\": \"\",\n \"user\": \"\",\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true,\n \"gasPriceWei\": \"\",\n \"maxFeePerGasWei\": \"\",\n \"maxPriorityFeePerGasWei\": \"\"\n}"response = http.request(request)puts response.read_body 200 400 401 404 429 { "quoteId": "", "chainId": 123, "to": "", "data": "", "value": "" } { "error": ""} { "error": ""} { "error": ""} { "error": ""} Use `POST /submit` to convert a `quoteId` from [`POST /quote`](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote) into the calldata your wallet broadcasts. * **Authentication:** `x-api-key` header required. * **Quote TTL:** quotes expire roughly 10 seconds after `/quote`. Submitting an expired `quoteId` returns `404`. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#request) Request ------------------------------------------------------------------------------------ * Endpoint * Body POST {API_URL}/submit Content-Type: application/json x-api-key: { "quoteId": "a1b2c3d4e5f6...", "user": "0xYourWalletAddress", "useNativeIn": false, "unwrapNativeOut": true } ### [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#body-parameters) Body parameters | Field | Type | Required | Description | | --- | --- | --- | --- | | `quoteId` | string | yes | The `quoteId` from a recent `/quote` response. | | `user` | address | yes | The wallet that will sign and broadcast the transaction. | | `useNativeIn` | boolean | no | Override `routePlan.nativeIn`. Set `true` to send native ETH; the router wraps `msg.value` to WETH before dispatching legs. | | `unwrapNativeOut` | boolean | no | Override `routePlan.nativeOut`. Set `true` to receive native ETH instead of WETH. | | `permit` | object | no | Optional EIP-2612 permit payload for one-tx approve+swap. See [`permit` payload](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#permit-payload)
below. | | `gasPriceWei` | string | no | Hint for legacy gas pricing (`gasPrice`). | | `maxFeePerGasWei` | string | no | Hint for EIP-1559 `maxFeePerGas`. | | `maxPriorityFeePerGasWei` | string | no | Hint for EIP-1559 `maxPriorityFeePerGas`. | The gas price fields are hints only. They are not currently echoed back into the calldata; your wallet client should set its own gas pricing when broadcasting. #### [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#permit-payload) `permit` payload When you have a fresh EIP-2612 permit signature for `tokenIn`, include it to skip the standard `approve` transaction. { "permit": { "value": "1000000000", "deadline": 1712180600, "v": 27, "r": "0x...", "s": "0x..." } } | Field | Type | Notes | | --- | --- | --- | | `value` | string | Amount permitted in token base units. Must be `>= amountIn`. | | `deadline` | integer | Unix seconds at which the permit expires. | | `v` / `r` / `s` | components | EIP-2612 signature pieces. | The router consumes the permit inside the same transaction; if it fails, the whole swap reverts. See [ERC-20 approvals](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals) for the full pattern. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#response) Response -------------------------------------------------------------------------------------- * 200 OK * 404 Not Found * 400 Bad Request * 401 Unauthorized * 429 Rate Limited { "quoteId": "a1b2c3d4e5f6...", "chainId": 8453, "to": "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3", "data": "0x...", "value": "0" } { "error": "quote not found or expired" } The `quoteId` either never existed or has aged out of the cache. Re-fetch via `/quote` and retry. { "error": "user is required" } Other common 400 messages: `invalid user address`, `permit signature invalid`. { "error": "unauthorized" } { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } ### [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#response-fields) Response fields | Field | Type | Description | | --- | --- | --- | | `quoteId` | string | Echo of the `quoteId` you submitted. | | `chainId` | integer | Always `8453` while only Base is supported. | | `to` | address | Always the `O1Router` address. See [Router contract](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract)
. | | `data` | hex | Encoded `swapExactIn(...)` calldata. | | `value` | string | `msg.value` to send with the transaction in wei. Non-zero only for native-in swaps (`useNativeIn: true`). | [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#sending-the-transaction) Sending the transaction -------------------------------------------------------------------------------------------------------------------- The response is intentionally minimal so any signer works. Example with `viem`: const txHash = await walletClient.sendTransaction({ to: submit.to as `0x${string}`, data: submit.data as `0x${string}`, value: BigInt(submit.value), }); ethers v6: const txResponse = await wallet.sendTransaction({ to: submit.to, data: submit.data, value: submit.value, }); Do not modify `data` before sending. The router validates the route plan against the submitted `quoteId`; any tamper attempt will revert. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#native-eth-and-unwrap-behavior) Native ETH and unwrap behavior ---------------------------------------------------------------------------------------------------------------------------------- | Want to | Set on `/quote` | Set on `/submit` | | --- | --- | --- | | Sell native ETH | `tokenIn` = native sentinel (`0xEeee...EEeE` or `0x0`) | `useNativeIn: true` | | Receive native ETH | `tokenOut` = native sentinel | `unwrapNativeOut: true` | When you sell native ETH, the response `value` carries `amountIn` and the router wraps to WETH internally. See the [Native ETH guide](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth) for the full matrix. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#common-pitfalls) Common pitfalls ---------------------------------------------------------------------------------------------------- 404 on /submit -------------- Quote expired. Re-fetch via `/quote` with the same parameters and resubmit. Don’t cache `quoteId` longer than `expiresAt` minus a small safety window. \`value\` is 0 for ETH swaps ---------------------------- You forgot `useNativeIn: true`. The router can’t infer it from `tokenIn` alone in `/submit` because the API does not assume the user has changed their mind since `/quote`. Tx reverts with slippage error ------------------------------ Pool state moved between `/quote` and broadcast. Increase `slippageBps` slightly or re-quote and resend. Allowance error --------------- The user hasn’t approved the router for `tokenIn`. Approve `O1Router` for at least `amountIn`, or use a `permit` payload. See [ERC-20 approvals](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals) . #### Authorizations [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#authorization-x-api-key) x-api-key string header required #### Body application/json [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#body-quote-id) quoteId string required [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#body-user) user string required 20-byte hex address. The sentinel `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) signals the chain's native asset (ETH on Base) and is recognized in `tokenIn`/`tokenOut`. Pattern: `^0x[a-fA-F0-9]{40}$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#body-use-native-in) useNativeIn boolean Override `routePlan.nativeIn`. When true the router wraps `msg.value` to WETH before dispatching legs. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#body-unwrap-native-out) unwrapNativeOut boolean Override `routePlan.nativeOut`. When true the router unwraps WETH to ETH for the recipient. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#body-permit) permit object Show child attributes [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#body-gas-price-wei) gasPriceWei string Non-negative integer encoded as a decimal string (wei). Pattern: `^[0-9]+$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#body-max-fee-per-gas-wei) maxFeePerGasWei string Non-negative integer encoded as a decimal string (wei). Pattern: `^[0-9]+$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#body-max-priority-fee-per-gas-wei) maxPriorityFeePerGasWei string Non-negative integer encoded as a decimal string (wei). Pattern: `^[0-9]+$` #### Response 200 application/json Transaction payload [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#response-quote-id) quoteId string required [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#response-chain-id) chainId integer required [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#response-to) to string required 20-byte hex address. The sentinel `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) signals the chain's native asset (ETH on Base) and is recognized in `tokenIn`/`tokenOut`. Pattern: `^0x[a-fA-F0-9]{40}$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#response-data) data string required Hex-encoded bytes. Pattern: `^0x[a-fA-F0-9]*$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit#response-value) value string required msg.value in wei (non-zero only for native-in swaps). Pattern: `^[0-9]+$` [POST /quote](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote) [POST /execute](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute) ⌘I --- # Authentication - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/authentication#content-area) Every endpoint except [`GET /health`](https://docs.o1.exchange/api/dex-aggregator/endpoints/health) requires an API key. [​](https://docs.o1.exchange/api/dex-aggregator/authentication#how-to-get-an-api-key) How to get an API key -------------------------------------------------------------------------------------------------------------- API keys are currently issued directly by the o1 team. Self-serve key creation is on the roadmap; for now, the flow is: 1 [](https://docs.o1.exchange/api/dex-aggregator/authentication#) Reach out Contact the o1 team through your usual partnership or support channel and request a DEX Aggregator API key. Include a short description of your integration (app name, expected volume, environment) so we can size your rate limit correctly. 2 [](https://docs.o1.exchange/api/dex-aggregator/authentication#) Receive your key The team provisions a key scoped to your integration and shares it securely. Each key is independent, so you can request additional keys for staging, dev, or per-environment isolation. 3 [](https://docs.o1.exchange/api/dex-aggregator/authentication#) Store it securely Treat your API key like a password. Keep it server-side, never commit it to source control, and never expose it in browser-side code. Need to rotate or revoke a key? Reach out to the same channel. The team can create a replacement and revoke the old one with a short overlap window so you can deploy without downtime. [​](https://docs.o1.exchange/api/dex-aggregator/authentication#sending-the-key) Sending the key -------------------------------------------------------------------------------------------------- Pass your key on every request via the `x-api-key` HTTP header. cURL TypeScript Python curl -X POST https://quiet-bloodhound-531.convex.site/quote \ -H "x-api-key: o1_your_key_here" \ -H "content-type: application/json" \ -d '{ "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100 }' await fetch(`${API_URL}/quote`, { method: "POST", headers: { "x-api-key": process.env.O1_API_KEY!, "content-type": "application/json", }, body: JSON.stringify({ /* ... */ }), }); import os, requests requests.post( f"{API_URL}/quote", headers={ "x-api-key": os.environ["O1_API_KEY"], "content-type": "application/json", }, json={ ... }, ) Never expose your API key in client-side JavaScript. Proxy through your own server. If your key has leaked, revoke it immediately and rotate. [​](https://docs.o1.exchange/api/dex-aggregator/authentication#rate-limits) Rate limits ------------------------------------------------------------------------------------------ The default rate limit is **120 requests per minute per API key**. Higher tiers are available on request — contact the o1 team if you expect sustained traffic above that. The window is sliding (60 seconds), enforced server-side. When you exceed it you get a `429`: { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } See [Rate limits](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits) for the recommended retry strategy. [​](https://docs.o1.exchange/api/dex-aggregator/authentication#error-responses) Error responses -------------------------------------------------------------------------------------------------- * 401 Unauthorized * 429 Rate limited Missing or invalid `x-api-key`. { "error": "unauthorized" } You’ve exceeded the per-minute quota. Back off for at least one second before retrying. { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } [​](https://docs.o1.exchange/api/dex-aggregator/authentication#best-practices) Best practices ------------------------------------------------------------------------------------------------ One key per integration ----------------------- Use a distinct key per app, environment, or backend service. Makes revocation painless when something rotates. Rotate proactively ------------------ Rotate keys quarterly or whenever an engineer with access leaves the team. Old keys can stay live for a short overlap window during the migration. Log key usage server-side ------------------------- Tag your outbound requests with a request ID so you can correlate API errors with your server logs. Honor 429s gracefully --------------------- On `429`, back off and retry with jitter. Don’t hammer. [Quickstart](https://docs.o1.exchange/api/dex-aggregator/quickstart) [POST /quote](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote) ⌘I --- # POST /execute - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#content-area) One-shot quote + submit cURL curl --request POST \ --url https://quiet-bloodhound-531.convex.site/execute \ --header 'Content-Type: application/json' \ --header 'x-api-key: ' \ --data ' { "chainId": 2, "tokenIn": "", "tokenOut": "", "amountIn": "", "slippageBps": 5000, "user": "", "maxHops": 2, "splitEnabled": true, "enforcePoolDisjoint": true, "allowedDexes": [], "feeBps": 5000, "useNativeIn": true, "unwrapNativeOut": true } ' import requestsurl = "https://quiet-bloodhound-531.convex.site/execute"payload = { "chainId": 2, "tokenIn": "", "tokenOut": "", "amountIn": "", "slippageBps": 5000, "user": "", "maxHops": 2, "splitEnabled": True, "enforcePoolDisjoint": True, "allowedDexes": [], "feeBps": 5000, "useNativeIn": True, "unwrapNativeOut": True}headers = { "x-api-key": "", "Content-Type": "application/json"}response = requests.post(url, json=payload, headers=headers)print(response.text) const options = { method: 'POST', headers: {'x-api-key': '', 'Content-Type': 'application/json'}, body: JSON.stringify({ chainId: 2, tokenIn: '', tokenOut: '', amountIn: '', slippageBps: 5000, user: '', maxHops: 2, splitEnabled: true, enforcePoolDisjoint: true, allowedDexes: [], feeBps: 5000, useNativeIn: true, unwrapNativeOut: true })};fetch('https://quiet-bloodhound-531.convex.site/execute', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err)); "https://quiet-bloodhound-531.convex.site/execute", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode([ 'chainId' => 2, 'tokenIn' => '', 'tokenOut' => '', 'amountIn' => '', 'slippageBps' => 5000, 'user' => '', 'maxHops' => 2, 'splitEnabled' => true, 'enforcePoolDisjoint' => true, 'allowedDexes' => [ ], 'feeBps' => 5000, 'useNativeIn' => true, 'unwrapNativeOut' => true ]), CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "x-api-key: " ],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;} package mainimport ( "fmt" "strings" "net/http" "io")func main() { url := "https://quiet-bloodhound-531.convex.site/execute" payload := strings.NewReader("{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"user\": \"\",\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("x-api-key", "") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body))} HttpResponse response = Unirest.post("https://quiet-bloodhound-531.convex.site/execute") .header("x-api-key", "") .header("Content-Type", "application/json") .body("{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"user\": \"\",\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true\n}") .asString(); require 'uri'require 'net/http'url = URI("https://quiet-bloodhound-531.convex.site/execute")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Post.new(url)request["x-api-key"] = ''request["Content-Type"] = 'application/json'request.body = "{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"user\": \"\",\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true\n}"response = http.request(request)puts response.read_body 200 400 401 429 { "quoteId": "", "chainId": 123, "to": "", "data": "", "value": "", "routePlan": { "chainId": 123, "tokenIn": "", "tokenOut": "", "amountIn": "", "expectedAmountOut": "", "minAmountOut": "", "slippageBps": 5000, "routes": [\ {\ "amountIn": "",\ "legs": [\ {\ "tokenIn": "",\ "tokenOut": "",\ "amountIn": "",\ "minOut": "",\ "data": {\ "kind": "",\ "pool": "",\ "feeBps": 5000\ },\ "poolId": ""\ }\ ]\ }\ ], "blockNumber": 1, "feeBps": 5000, "gasEstimate": { "gasUnits": 1, "gasCostWei": "" }, "feeBreakdown": { "protocolFeeAmount": "", "integratorFeeAmount": "" }, "metadata": { "connectorsConsidered": [\ ""\ ], "candidatePaths": 1, "selectedPaths": 1, "candidates": [\ {\ "path": [\ ""\ ],\ "dexes": [],\ "projectedOut": "",\ "allocatedIn": "",\ "score": 123\ }\ ] }, "nativeIn": true, "nativeOut": true }, "expiresAt": 123 } { "error": ""} { "error": ""} { "error": ""} POST / execute Try it One-shot quote + submit cURL curl --request POST \ --url https://quiet-bloodhound-531.convex.site/execute \ --header 'Content-Type: application/json' \ --header 'x-api-key: ' \ --data ' { "chainId": 2, "tokenIn": "", "tokenOut": "", "amountIn": "", "slippageBps": 5000, "user": "", "maxHops": 2, "splitEnabled": true, "enforcePoolDisjoint": true, "allowedDexes": [], "feeBps": 5000, "useNativeIn": true, "unwrapNativeOut": true } ' import requestsurl = "https://quiet-bloodhound-531.convex.site/execute"payload = { "chainId": 2, "tokenIn": "", "tokenOut": "", "amountIn": "", "slippageBps": 5000, "user": "", "maxHops": 2, "splitEnabled": True, "enforcePoolDisjoint": True, "allowedDexes": [], "feeBps": 5000, "useNativeIn": True, "unwrapNativeOut": True}headers = { "x-api-key": "", "Content-Type": "application/json"}response = requests.post(url, json=payload, headers=headers)print(response.text) const options = { method: 'POST', headers: {'x-api-key': '', 'Content-Type': 'application/json'}, body: JSON.stringify({ chainId: 2, tokenIn: '', tokenOut: '', amountIn: '', slippageBps: 5000, user: '', maxHops: 2, splitEnabled: true, enforcePoolDisjoint: true, allowedDexes: [], feeBps: 5000, useNativeIn: true, unwrapNativeOut: true })};fetch('https://quiet-bloodhound-531.convex.site/execute', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err)); "https://quiet-bloodhound-531.convex.site/execute", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode([ 'chainId' => 2, 'tokenIn' => '', 'tokenOut' => '', 'amountIn' => '', 'slippageBps' => 5000, 'user' => '', 'maxHops' => 2, 'splitEnabled' => true, 'enforcePoolDisjoint' => true, 'allowedDexes' => [ ], 'feeBps' => 5000, 'useNativeIn' => true, 'unwrapNativeOut' => true ]), CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "x-api-key: " ],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;} package mainimport ( "fmt" "strings" "net/http" "io")func main() { url := "https://quiet-bloodhound-531.convex.site/execute" payload := strings.NewReader("{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"user\": \"\",\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("x-api-key", "") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body))} HttpResponse response = Unirest.post("https://quiet-bloodhound-531.convex.site/execute") .header("x-api-key", "") .header("Content-Type", "application/json") .body("{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"user\": \"\",\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true\n}") .asString(); require 'uri'require 'net/http'url = URI("https://quiet-bloodhound-531.convex.site/execute")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Post.new(url)request["x-api-key"] = ''request["Content-Type"] = 'application/json'request.body = "{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"user\": \"\",\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"useNativeIn\": true,\n \"unwrapNativeOut\": true\n}"response = http.request(request)puts response.read_body 200 400 401 429 { "quoteId": "", "chainId": 123, "to": "", "data": "", "value": "", "routePlan": { "chainId": 123, "tokenIn": "", "tokenOut": "", "amountIn": "", "expectedAmountOut": "", "minAmountOut": "", "slippageBps": 5000, "routes": [\ {\ "amountIn": "",\ "legs": [\ {\ "tokenIn": "",\ "tokenOut": "",\ "amountIn": "",\ "minOut": "",\ "data": {\ "kind": "",\ "pool": "",\ "feeBps": 5000\ },\ "poolId": ""\ }\ ]\ }\ ], "blockNumber": 1, "feeBps": 5000, "gasEstimate": { "gasUnits": 1, "gasCostWei": "" }, "feeBreakdown": { "protocolFeeAmount": "", "integratorFeeAmount": "" }, "metadata": { "connectorsConsidered": [\ ""\ ], "candidatePaths": 1, "selectedPaths": 1, "candidates": [\ {\ "path": [\ ""\ ],\ "dexes": [],\ "projectedOut": "",\ "allocatedIn": "",\ "score": 123\ }\ ] }, "nativeIn": true, "nativeOut": true }, "expiresAt": 123 } { "error": ""} { "error": ""} { "error": ""} `POST /execute` is the one-step convenience endpoint. It runs `/quote` and `/submit` server-side and returns both the route plan (so you can display it) and the calldata (so you can broadcast). Use this when: * You don’t need a separate price preview step (one-click swap, server-side bot). * You want to avoid the `quoteId` round trip. * You always submit immediately after quoting. For UIs that show a quote, let the user think, then submit, prefer the [`/quote` + `/submit`](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns) two-step flow so the user sees the final price before signing. * **Authentication:** `x-api-key` header required. * **`user` is required** here (unlike `/quote`) because the response includes signed-ready calldata. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#request) Request ------------------------------------------------------------------------------------- * Endpoint * Body POST {API_URL}/execute Content-Type: application/json x-api-key: { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100, "user": "0xYourWalletAddress", "useNativeIn": false, "unwrapNativeOut": true, "feeBps": 30 } ### [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-parameters) Body parameters `/execute` accepts the union of `/quote` and `/submit` parameters. | Field | Type | Required | Description | | --- | --- | --- | --- | | `chainId` | integer | yes | `8453` for Base. | | `tokenIn` | address | yes | Token to sell. Native sentinel allowed. | | `tokenOut` | address | yes | Token to buy. Native sentinel allowed. | | `amountIn` | string | yes | Amount in wei as a decimal string. | | `slippageBps` | integer | yes | Slippage tolerance in bps (`0..10000`). | | `user` | address | yes | Wallet that will sign the tx. | | `useNativeIn` | boolean | no | Override native-in detection. | | `unwrapNativeOut` | boolean | no | Receive native ETH instead of WETH. | | `feeBps` | integer | no | Integrator fee in bps. | | `maxHops` | integer | no | Default `3`. | | `splitEnabled` | boolean | no | Default `true`. | | `enforcePoolDisjoint` | boolean | no | Default `false`. | | `allowedDexes` | array of `DexId` | no | Restrict routing to specific venues. | | `permit` | object | no | EIP-2612 permit payload (same shape as `/submit`). | See [`POST /quote`](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote) and [`POST /submit`](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit) for full descriptions of each field. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#response) Response --------------------------------------------------------------------------------------- * 200 OK * 400 Bad Request * 401 Unauthorized * 429 Rate Limited { "quoteId": "a1b2c3d4e5f6...", "chainId": 8453, "to": "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3", "data": "0x...", "value": "0", "expiresAt": 1712180000000, "routePlan": { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "expectedAmountOut": "484446072048780734", "minAmountOut": "479601611328292926", "slippageBps": 100, "blockNumber": 44266656, "routes": [ /* ... */ ] } } { "error": "no routes for pair" } { "error": "unauthorized" } { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } ### [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#response-fields) Response fields A union of the `/quote` response (so you can display the price) and `/submit` response (so you can broadcast). | Field | Type | Description | | --- | --- | --- | | `quoteId` | string | The freshly issued quote ID. Useful for log correlation. | | `chainId` | integer | `8453`. | | `to` | address | Always the `O1Router`. | | `data` | hex | `swapExactIn(...)` calldata. | | `value` | string | `msg.value` in wei. | | `expiresAt` | integer | Unix milliseconds at which the cached quote drops. | | `routePlan` | object | Full route plan. See [RoutePlan reference](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan)
. | [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#examples) Examples --------------------------------------------------------------------------------------- TypeScript cURL const exec = await fetch(`${API_URL}/execute`, { method: "POST", headers: { "x-api-key": process.env.O1_API_KEY!, "content-type": "application/json", }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", slippageBps: 100, user: walletAddress, }), }).then((r) => r.json()); const txHash = await walletClient.sendTransaction({ to: exec.to as `0x${string}`, data: exec.data as `0x${string}`, value: BigInt(exec.value), }); curl -X POST https://quiet-bloodhound-531.convex.site/execute \ -H "x-api-key: $O1_API_KEY" \ -H "content-type: application/json" \ -d '{ "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100, "user": "0xYourWalletAddress" }' `/execute` always returns a fresh quote. There’s no risk of `404 expired` here because the quote is consumed immediately on the server side. #### Authorizations [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#authorization-x-api-key) x-api-key string header required #### Body application/json [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-chain-id) chainId integer required Required range: `x >= 1` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-token-in) tokenIn string required 20-byte hex address. The sentinel `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) signals the chain's native asset (ETH on Base) and is recognized in `tokenIn`/`tokenOut`. Pattern: `^0x[a-fA-F0-9]{40}$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-token-out) tokenOut string required 20-byte hex address. The sentinel `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) signals the chain's native asset (ETH on Base) and is recognized in `tokenIn`/`tokenOut`. Pattern: `^0x[a-fA-F0-9]{40}$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-amount-in) amountIn string required Non-negative integer encoded as a decimal string (wei). Pattern: `^[0-9]+$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-slippage-bps) slippageBps integer required Required range: `0 <= x <= 10000` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-user) user string required 20-byte hex address. The sentinel `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) signals the chain's native asset (ETH on Base) and is recognized in `tokenIn`/`tokenOut`. Pattern: `^0x[a-fA-F0-9]{40}$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-max-hops) maxHops integer Required range: `x >= 1` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-split-enabled) splitEnabled boolean [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-enforce-pool-disjoint) enforcePoolDisjoint boolean [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-allowed-dexes) allowedDexes enum\[\] Minimum array length: `1` Available options: `UNIV2`, `UNIV3`, `UNIV4`, `AERODROME_V2LIKE`, `AERODROME_CL`, `PANCAKE_V2`, `PANCAKE_V3`, `PANCAKE_INFINITY_CL`, `HYDREX`, `QUICKSWAP_V4`, `ALIEN_BASE_V3`, `CURVE`, `PROPSWAP`, `TESSERA`, `ELFOMOFI`, `LUNARBASE`, `FELTIR`, `DODO_V2`, `WOOFI`, `GYROSCOPE_ECLP`, `MAVERICK_V2` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-fee-bps) feeBps integer Required range: `0 <= x <= 10000` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-use-native-in) useNativeIn boolean [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-unwrap-native-out) unwrapNativeOut boolean [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#body-permit) permit object Show child attributes #### Response 200 application/json Quote + transaction payload [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#response-quote-id) quoteId string required [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#response-chain-id) chainId integer required [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#response-to) to string required 20-byte hex address. The sentinel `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) signals the chain's native asset (ETH on Base) and is recognized in `tokenIn`/`tokenOut`. Pattern: `^0x[a-fA-F0-9]{40}$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#response-data) data string required Hex-encoded bytes. Pattern: `^0x[a-fA-F0-9]*$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#response-value) value string required Non-negative integer encoded as a decimal string (wei). Pattern: `^[0-9]+$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#response-route-plan) routePlan object required Show child attributes [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute#response-expires-at) expiresAt integer required [POST /submit](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit) [GET /health](https://docs.o1.exchange/api/dex-aggregator/endpoints/health) ⌘I --- # Bug Bounty Program - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/community/bug-bounty#content-area) [​](https://docs.o1.exchange/community/bug-bounty#protecting-our-community) Protecting Our Community ------------------------------------------------------------------------------------------------------- At o1.exchange, security is our top priority. We’ve established a comprehensive bug bounty program to incentivize security researchers and developers to help identify vulnerabilities in our platform. Your contributions help us maintain the highest security standards for our users. Report Vulnerabilities ---------------------- Discover and report security issues to earn rewards Earn Rewards ------------ Get paid for valid security findings based on severity [​](https://docs.o1.exchange/community/bug-bounty#reward-structure) Reward Structure --------------------------------------------------------------------------------------- * Severity Levels * Scope Rewards are determined based on the severity and impact of the vulnerability: | Severity | Description | Reward Range | | --- | --- | --- | | **High** | loss of funds, significant impact | 1,000−1,000 - 1,000−5,000 | | **Medium** | Limited impact, requires specific conditions | 500−500 - 500−1,000 | | **Low** | Minimal impact, informational issues | 100−100 - 100−500 | ### [​](https://docs.o1.exchange/community/bug-bounty#in-scope) In Scope * Smart contract vulnerabilities * Trading engine exploits * Authentication bypass * Fund manipulation * Oracle manipulation * Cross-site scripting (XSS) * SQL injection * Remote code execution ### [​](https://docs.o1.exchange/community/bug-bounty#out-of-scope) Out of Scope * Known issues or already reported vulnerabilities * Social engineering attacks * Physical attacks * Denial of service attacks * Issues in third-party services * Generic product bugs, including but not limited to UI/UX, application clients, product stability, etc. * Attempting to exploit vulnerabilities on the mainnet or causing actual harm to users is strictly prohibited and may result in legal action. * No one should break nor exploit the mainnet (production o1.exchange site) without the admin/team’s approval; otherwise it would lead to a smaller final payout. [​](https://docs.o1.exchange/community/bug-bounty#how-to-participate) How to Participate ------------------------------------------------------------------------------------------- 1 [](https://docs.o1.exchange/community/bug-bounty#) Discover Review our smart contracts, trading platform, and infrastructure for potential vulnerabilities 2 [](https://docs.o1.exchange/community/bug-bounty#) Document Create a detailed report including: * Clear description of the vulnerability * Steps to reproduce * Impact assessment * Suggested fix (if applicable) * Payments would be sent when attack and solution documentations are shared, given no follow-up attack within the next 1 month 3 [](https://docs.o1.exchange/community/bug-bounty#) Submit Send your report to our X account @o1\_exchange via DM 4 [](https://docs.o1.exchange/community/bug-bounty#) Review Our security team will review your submission within 48 hours 5 [](https://docs.o1.exchange/community/bug-bounty#) Reward Upon validation, receive your bounty payment in USDC or ETH [​](https://docs.o1.exchange/community/bug-bounty#recognition) Recognition ----------------------------------------------------------------------------- Top contributors to our bug bounty program will be featured in our Security Hall of Fame and receive exclusive NFT badges recognizing their contributions to platform security. [​](https://docs.o1.exchange/community/bug-bounty#legal-safe-harbor) Legal Safe Harbor ----------------------------------------------------------------------------------------- We commit to not pursuing legal action against security researchers who: * Comply with this bug bounty policy * Act in good faith * Make a reasonable effort to avoid privacy violations * Do not exploit vulnerabilities beyond what’s necessary for verification Join our security-focused Discord channel to discuss potential findings with our team and other security researchers. Remember: collaboration makes our platform stronger! [​](https://docs.o1.exchange/community/bug-bounty#contact) Contact --------------------------------------------------------------------- For questions about the bug bounty program or to submit a vulnerability report: Security Team ------------- **Twitter**: Send your report to our X account @o1\_exchange via DM. **Response Time**: Within 48 hours. [Platform Metrics](https://docs.o1.exchange/community/metrics) ⌘I --- # GET /health - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/endpoints/health#content-area) Liveness probe cURL curl --request GET \ --url https://quiet-bloodhound-531.convex.site/health import requestsurl = "https://quiet-bloodhound-531.convex.site/health"response = requests.get(url)print(response.text) const options = {method: 'GET'};fetch('https://quiet-bloodhound-531.convex.site/health', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err)); "https://quiet-bloodhound-531.convex.site/health", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET",]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;} package mainimport ( "fmt" "net/http" "io")func main() { url := "https://quiet-bloodhound-531.convex.site/health" req, _ := http.NewRequest("GET", url, nil) res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body))} HttpResponse response = Unirest.get("https://quiet-bloodhound-531.convex.site/health") .asString(); require 'uri'require 'net/http'url = URI("https://quiet-bloodhound-531.convex.site/health")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Get.new(url)response = http.request(request)puts response.read_body 200 { "ok": true } GET / health Try it Liveness probe cURL curl --request GET \ --url https://quiet-bloodhound-531.convex.site/health import requestsurl = "https://quiet-bloodhound-531.convex.site/health"response = requests.get(url)print(response.text) const options = {method: 'GET'};fetch('https://quiet-bloodhound-531.convex.site/health', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err)); "https://quiet-bloodhound-531.convex.site/health", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET",]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;} package mainimport ( "fmt" "net/http" "io")func main() { url := "https://quiet-bloodhound-531.convex.site/health" req, _ := http.NewRequest("GET", url, nil) res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body))} HttpResponse response = Unirest.get("https://quiet-bloodhound-531.convex.site/health") .asString(); require 'uri'require 'net/http'url = URI("https://quiet-bloodhound-531.convex.site/health")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Get.new(url)response = http.request(request)puts response.read_body 200 { "ok": true } Returns `{ "ok": true }` when the service is reachable. No authentication required. This endpoint is **public** — it does not require an `x-api-key` header. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/health#request) Request ------------------------------------------------------------------------------------ GET {API_URL}/health [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/health#response) Response -------------------------------------------------------------------------------------- { "ok": true } [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/health#when-to-use-this) When to use this ------------------------------------------------------------------------------------------------------ CI / monitoring --------------- Schedule periodic health checks from your monitoring system. Treat anything other than `200 { "ok": true }` as down. Connectivity self-test ---------------------- Use as the first call in an integration test to confirm DNS, TLS, and API key plumbing without spending quota on a real quote. curl https://quiet-bloodhound-531.convex.site/health #### Response 200 - application/json Service is up [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/health#response-ok) ok boolean required [POST /execute](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute) [Integration patterns](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns) ⌘I --- # Quote freshness - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#content-area) Quotes are price snapshots at a specific block. Pool reserves, tick state, and competing trades can move the market between the moment you quote and the moment your transaction lands. The aggregator handles this with a short server-side cache TTL and explicit expiry semantics. [​](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#the-contract) The contract ---------------------------------------------------------------------------------------------------- TTL is ~10 seconds ------------------ Each `/quote` response includes `expiresAt` (Unix milliseconds). The default TTL is 10 seconds. After that, the cache entry is gone. /submit returns 404 on expired quotes ------------------------------------- Once `expiresAt` has passed, `POST /submit` with that `quoteId` returns `{ "error": "quote not found or expired" }`. Re-quote and retry. [​](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#recommended-ui-pattern) Recommended UI pattern ------------------------------------------------------------------------------------------------------------------------ 1 [](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#) Fetch a fresh quote when the swap modal opens On modal open, call `/quote` and store the result. Display the price. 2 [](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#) Re-quote on a 5 to 8 second interval While the modal is open, re-fetch the quote periodically. Compare `expectedAmountOut` against the previous value to decide whether to flash an “updated” indicator. 3 [](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#) Stop polling on user action When the user clicks “Swap” (or your equivalent), pause polling so the price doesn’t change between their decision and the wallet prompt. 4 [](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#) Submit using the latest quoteId Always submit using the `quoteId` from the most recent successful `/quote`. Don’t reuse an older one. 5 [](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#) Handle 404 gracefully If `/submit` returns `404`, automatically re-fetch `/quote` and retry once. Only surface a user-facing error if the second attempt also fails. [​](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#reference-implementation) Reference implementation ---------------------------------------------------------------------------------------------------------------------------- import { useEffect, useRef, useState } from "react"; interface QuoteState { quoteId: string; expectedOut: bigint; minOut: bigint; expiresAt: number; } function useLiveQuote(params: QuoteParams, isOpen: boolean) { const [quote, setQuote] = useState(null); const isFreezingRef = useRef(false); useEffect(() => { if (!isOpen) return; let cancelled = false; const tick = async () => { if (cancelled || isFreezingRef.current) return; try { const q = await fetch(`${API_URL}/quote`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json" }, body: JSON.stringify(params), }).then((r) => r.json()); if (!cancelled && q.quoteId) { setQuote({ quoteId: q.quoteId, expectedOut: BigInt(q.routePlan.expectedAmountOut), minOut: BigInt(q.routePlan.minAmountOut), expiresAt: q.expiresAt, }); } } catch (e) { // ignore transient failures; next tick will retry } }; tick(); const id = setInterval(tick, 6000); return () => { cancelled = true; clearInterval(id); }; }, [isOpen, JSON.stringify(params)]); const freeze = () => { isFreezingRef.current = true; }; const unfreeze = () => { isFreezingRef.current = false; }; return { quote, freeze, unfreeze }; } Then in the swap submit handler: async function onSwap() { if (!quote) return; freeze(); // stop background re-quoting try { const submit = await fetch(`${API_URL}/submit`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: quote.quoteId, user: walletAddress }), }).then(async (r) => { if (r.status === 404) { // Quote expired between the freeze and the submit. Re-quote and retry. const fresh = await refreshQuote(params); return fetch(`${API_URL}/submit`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: fresh.quoteId, user: walletAddress }), }).then((r2) => r2.json()); } return r.json(); }); const txHash = await walletClient.sendTransaction({ to: submit.to, data: submit.data, value: BigInt(submit.value), }); onSuccess(txHash); } finally { unfreeze(); } } [​](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#why-not-use-/execute-for-this) Why not use `/execute` for this? ----------------------------------------------------------------------------------------------------------------------------------------- `/execute` always returns a fresh quote, so it sidesteps the 404 problem. But: * You lose the ability to display the quoted price _before_ the user signs. * Every `/execute` call burns rate-limit budget _and_ re-runs the routing engine, so it’s more expensive than alternating `/quote` and `/submit`. Use `/execute` for one-click flows where preview doesn’t matter. Use the two-step pattern with the freshness loop above for any UI that shows a price. [​](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness#slippage-as-a-freshness-backstop) Slippage as a freshness backstop -------------------------------------------------------------------------------------------------------------------------------------------- Even with aggressive re-quoting, your submitted transaction may land 1-2 blocks after `/quote` ran. Use `slippageBps` as the safety margin: | Pair type | Recommended `slippageBps` | | --- | --- | | Stablecoin to stablecoin (USDC → USDT) | `10` to `30` (0.1% to 0.3%) | | Blue-chip to blue-chip (WETH → cbBTC) | `30` to `100` (0.3% to 1%) | | Blue-chip to mid-cap | `100` to `300` (1% to 3%) | | Long tail / memecoins | `300` to `1000` (3% to 10%) | The user’s `minAmountOut` is set on the router, so the swap reverts cleanly if real output falls below the slippage threshold — your transaction never lands in a worse-than-expected state. Cache the user’s preferred slippage per pair-type. Forcing the user to set slippage manually on every swap is a common UX pitfall. [Native ETH](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth) [Error handling](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling) ⌘I --- # Router contract - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract#content-area) Every transaction the API produces calls the same canonical router contract on Base. O1Router on Base ---------------- * **Address:** [`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3`](https://basescan.org/address/0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3) * **Chain ID:** `8453` * **Source:** [`contracts/src/O1Router.sol`](https://github.com/o1exchange/o1-dex-agg/blob/main/contracts/src/O1Router.sol) This is the only address you should ever approve as a spender for swaps via this API. If a `/submit` response returns a different `to` address, **abort and report it**. [​](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract#what-it-does) What it does ------------------------------------------------------------------------------------------------------- The `O1Router` is a thin orchestrator that: 1. Pulls `tokenIn` from the user (via `transferFrom` or, if a `permit` is supplied, via `permit + transferFrom` in the same tx). 2. Optionally wraps `msg.value` to WETH when `useNativeIn` is set. 3. Dispatches each route leg to the corresponding venue adapter (Uniswap V2/V3/V4, Aerodrome, Pancake, Curve, DODO, WooFi, Hydrex, etc.). 4. Aggregates outputs from all routes. 5. Optionally unwraps WETH to native ETH when `unwrapNativeOut` is set. 6. Sends final `tokenOut` to the user. 7. Reverts if `actualOutput < minAmountOut` (slippage check), per-leg or globally. [​](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract#public-function-signature) Public function signature --------------------------------------------------------------------------------------------------------------------------------- function swapExactIn( SwapParams calldata params ) external payable returns (uint256 amountOut); Where `SwapParams` is constructed by the API; you don’t need to encode it yourself. Just send `submit.data` as the `data` field of your transaction. [​](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract#slippage-and-safety) Slippage and safety --------------------------------------------------------------------------------------------------------------------- The router enforces three layers of protection: Per-leg minOut -------------- Each leg has its own `minOut` checked by the corresponding adapter. Global minAmountOut ------------------- The aggregate output is checked against `routePlan.minAmountOut`. The whole tx reverts if it’s lower. Permit deadline --------------- If a `permit` payload is supplied, the EIP-712 deadline is enforced before the swap proceeds. [​](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract#native-wrapping) Native wrapping ------------------------------------------------------------------------------------------------------------- The router uses a configured wrapped-native token address. On Base that’s WETH at `0x4200000000000000000000000000000000000006`. * `useNativeIn: true` → router calls `WETH.deposit{value: msg.value}()` before dispatching legs. * `unwrapNativeOut: true` → router calls `WETH.withdraw(amount)` after legs settle, then forwards ETH to the user. You don’t need to interact with WETH directly. [​](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract#verifying-on-chain) Verifying on-chain ------------------------------------------------------------------------------------------------------------------- Before integrating, verify the deployment: # Check that the bytecode at the address is non-empty cast code 0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3 --rpc-url https://mainnet.base.org Or just open it on [Basescan](https://basescan.org/address/0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3) and confirm: * Contract is verified. * Source matches `contracts/src/O1Router.sol` in the public repo. * Constructor args set `WETH`, the fee recipient, and the venue adapter allowlist. Do not derive the router address from the API response without sanity checking it against this hardcoded value. Production integrations should hardcode the address and treat any mismatch in `submit.to` as fatal. [Error handling](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling) [RoutePlan schema](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan) ⌘I --- # Rate limits - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits#content-area) The DEX Aggregator API enforces a per-key sliding-window rate limit. The default is **120 requests per minute per API key**. [​](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits#how-it-works) How it works --------------------------------------------------------------------------------------------------- Per-key ------- The window is keyed off the `x-api-key` header, not your IP. Each key gets its own bucket. Sliding 60-second window ------------------------ Hits are tracked with timestamps. The window is `now − 60s..now`. There’s no hard reset on the minute boundary; the oldest hits drop off as time passes. [​](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits#what-counts-as-a-request) What counts as a request --------------------------------------------------------------------------------------------------------------------------- Every authenticated call counts: * `POST /quote` * `POST /submit` * `POST /execute` `GET /health` is public and free. [​](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits#what-you-get-on-overflow) What you get on overflow --------------------------------------------------------------------------------------------------------------------------- HTTP/1.1 429 Too Many Requests Content-Type: application/json { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } [​](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits#recommended-retry) Recommended retry ------------------------------------------------------------------------------------------------------------- async function fetchWithBackoff(req: () => Promise, maxAttempts = 3) { for (let attempt = 1; attempt <= maxAttempts; attempt++) { const res = await req(); if (res.status !== 429) return res; if (attempt === maxAttempts) return res; // Linear backoff with jitter is fine here. Don't go below 1 second. const delay = 1000 + Math.random() * 500; await new Promise((r) => setTimeout(r, delay)); } throw new Error("unreachable"); } Don’t retry immediately on `429`. The window is sliding, so a fast retry just lands at the same spot in the bucket. Wait at least 1 second. [​](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits#capacity-planning) Capacity planning ------------------------------------------------------------------------------------------------------------- A few guidelines for sizing your usage: | Workload | Approximate rate | Headroom | | --- | --- | --- | | Single-user swap UI with live quote polling (one user, 8s polling) | ~7 req/min | Plenty | | 10 concurrent users polling | ~75 req/min | Comfortable | | 50 concurrent users polling | ~375 req/min | Exceeds default — request a higher tier | | Server-side bot quoting once per second per pair | 60 req/min × pairs | Scales linearly | If you expect sustained load above the default 120 req/min, contact the o1 team to discuss a higher tier. [​](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits#per-pair-caching-tips) Per-pair caching tips --------------------------------------------------------------------------------------------------------------------- You can dramatically reduce request count on the client by: 1. **Debouncing user input.** Don’t quote on every keystroke; quote 300ms after the last input. 2. **Coalescing identical quotes.** If two components need the same `(tokenIn, tokenOut, amountIn)` quote, share one fetch. 3. **Pausing polling when the tab is hidden.** Use `document.visibilityState === "hidden"` to skip ticks. [​](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits#what-does-not-scale-your-quota) What does NOT scale your quota --------------------------------------------------------------------------------------------------------------------------------------- * Adding more API keys for the same product. The o1 team can detect related keys and apply combined limits if abuse is suspected. * Spreading requests across IPs while reusing one key. The limit is keyed on the key, not the IP. If you legitimately need more headroom, ask. The defaults exist to protect upstream RPC and pool-data providers, and higher tiers are available. [Supported DEXes](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes) [Changelog](https://docs.o1.exchange/api/dex-aggregator/reference/changelog) ⌘I --- # ERC-20 approvals - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#content-area) Before the router can pull `tokenIn` from a user, the user must approve the router as a spender. This is standard ERC-20 behavior. The aggregator supports two patterns: 1. **Standard `approve` + swap** — two transactions, but works for any ERC-20. 2. **EIP-2612 permit + swap** — one transaction, but only works for tokens that implement the permit extension. No approval is needed when `tokenIn` is native ETH (using the sentinel `0xEeee...EEeE` or `0x0`). In that case, the router pulls value via `msg.value`. See [Native ETH](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth) . [​](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#pattern-1-standard-approve) Pattern 1: standard `approve` ----------------------------------------------------------------------------------------------------------------------------------- This is the universal fallback. Two transactions per first swap, then no approvals on subsequent swaps if the previous allowance is large enough. import { erc20Abi } from "viem"; const ROUTER = "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3"; // 1. Read current allowance const allowance = await publicClient.readContract({ address: tokenIn, abi: erc20Abi, functionName: "allowance", args: [walletAddress, ROUTER], }); // 2. Approve if insufficient if (allowance < BigInt(amountIn)) { const approveHash = await walletClient.writeContract({ address: tokenIn, abi: erc20Abi, functionName: "approve", args: [ROUTER, BigInt(amountIn)], }); await publicClient.waitForTransactionReceipt({ hash: approveHash }); } // 3. Now safe to call /submit and broadcast the swap ### [​](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#approve-amount-strategies) Approve amount strategies * Approve exact amount (recommended) * Approve max (least friction) * Approve a buffered amount Approve exactly `amountIn`. Re-approves on every swap. Safest from a security standpoint — the router only ever has rights to the exact amount being swapped. args: [ROUTER, BigInt(amountIn)], Approve `2^256 - 1`. User signs an approve once and never sees an approve dialog again for that token. const MAX_UINT256 = (1n << 256n) - 1n; args: [ROUTER, MAX_UINT256], Max allowance means the router has perpetual rights to spend that token. Any future bug or compromise affects every wallet that approved max. Most consumer swap UIs do this; high-value flows usually don’t. Approve `amountIn × 1.1` or some user-configured tier (e.g. “approve enough for 10 swaps”). Compromise between friction and risk. [​](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#pattern-2-eip-2612-permit-one-transaction) Pattern 2: EIP-2612 permit (one transaction) ----------------------------------------------------------------------------------------------------------------------------------------------------------------- For tokens that implement EIP-2612 (USDC and a growing number of others on Base), the user can sign an off-chain permit that the router consumes inside the same transaction as the swap. Net effect: **one signature, one transaction, no `approve` step**. ### [​](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#how-it-works) How it works 1 [](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#) Build the permit typed data Read the token’s `name`, `EIP712_VERSION`, and the user’s `nonces(user)`. Construct the EIP-712 domain and message. 2 [](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#) User signs the permit off-chain Use `signTypedData` (eth\_signTypedData\_v4). No gas, no on-chain state change. 3 [](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#) Send the permit on /submit Pass `{ value, deadline, v, r, s }` in the `permit` field on `POST /submit`. 4 [](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#) Router consumes it atomically `O1Router.swapExactIn(...)` calls `IERC20Permit(token).permit(...)` then pulls funds, all in one tx. ### [​](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#example) Example import { signTypedData } from "viem/actions"; const PERMIT_TYPES = { Permit: [\ { name: "owner", type: "address" },\ { name: "spender", type: "address" },\ { name: "value", type: "uint256" },\ { name: "nonce", type: "uint256" },\ { name: "deadline", type: "uint256" },\ ], }; async function buildPermit(token: `0x${string}`, owner: `0x${string}`, value: bigint) { const [name, nonce, chainId] = await Promise.all([\ publicClient.readContract({ address: token, abi: erc20PermitAbi, functionName: "name" }),\ publicClient.readContract({ address: token, abi: erc20PermitAbi, functionName: "nonces", args: [owner] }),\ publicClient.getChainId(),\ ]); const deadline = Math.floor(Date.now() / 1000) + 600; // 10 minutes const signature = await walletClient.signTypedData({ account: owner, domain: { name, version: "1", chainId, verifyingContract: token }, types: PERMIT_TYPES, primaryType: "Permit", message: { owner, spender: ROUTER, value, nonce, deadline: BigInt(deadline), }, }); // Split into v / r / s const r = `0x${signature.slice(2, 66)}` as const; const s = `0x${signature.slice(66, 130)}` as const; const v = parseInt(signature.slice(130, 132), 16); return { value: value.toString(), deadline, v, r, s }; } Then on `/submit`: const permit = await buildPermit(tokenIn, walletAddress, BigInt(amountIn)); const submit = await fetch(`${API_URL}/submit`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: quote.quoteId, user: walletAddress, permit, }), }).then((r) => r.json()); const txHash = await walletClient.sendTransaction({ to: submit.to as `0x${string}`, data: submit.data as `0x${string}`, value: BigInt(submit.value), }); Cache `name` and the EIP-712 domain per token to avoid an RPC call on every swap. Don’t cache `nonce` though; it changes after every permit consumption. [​](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#detecting-permit-support) Detecting permit support ---------------------------------------------------------------------------------------------------------------------------- Not every token implements EIP-2612. The cheapest way to detect support is to read `nonces(user)` on the token and treat a successful read as a positive signal. Tokens without permit will revert. async function supportsPermit(token: `0x${string}`, user: `0x${string}`): Promise { try { await publicClient.readContract({ address: token, abi: [{ name: "nonces", type: "function", stateMutability: "view", inputs: [{ name: "owner", type: "address" }], outputs: [{ type: "uint256" }] }], functionName: "nonces", args: [user], }); return true; } catch { return false; } } For better UX, fall back to standard `approve` automatically when permit support is missing. [​](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals#security-checklist) Security checklist ---------------------------------------------------------------------------------------------------------------- Always approve the router only ------------------------------ The approval target is **always** the canonical `O1Router` address: `0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3`. Reject any UI that asks you to approve a different address while using this API. Verify the spender on the response ---------------------------------- `submit.to` should equal the router address. If it doesn’t, abort and report. Respect deadlines on permits ---------------------------- Use a short deadline (5 to 15 minutes). Don’t sign permits with deadlines hours in the future — they’re a long-lived approval risk if the signature leaks. Don't reuse permits ------------------- Each permit signature consumes a `nonce`. Don’t try to bundle multiple swaps under a single permit. [Integration patterns](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns) [Native ETH](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth) ⌘I --- # POST /quote - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#content-area) Price a swap and return a routePlan cURL curl --request POST \ --url https://quiet-bloodhound-531.convex.site/quote \ --header 'Content-Type: application/json' \ --header 'x-api-key: ' \ --data ' { "chainId": 2, "tokenIn": "", "tokenOut": "", "amountIn": "", "slippageBps": 5000, "maxHops": 2, "splitEnabled": true, "enforcePoolDisjoint": true, "allowedDexes": [], "feeBps": 5000, "taker": "", "timeBudgetMs": 5025 } ' import requestsurl = "https://quiet-bloodhound-531.convex.site/quote"payload = { "chainId": 2, "tokenIn": "", "tokenOut": "", "amountIn": "", "slippageBps": 5000, "maxHops": 2, "splitEnabled": True, "enforcePoolDisjoint": True, "allowedDexes": [], "feeBps": 5000, "taker": "", "timeBudgetMs": 5025}headers = { "x-api-key": "", "Content-Type": "application/json"}response = requests.post(url, json=payload, headers=headers)print(response.text) const options = { method: 'POST', headers: {'x-api-key': '', 'Content-Type': 'application/json'}, body: JSON.stringify({ chainId: 2, tokenIn: '', tokenOut: '', amountIn: '', slippageBps: 5000, maxHops: 2, splitEnabled: true, enforcePoolDisjoint: true, allowedDexes: [], feeBps: 5000, taker: '', timeBudgetMs: 5025 })};fetch('https://quiet-bloodhound-531.convex.site/quote', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err)); "https://quiet-bloodhound-531.convex.site/quote", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode([ 'chainId' => 2, 'tokenIn' => '', 'tokenOut' => '', 'amountIn' => '', 'slippageBps' => 5000, 'maxHops' => 2, 'splitEnabled' => true, 'enforcePoolDisjoint' => true, 'allowedDexes' => [ ], 'feeBps' => 5000, 'taker' => '', 'timeBudgetMs' => 5025 ]), CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "x-api-key: " ],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;} package mainimport ( "fmt" "strings" "net/http" "io")func main() { url := "https://quiet-bloodhound-531.convex.site/quote" payload := strings.NewReader("{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"taker\": \"\",\n \"timeBudgetMs\": 5025\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("x-api-key", "") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body))} HttpResponse response = Unirest.post("https://quiet-bloodhound-531.convex.site/quote") .header("x-api-key", "") .header("Content-Type", "application/json") .body("{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"taker\": \"\",\n \"timeBudgetMs\": 5025\n}") .asString(); require 'uri'require 'net/http'url = URI("https://quiet-bloodhound-531.convex.site/quote")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Post.new(url)request["x-api-key"] = ''request["Content-Type"] = 'application/json'request.body = "{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"taker\": \"\",\n \"timeBudgetMs\": 5025\n}"response = http.request(request)puts response.read_body 200 400 401 429 { "quoteId": "", "routePlan": { "chainId": 123, "tokenIn": "", "tokenOut": "", "amountIn": "", "expectedAmountOut": "", "minAmountOut": "", "slippageBps": 5000, "routes": [\ {\ "amountIn": "",\ "legs": [\ {\ "tokenIn": "",\ "tokenOut": "",\ "amountIn": "",\ "minOut": "",\ "data": {\ "kind": "",\ "pool": "",\ "feeBps": 5000\ },\ "poolId": ""\ }\ ]\ }\ ], "blockNumber": 1, "feeBps": 5000, "gasEstimate": { "gasUnits": 1, "gasCostWei": "" }, "feeBreakdown": { "protocolFeeAmount": "", "integratorFeeAmount": "" }, "metadata": { "connectorsConsidered": [\ ""\ ], "candidatePaths": 1, "selectedPaths": 1, "candidates": [\ {\ "path": [\ ""\ ],\ "dexes": [],\ "projectedOut": "",\ "allocatedIn": "",\ "score": 123\ }\ ] }, "nativeIn": true, "nativeOut": true }, "expiresAt": 123 } { "error": ""} { "error": ""} { "error": ""} POST / quote Try it Price a swap and return a routePlan cURL curl --request POST \ --url https://quiet-bloodhound-531.convex.site/quote \ --header 'Content-Type: application/json' \ --header 'x-api-key: ' \ --data ' { "chainId": 2, "tokenIn": "", "tokenOut": "", "amountIn": "", "slippageBps": 5000, "maxHops": 2, "splitEnabled": true, "enforcePoolDisjoint": true, "allowedDexes": [], "feeBps": 5000, "taker": "", "timeBudgetMs": 5025 } ' import requestsurl = "https://quiet-bloodhound-531.convex.site/quote"payload = { "chainId": 2, "tokenIn": "", "tokenOut": "", "amountIn": "", "slippageBps": 5000, "maxHops": 2, "splitEnabled": True, "enforcePoolDisjoint": True, "allowedDexes": [], "feeBps": 5000, "taker": "", "timeBudgetMs": 5025}headers = { "x-api-key": "", "Content-Type": "application/json"}response = requests.post(url, json=payload, headers=headers)print(response.text) const options = { method: 'POST', headers: {'x-api-key': '', 'Content-Type': 'application/json'}, body: JSON.stringify({ chainId: 2, tokenIn: '', tokenOut: '', amountIn: '', slippageBps: 5000, maxHops: 2, splitEnabled: true, enforcePoolDisjoint: true, allowedDexes: [], feeBps: 5000, taker: '', timeBudgetMs: 5025 })};fetch('https://quiet-bloodhound-531.convex.site/quote', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err)); "https://quiet-bloodhound-531.convex.site/quote", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode([ 'chainId' => 2, 'tokenIn' => '', 'tokenOut' => '', 'amountIn' => '', 'slippageBps' => 5000, 'maxHops' => 2, 'splitEnabled' => true, 'enforcePoolDisjoint' => true, 'allowedDexes' => [ ], 'feeBps' => 5000, 'taker' => '', 'timeBudgetMs' => 5025 ]), CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "x-api-key: " ],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;} package mainimport ( "fmt" "strings" "net/http" "io")func main() { url := "https://quiet-bloodhound-531.convex.site/quote" payload := strings.NewReader("{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"taker\": \"\",\n \"timeBudgetMs\": 5025\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("x-api-key", "") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body))} HttpResponse response = Unirest.post("https://quiet-bloodhound-531.convex.site/quote") .header("x-api-key", "") .header("Content-Type", "application/json") .body("{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"taker\": \"\",\n \"timeBudgetMs\": 5025\n}") .asString(); require 'uri'require 'net/http'url = URI("https://quiet-bloodhound-531.convex.site/quote")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Post.new(url)request["x-api-key"] = ''request["Content-Type"] = 'application/json'request.body = "{\n \"chainId\": 2,\n \"tokenIn\": \"\",\n \"tokenOut\": \"\",\n \"amountIn\": \"\",\n \"slippageBps\": 5000,\n \"maxHops\": 2,\n \"splitEnabled\": true,\n \"enforcePoolDisjoint\": true,\n \"allowedDexes\": [],\n \"feeBps\": 5000,\n \"taker\": \"\",\n \"timeBudgetMs\": 5025\n}"response = http.request(request)puts response.read_body 200 400 401 429 { "quoteId": "", "routePlan": { "chainId": 123, "tokenIn": "", "tokenOut": "", "amountIn": "", "expectedAmountOut": "", "minAmountOut": "", "slippageBps": 5000, "routes": [\ {\ "amountIn": "",\ "legs": [\ {\ "tokenIn": "",\ "tokenOut": "",\ "amountIn": "",\ "minOut": "",\ "data": {\ "kind": "",\ "pool": "",\ "feeBps": 5000\ },\ "poolId": ""\ }\ ]\ }\ ], "blockNumber": 1, "feeBps": 5000, "gasEstimate": { "gasUnits": 1, "gasCostWei": "" }, "feeBreakdown": { "protocolFeeAmount": "", "integratorFeeAmount": "" }, "metadata": { "connectorsConsidered": [\ ""\ ], "candidatePaths": 1, "selectedPaths": 1, "candidates": [\ {\ "path": [\ ""\ ],\ "dexes": [],\ "projectedOut": "",\ "allocatedIn": "",\ "score": 123\ }\ ] }, "nativeIn": true, "nativeOut": true }, "expiresAt": 123 } { "error": ""} { "error": ""} { "error": ""} Use `POST /quote` to fetch a price. The response includes a stable `quoteId` you echo on `/submit` when the user is ready to swap. * **Authentication:** `x-api-key` header required. * **Rate limit:** 120 req/min per key (default). See [Rate limits](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits) . [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#request) Request ----------------------------------------------------------------------------------- * Endpoint * Body POST {API_URL}/quote Content-Type: application/json x-api-key: { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100, "feeBps": 30, "maxHops": 3, "splitEnabled": true } ### [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-parameters) Body parameters | Field | Type | Required | Description | | --- | --- | --- | --- | | `chainId` | integer | yes | EVM chain ID. Currently only `8453` (Base) is supported. | | `tokenIn` | address | yes | Token to sell. Use `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` or the zero address for native ETH. | | `tokenOut` | address | yes | Token to buy. Same native sentinel rules apply. | | `amountIn` | string | yes | Amount in base units (wei) as a decimal string. Must be `> 0`. | | `slippageBps` | integer | yes | Slippage tolerance in basis points (`100` = 1%). Range `0..10000`. | | `feeBps` | integer | no | Integrator fee in basis points, taken out of `expectedAmountOut`. Range `0..10000`. | | `maxHops` | integer | no | Maximum hops per route. Default `3`. | | `splitEnabled` | boolean | no | Allow the optimizer to split the trade across multiple routes when it improves output. Default `true`. | | `enforcePoolDisjoint` | boolean | no | When splitting, require routes to use disjoint pool sets. Off by default. | | `allowedDexes` | array of `DexId` | no | Restrict routing to a subset of venues. See [Supported DEXes](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes)
. | | `taker` | address | no | Optional taker hint. Doesn’t affect pricing for most callers. | | `timeBudgetMs` | integer | no | Per-request override of the optimizer wall-clock budget. Range `50..10000`. | [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#response) Response ------------------------------------------------------------------------------------- * 200 OK * 400 Bad Request * 401 Unauthorized * 429 Rate Limited { "quoteId": "a1b2c3d4e5f6...", "expiresAt": 1712180000000, "routePlan": { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "expectedAmountOut": "484446072048780734", "minAmountOut": "479601611328292926", "slippageBps": 100, "feeBps": 30, "blockNumber": 44266656, "gasEstimate": { "gasUnits": 300000 }, "feeBreakdown": { "protocolFeeAmount": "1457804507741243911", "integratorFeeAmount": "0" }, "routes": [\ {\ "amountIn": "1000000000",\ "legs": [\ {\ "dex": "UNIV3",\ "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",\ "tokenOut": "0x4200000000000000000000000000000000000006",\ "amountIn": "1000000000",\ "minOut": "0",\ "poolId": "0xd0b5...f224",\ "data": { "kind": "v3_direct", "pool": "0xd0b5...f224" }\ }\ ]\ }\ ], "metadata": { "candidatePaths": 16, "selectedPaths": 1, "connectorsConsidered": [\ "0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf",\ "0x9401e5e6564db35c0f86573a9828df69fc778631"\ ] } } } { "error": "amountIn must be > 0" } Other common 400 messages: `chainId required`, `slippageBps out of range`, `no routes for pair`. { "error": "unauthorized" } { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } ### [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#response-fields) Response fields | Field | Type | Description | | --- | --- | --- | | `quoteId` | string | Stable identifier for this quote. Hand to `/submit`. | | `expiresAt` | integer | Unix milliseconds at which the cached quote drops. | | `routePlan` | object | Full plan including pricing, gas estimate, and per-leg detail. See the [RoutePlan reference](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan)
for every field. | The fields you’ll most commonly surface to users: * `routePlan.expectedAmountOut` — the price you display * `routePlan.minAmountOut` — the worst case after slippage * `routePlan.routes[].legs[].dex` — list of venues used (e.g. `UNIV3 → AERODROME_CL`) * `routePlan.feeBps` — protocol + integrator fee in bps * `routePlan.gasEstimate.gasUnits` — estimated gas for the swap [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#caching-and-freshness) Caching and freshness --------------------------------------------------------------------------------------------------------------- Quotes are cached server-side under their `quoteId` for roughly 10 seconds. After `expiresAt`, calling `/submit` returns `404 quote not found or expired`. For UIs that show a live price, the recommended pattern is to re-fetch the quote every 5 to 8 seconds while the swap modal is open. See [Quote freshness](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness) . [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#examples) Examples ------------------------------------------------------------------------------------- TypeScript cURL const quote = await fetch(`${API_URL}/quote`, { method: "POST", headers: { "x-api-key": process.env.O1_API_KEY!, "content-type": "application/json", }, body: JSON.stringify({ chainId: 8453, tokenIn: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", tokenOut: "0x4200000000000000000000000000000000000006", amountIn: "1000000000", slippageBps: 100, }), }).then((r) => r.json()); curl -X POST https://quiet-bloodhound-531.convex.site/quote \ -H "x-api-key: $O1_API_KEY" \ -H "content-type: application/json" \ -d '{ "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100 }' Pair this with [`POST /submit`](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit) for the standard two-step flow, or use [`POST /execute`](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute) when you don’t need a price preview step. #### Authorizations [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#authorization-x-api-key) x-api-key string header required #### Body application/json [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-chain-id) chainId integer required EVM chain id. 8453 for Base (current Phase-1 target). Required range: `x >= 1` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-token-in) tokenIn string required 20-byte hex address. The sentinel `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) signals the chain's native asset (ETH on Base) and is recognized in `tokenIn`/`tokenOut`. Pattern: `^0x[a-fA-F0-9]{40}$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-token-out) tokenOut string required 20-byte hex address. The sentinel `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) signals the chain's native asset (ETH on Base) and is recognized in `tokenIn`/`tokenOut`. Pattern: `^0x[a-fA-F0-9]{40}$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-amount-in) amountIn string required Non-negative integer encoded as a decimal string (wei). Pattern: `^[0-9]+$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-slippage-bps) slippageBps integer required Required range: `0 <= x <= 10000` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-max-hops) maxHops integer Required range: `x >= 1` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-split-enabled) splitEnabled boolean [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-enforce-pool-disjoint) enforcePoolDisjoint boolean [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-allowed-dexes) allowedDexes enum\[\] Minimum array length: `1` Available options: `UNIV2`, `UNIV3`, `UNIV4`, `AERODROME_V2LIKE`, `AERODROME_CL`, `PANCAKE_V2`, `PANCAKE_V3`, `PANCAKE_INFINITY_CL`, `HYDREX`, `QUICKSWAP_V4`, `ALIEN_BASE_V3`, `CURVE`, `PROPSWAP`, `TESSERA`, `ELFOMOFI`, `LUNARBASE`, `FELTIR`, `DODO_V2`, `WOOFI`, `GYROSCOPE_ECLP`, `MAVERICK_V2` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-fee-bps) feeBps integer Integrator fee in bps, charged out of the output amount. Required range: `0 <= x <= 10000` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-taker) taker string 20-byte hex address. The sentinel `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (or the zero address) signals the chain's native asset (ETH on Base) and is recognized in `tokenIn`/`tokenOut`. Pattern: `^0x[a-fA-F0-9]{40}$` [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#body-time-budget-ms) timeBudgetMs integer Per-request override of the optimizer's wall-clock budget. Omit to inherit the engine default. Required range: `50 <= x <= 10000` #### Response 200 application/json Quote produced [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#response-quote-id) quoteId string required SHA-256 (or HMAC-SHA256 if the server has `O1_QUOTE_SIGNING_KEY` set) of the quote payload. Echo this on /submit. [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#response-route-plan) routePlan object required Show child attributes [​](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote#response-expires-at) expiresAt integer required Unix epoch milliseconds at which the cached quote drops. [Authentication](https://docs.o1.exchange/api/dex-aggregator/authentication) [POST /submit](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit) ⌘I --- # Community & Socials - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/community/socials#content-area) Connect with thousands of traders, developers, and DeFi enthusiasts in the o1.exchange community. Get real-time updates, trading insights, and direct support from our team. Discord Server -------------- Twitter/X --------- o1.exchange founder Twitter/X ----------------------------- o1.exchange founder Zora ------------------------ Our community is global and active 24/7. Whether you’re a beginner or experienced trader, you’ll find valuable insights and supportive community members ready to help you succeed. [Token Contract Audits](https://docs.o1.exchange/token/audits) [Platform Metrics](https://docs.o1.exchange/community/metrics) ⌘I --- # Trading API - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/trading#content-area) [​](https://docs.o1.exchange/api/trading#overview) Overview -------------------------------------------------------------- The o1.exchange Trading API enables programmatic trading with enterprise-grade features including built-in MEV protection, Permit2 support for gasless approvals, and automatic slippage handling. Key Benefits ------------ * **MEV Protection**: Private mempool routing to prevent sandwich attacks * **Gasless Approvals**: One-time Permit2 signatures for unlimited trading * **Automatic Slippage**: Built-in slippage protection with customizable limits [​](https://docs.o1.exchange/api/trading#prerequisites) Prerequisites ------------------------------------------------------------------------ Wallet ------ Ethereum wallet with private key Gas Fees -------- ETH for transaction costs Runtime ------- Node.js environment [​](https://docs.o1.exchange/api/trading#quick-start) Quick Start -------------------------------------------------------------------- ### [​](https://docs.o1.exchange/api/trading#1-generate-api-key) 1\. Generate API Key 1 [](https://docs.o1.exchange/api/trading#) Navigate to API Trading Visit [https://o1.exchange/api-trading](https://o1.exchange/api-trading) 2 [](https://docs.o1.exchange/api/trading#) Create API Key Generate your secure API token for authentication ### [​](https://docs.o1.exchange/api/trading#2-create-transaction-batch) 2\. Create Transaction Batch * Request * Response **Endpoint:** `POST https://api.o1.exchange/api/v2/order`**Headers:** { "Authorization": "Bearer ", "Content-Type": "application/json" } **Body:** { "networkId": 8453, // Network ID (8453 = Base, 56 = BSC, 1399811149 = Solana) "signerAddress": "0x...", // Your wallet address "tokenAddress": "0x...", // Token contract address "uiAmount": "1.0", // Amount in human-readable format "direction": "buy", // "buy" or "sell" "slippageBps": 300, // Slippage in basis points (300 = 3%) "mevProtection": true, // Enable MEV protection "quoteTokenAddress": "0x...", // (Optional) Quote token for stablecoin trades (Base only) "poolAddress": "0x..." // (Optional) Specific liquidity pool (Base, BSC) } { "success": true, "id": "batch_123...", "transactions": [\ {\ "id": "tx_456...",\ "unsigned": {\ "to": "0x...",\ "data": "0x...",\ "value": "0x...",\ "gasLimit": "0x...",\ "chainId": 1\ },\ "permit2": {\ "eip712": {\ "domain": {...},\ "types": {...},\ "values": {...}\ }\ }\ }\ ] } ### [​](https://docs.o1.exchange/api/trading#3-sign-transaction-and-permit2) 3\. Sign Transaction and Permit2 Implementation Details For each transaction in the response: 1. **Sign Permit2 (if present):** * Extract the EIP-712 typed data from `permit2.eip712` * Sign using wallet’s `signTypedData` method * Replace the signature placeholder in transaction data 2. **Sign the transaction:** * Create transaction object from the unsigned data * Sign using wallet’s `signTransaction` method // Fixed signature placeholder - don't change const SIGNATURE_PLACEHOLDER = "42f68902113a2a579bcc207c91254c8516d921250e748c18a082d91d74908f8e9a05f27b72a030c6a42d77d0e0aab6fb09219b01a01e7b5b24e4f322ee1762ff1b"; for (const ctx of data.transactions) { const unsignedTx = Transaction.from(ctx.unsigned); // Handle Permit2 signature if present if (ctx?.permit2?.eip712) { const { domain, types, values } = ctx.permit2.eip712; const signature = await wallet.signTypedData(domain, types, values); // Replace placeholder with actual signature let txData = unsignedTx.data; txData = txData.replace(SIGNATURE_PLACEHOLDER, signature.slice(2)); unsignedTx.data = txData; } // Sign the transaction const signedTx = await wallet.signTransaction(unsignedTx); } ### [​](https://docs.o1.exchange/api/trading#4-submit-transaction) 4\. Submit Transaction * Request * Response **Endpoint:** `POST https://api.o1.exchange/api/v2/order/complete`**Headers:** { "Authorization": "Bearer ", "Content-Type": "application/json" } **Body:** { "id": "batch_123...", // Batch ID from create response "transactions": [\ {\ "id": "tx_456...", // Transaction ID\ "signed": "0x...", // Signed transaction hex\ "permit2": {\ "eip712": {\ "signature": "0x..." // Permit2 signature\ }\ }\ }\ ] } { "success": true, "transactions": [\ {\ "hash": "0x...", // Transaction hash\ "status": "pending", // Transaction status\ "tokenDelta": "1000000" // Token balance change\ }\ ] } [​](https://docs.o1.exchange/api/trading#sample-scripts-&-examples) Sample Scripts & Examples ------------------------------------------------------------------------------------------------ Complete Sample Repository -------------------------- **GitHub Repository:** [https://github.com/CohumanSpace/o1-api](https://github.com/CohumanSpace/o1-api) This repository contains complete sample scripts for using the o1.exchange API, including: * Interactive CLI trading application * Complete integration examples * Proper error handling patterns * Environment setup guides [​](https://docs.o1.exchange/api/trading#interactive-example) Interactive Example ------------------------------------------------------------------------------------ Complete CLI Trading App ------------------------ See `execute-trade-interactive.js` in the [sample repository](https://github.com/CohumanSpace/o1-api) for a fully functional CLI trading application that demonstrates all integration steps with proper error handling and user interaction. ### [​](https://docs.o1.exchange/api/trading#setup-environment) Setup Environment Create a `.env.local` file: EXECUTE_TRADE_PRIVATE_KEY= EXECUTE_TRADE_API_TOKEN= EXECUTE_TRADE_BASE_URL= EXECUTE_TRADE_RPC_URL= ### [​](https://docs.o1.exchange/api/trading#run-interactive-cli) Run Interactive CLI node execute-trade-interactive.js 1 [](https://docs.o1.exchange/api/trading#) Token Address Enter token contract address (e.g., `0x06ca615ac72a18e76b63bd4b5c320b6c8e291f8b`) 2 [](https://docs.o1.exchange/api/trading#) Trade Direction Choose `buy` or `sell` 3 [](https://docs.o1.exchange/api/trading#) Amount Enter amount in ETH (for buy) or tokens (for sell) 4 [](https://docs.o1.exchange/api/trading#) Confirm Review trade details and execute 5 [](https://docs.o1.exchange/api/trading#) Results View balance changes after execution [​](https://docs.o1.exchange/api/trading#advanced-features) Advanced Features -------------------------------------------------------------------------------- Permit2 Integration ------------------- **Gasless token approvals** using EIP-712 signatures * Automatic signature placeholder replacement * One-time approval for unlimited trading * Reduced gas costs for frequent traders MEV Protection -------------- **Protection against sandwich attacks** * Private mempool routing * Reduced slippage from MEV bots * Enable with `mevProtection: true` ### [​](https://docs.o1.exchange/api/trading#slippage-control) Slippage Control Specify `slippageBps` in basis points where **100 bps = 1%****Recommendations:** * **Normal conditions:** 300 bps (3%) * **Volatile tokens:** 500-1000 bps (5-10%) * **Large trades:** Increase as needed [​](https://docs.o1.exchange/api/trading#error-handling) Error Handling -------------------------------------------------------------------------- Always implement proper error handling for: * Network connectivity issues * Insufficient balance or gas * Transaction reverts * API rate limiting The interactive example includes comprehensive error handling patterns you can reference for your own implementation. [Referrals & Rewards](https://docs.o1.exchange/features/referrals-rewards) [Introduction](https://docs.o1.exchange/api/dex-aggregator/introduction) ⌘I --- # Supported DEXes - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes#content-area) The router can dispatch legs to the venues below. The `DexId` value appears in `routePlan.routes[].legs[].dex` on every quote response, and you can pass any subset of these in the optional `allowedDexes` field on `/quote` and `/execute` to restrict routing. [​](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes#constant-product-v2-style) Constant-product (V2-style) ----------------------------------------------------------------------------------------------------------------------------------- Single-hop direct-pool swaps via the V2 product formula `x × y = k`. | `DexId` | Protocol | Notes | | --- | --- | --- | | `UNIV2` | Uniswap V2 | Multi-hop fallback also uses this kind. | | `AERODROME_V2LIKE` | Aerodrome volatile pools | The V2-style side of Aerodrome (non-stable). | | `PANCAKE_V2` | PancakeSwap V2 | | [​](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes#concentrated-liquidity-v3-style) Concentrated liquidity (V3-style) ----------------------------------------------------------------------------------------------------------------------------------------------- Tick-aware pool math. | `DexId` | Protocol | Notes | | --- | --- | --- | | `UNIV3` | Uniswap V3 | Direct-pool dispatch for single hop, path-encoded for multi-hop. | | `PANCAKE_V3` | PancakeSwap V3 | | | `PANCAKE_INFINITY_CL` | PancakeSwap Infinity Concentrated Liquidity | | | `ALIEN_BASE_V3` | AlienBase V3 | | | `HYDREX` | Hydrex | Algebra Integral family. | | `QUICKSWAP_V4` | QuickSwap V4 | Algebra Integral family. | [​](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes#universal-router-v4-style) Universal router (V4-style) ----------------------------------------------------------------------------------------------------------------------------------- Uniswap V4 is dispatched through the universal-router commands ABI. | `DexId` | Protocol | Notes | | --- | --- | --- | | `UNIV4` | Uniswap V4 | Carries an opaque `commands` byte string and `inputs[]` array. | [​](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes#stable-and-curve-style) Stable and curve-style --------------------------------------------------------------------------------------------------------------------------- | `DexId` | Protocol | Notes | | --- | --- | --- | | `AERODROME_CL` | Aerodrome Concentrated Liquidity | Stable side of Aerodrome. | | `CURVE` | Curve TwoCrypto-NG (and compatibles) | Pool-indexed by `i` / `j`. | [​](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes#proprietary-on-chain-amms) Proprietary on-chain AMMs --------------------------------------------------------------------------------------------------------------------------------- These are direct integrations with project-specific AMMs on Base. All dispatch through a router contract per protocol. | `DexId` | Protocol | | --- | --- | | `PROPSWAP` | PropSwap | | `TESSERA` | Tessera | | `ELFOMOFI` | Elfomofi | | `LUNARBASE` | LunarBase | | `FELTIR` | Feltir | [​](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes#other-on-chain-venues) Other on-chain venues ------------------------------------------------------------------------------------------------------------------------- | `DexId` | Protocol | Notes | | --- | --- | --- | | `DODO_V2` | DODO V2 | Carries `pool` and `baseToken` for direction. | | `WOOFI` | WooFi | Routed through the WooFi router contract. | | `GYROSCOPE_ECLP` | Gyroscope ECLP | Elliptic concentrated liquidity. | | `MAVERICK_V2` | Maverick V2 | | [​](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes#restricting-routing) Restricting routing --------------------------------------------------------------------------------------------------------------------- If you want to limit which venues the optimizer considers (e.g. for a benchmarking experiment, or to avoid a specific protocol), pass `allowedDexes` on `/quote` or `/execute`: { "chainId": 8453, "tokenIn": "0x...", "tokenOut": "0x...", "amountIn": "1000000000", "slippageBps": 100, "allowedDexes": ["UNIV3", "AERODROME_CL", "PANCAKE_V3"] } Restricting `allowedDexes` reduces routing flexibility. Expect worse `expectedAmountOut` than an unrestricted quote. Use only when you have a clear reason. [​](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes#what%E2%80%99s-not-supported) What’s NOT supported ------------------------------------------------------------------------------------------------------------------------------- Off-chain professional market makers (PMMs) used by some upstream aggregators are **not** in this list. Bridges, cross-chain venues, and limit-order books are also out of scope; this aggregator is same-chain spot routing on Base. [RoutePlan schema](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan) [Rate limits](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits) ⌘I --- # Onramp Fiat to Crypto - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/features/onramp#content-area) o1.exchange provides integrated fiat onramp solutions powered by Coinbase, allowing you to convert traditional currencies (USD, EUR, etc.) directly into cryptocurrency without leaving the platform. ### [​](https://docs.o1.exchange/features/onramp#supported-payment-methods) Supported Payment Methods Credit/Debit Cards ------------------ Instant purchases with major credit and debit cards Bank Transfers -------------- Lower fees with ACH and wire transfer options Digital Wallets --------------- Support for Apple Pay, Google Pay, and other digital wallets #### [​](https://docs.o1.exchange/features/onramp#1-input-the-amount-of-chain-native-token-to-purchase) 1\. Input the amount of chain native token to purchase ![Onramp process illustration](https://mintcdn.com/o1exchange/h74U8tuW1ielvxuG/images/onramp.png?w=2500&fit=max&auto=format&n=h74U8tuW1ielvxuG&q=85&s=34877dab1d0c2ee85ac99d489c5d39f9) #### [​](https://docs.o1.exchange/features/onramp#2-complete-the-purchase) 2\. Complete the purchase ![Coinbase integration illustration](https://mintcdn.com/o1exchange/Ix685kbNC5WvJDg-/images/onramp-cb.png?w=2500&fit=max&auto=format&n=Ix685kbNC5WvJDg-&q=85&s=1469edbfe5609deb26e957909bffd5f1) [Trading Fees](https://docs.o1.exchange/getting-started/fees) [Explore Tokens](https://docs.o1.exchange/features/explore-tokens) ⌘I --- # Quickstart - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/quickstart#content-area) This guide walks you through a complete swap from a TypeScript client. We’ll trade **1,000 USDC for WETH** on Base, then receive native ETH back instead of WETH. Production base URL is currently `https://quiet-bloodhound-531.convex.site`. If you’re integrating against a vanity domain (e.g. `https://api.o1.exchange/dex`), substitute that throughout. [​](https://docs.o1.exchange/api/dex-aggregator/quickstart#prerequisites) Prerequisites ------------------------------------------------------------------------------------------ API key ------- See [Authentication](https://docs.o1.exchange/api/dex-aggregator/authentication) to request one. Base RPC URL ------------ Any Base mainnet RPC works. We use `viem` defaults below. Wallet with USDC ---------------- Plus a small ETH balance to pay gas (and approve the router if this is your first swap). [​](https://docs.o1.exchange/api/dex-aggregator/quickstart#1-set-up-your-client) 1\. Set up your client ---------------------------------------------------------------------------------------------------------- import { createPublicClient, createWalletClient, http, erc20Abi } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; const API_URL = "https://quiet-bloodhound-531.convex.site"; const API_KEY = process.env.O1_API_KEY!; const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const publicClient = createPublicClient({ chain: base, transport: http() }); const walletClient = createWalletClient({ chain: base, account, transport: http() }); const USDC = "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"; const WETH = "0x4200000000000000000000000000000000000006"; [​](https://docs.o1.exchange/api/dex-aggregator/quickstart#2-get-a-quote) 2\. Get a quote -------------------------------------------------------------------------------------------- * Request * Response **Endpoint:** `POST {API_URL}/quote` const quote = await fetch(`${API_URL}/quote`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json", }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", // 1,000 USDC (6 decimals) slippageBps: 100, // 1% slippage tolerance }), }).then((r) => r.json()); { "quoteId": "a1b2c3d4...", "expiresAt": 1712180000000, "routePlan": { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "expectedAmountOut": "484446072048780734", "minAmountOut": "479601611328292926", "slippageBps": 100, "blockNumber": 44266656, "gasEstimate": { "gasUnits": 300000 }, "routes": [\ {\ "amountIn": "1000000000",\ "legs": [\ {\ "dex": "UNIV3",\ "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",\ "tokenOut": "0x4200000000000000000000000000000000000006",\ "amountIn": "1000000000",\ "minOut": "0",\ "poolId": "0xd0b5...f224",\ "data": { "kind": "v3_direct", "pool": "0xd0b5...f224" }\ }\ ]\ }\ ] } } The fields you’ll display to the user: * `routePlan.expectedAmountOut` — the price you quote * `routePlan.minAmountOut` — the worst-case fill after slippage * `routePlan.routes[].legs[].dex` — which venues are involved * `expiresAt` — quote validity window (about 10 seconds; see [Quote freshness](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness) ) [​](https://docs.o1.exchange/api/dex-aggregator/quickstart#3-approve-the-router-first-swap-only) 3\. Approve the router (first swap only) -------------------------------------------------------------------------------------------------------------------------------------------- Skip this step entirely if `tokenIn` is native ETH, or if you’re using an EIP-2612 permit (see [`POST /submit`](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit) → `permit`). const ROUTER = "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3"; const allowance = await publicClient.readContract({ address: USDC, abi: erc20Abi, functionName: "allowance", args: [account.address, ROUTER], }); if (allowance < BigInt(quote.routePlan.amountIn)) { await walletClient.writeContract({ address: USDC, abi: erc20Abi, functionName: "approve", args: [ROUTER, BigInt(quote.routePlan.amountIn)], }); } [​](https://docs.o1.exchange/api/dex-aggregator/quickstart#4-build-the-transaction) 4\. Build the transaction ---------------------------------------------------------------------------------------------------------------- * Request * Response **Endpoint:** `POST {API_URL}/submit` const submit = await fetch(`${API_URL}/submit`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json", }, body: JSON.stringify({ quoteId: quote.quoteId, user: account.address, unwrapNativeOut: true, // receive native ETH instead of WETH }), }).then((r) => r.json()); { "quoteId": "a1b2c3d4...", "chainId": 8453, "to": "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3", "data": "0x...", "value": "0" } [​](https://docs.o1.exchange/api/dex-aggregator/quickstart#5-sign-and-send) 5\. Sign and send ------------------------------------------------------------------------------------------------ const txHash = await walletClient.sendTransaction({ to: submit.to as `0x${string}`, data: submit.data as `0x${string}`, value: BigInt(submit.value), }); console.log(`Submitted: https://basescan.org/tx/${txHash}`); That’s it. Wait for the receipt with `publicClient.waitForTransactionReceipt({ hash: txHash })` and the swap is complete. [​](https://docs.o1.exchange/api/dex-aggregator/quickstart#full-example-end-to-end) Full example, end to end --------------------------------------------------------------------------------------------------------------- Complete TypeScript script import { createPublicClient, createWalletClient, http, erc20Abi } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; const API_URL = "https://quiet-bloodhound-531.convex.site"; const API_KEY = process.env.O1_API_KEY!; const ROUTER = "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3"; const USDC = "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"; const WETH = "0x4200000000000000000000000000000000000006"; async function main() { const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); const publicClient = createPublicClient({ chain: base, transport: http() }); const walletClient = createWalletClient({ chain: base, account, transport: http() }); // 1. Quote const quote = await fetch(`${API_URL}/quote`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json" }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", slippageBps: 100, }), }).then((r) => r.json()); console.log(`Expected out: ${quote.routePlan.expectedAmountOut} WETH (wei)`); // 2. Approve if needed const allowance = await publicClient.readContract({ address: USDC, abi: erc20Abi, functionName: "allowance", args: [account.address, ROUTER], }); if (allowance < BigInt(quote.routePlan.amountIn)) { const approveHash = await walletClient.writeContract({ address: USDC, abi: erc20Abi, functionName: "approve", args: [ROUTER, BigInt(quote.routePlan.amountIn)], }); await publicClient.waitForTransactionReceipt({ hash: approveHash }); } // 3. Submit const submit = await fetch(`${API_URL}/submit`, { method: "POST", headers: { "x-api-key": API_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: quote.quoteId, user: account.address, unwrapNativeOut: true, }), }).then((r) => r.json()); // 4. Send const txHash = await walletClient.sendTransaction({ to: submit.to as `0x${string}`, data: submit.data as `0x${string}`, value: BigInt(submit.value), }); const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash }); console.log(`Confirmed in block ${receipt.blockNumber}`); } main().catch(console.error); [​](https://docs.o1.exchange/api/dex-aggregator/quickstart#what%E2%80%99s-next) What’s next ---------------------------------------------------------------------------------------------- Two-step vs one-step -------------------- When to use `/quote` + `/submit` vs `/execute`. ERC-20 approvals ---------------- Approve patterns, including one-tx permit-enabled swaps. Native ETH ---------- Sell ETH directly without wrapping, or receive ETH instead of WETH. Quote freshness --------------- How to keep the displayed price live in your UI. [Introduction](https://docs.o1.exchange/api/dex-aggregator/introduction) [Authentication](https://docs.o1.exchange/api/dex-aggregator/authentication) ⌘I --- # Referrals & Rewards - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/features/referrals-rewards#content-area) [​](https://docs.o1.exchange/features/referrals-rewards#rewards-&-referral-dashboard) Rewards & Referral Dashboard --------------------------------------------------------------------------------------------------------------------- Manage and track all your rewards and referral activities in one place. The dashboard provides a comprehensive overview of your trading and referral performance, including: * **Trading Tier**: View your current trading tier and the benefits it unlocks. * **Cashback Rate**: See your current cashback percentage based on your trading activity. * **Cashback Rewards**: Track the total cashback you’ve earned. * **Total Trading Volume (per chain)**: Monitor your trading volume across different supported blockchains. * **Referral Rewards**: View the total rewards earned from referring others. * **Total Referred Users**: See how many users have signed up using your referral code. * **Referred Volume**: Track the trading volume generated by your referred users. * **Cashback History**: Review a detailed history of your cashback rewards. * **Reward History**: Access a log of all rewards earned through trading and referrals. * **Multi-Tier Referrals**: Analyze your referred users across multiple tiers and their corresponding trading volumes. ![Rewards and referral dashboard](https://mintcdn.com/o1exchange/ySgJHHhyW29Mn_LX/images/rewards.png?w=2500&fit=max&auto=format&n=ySgJHHhyW29Mn_LX&q=85&s=411ff7dad8dd7abc5ef1028cd20fdca8) * * * [​](https://docs.o1.exchange/features/referrals-rewards#set-your-referral-code) Set Your Referral Code --------------------------------------------------------------------------------------------------------- Personalize your referral code to make it easy to share with friends and track your referrals. Setting your code is simple: ![Set referral code](https://mintcdn.com/o1exchange/ySgJHHhyW29Mn_LX/images/set-ref-code.png?w=2500&fit=max&auto=format&n=ySgJHHhyW29Mn_LX&q=85&s=34aec13b33274cb9c935bf6422aefed5) 1. Choose a unique referral code. 2. Save your code to activate it. 3. Share your code with friends to start earning rewards. * * * [​](https://docs.o1.exchange/features/referrals-rewards#share-and-earn-together) Share and Earn Together ----------------------------------------------------------------------------------------------------------- Invite friends to o1.exchange using your referral code. When they trade, you both benefit—your friends receive a portion of their trading commission back as cashback, and you earn referral rewards based on their activity. ![Share referral code](https://mintcdn.com/o1exchange/ySgJHHhyW29Mn_LX/images/share-referrals.png?w=2500&fit=max&auto=format&n=ySgJHHhyW29Mn_LX&q=85&s=b3ea7c0bf744922cf7a8e8acf50da743) * Share your code via social media, messaging apps, or directly. * Track the rewards and cashback earned by you and your referred users in real time. * Multi-tier referrals let you benefit from the activity of users referred by your direct referrals as well. Set your referral code, share it, and start earning rewards together! All referral and cashback rewards are transparently tracked in your dashboard. [Portfolio](https://docs.o1.exchange/features/portfolio) [Trading API](https://docs.o1.exchange/api/trading) ⌘I --- # Trading - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/features/trading#content-area) [​](https://docs.o1.exchange/features/trading#trading-features) Trading Features ----------------------------------------------------------------------------------- Unlock powerful trading tools designed for both beginners and advanced users. Our platform supports a variety of order types to help you execute your strategies with precision. ### [​](https://docs.o1.exchange/features/trading#1-spot-order) 1\. Spot Order A spot order allows you to buy or sell tokens instantly at the current market price. ### [​](https://docs.o1.exchange/features/trading#2-limit-order) 2\. Limit Order Set your desired price and let the system execute your trade when the market reaches your target. ### [​](https://docs.o1.exchange/features/trading#3-sniper-order) 3\. Sniper Order Sniper orders are designed for high-speed execution, letting you target specific liquidity events or new token launches. ### [​](https://docs.o1.exchange/features/trading#4-twap-time-weighted-average-price) 4\. TWAP (Time-Weighted Average Price) TWAP orders help you minimize market impact by splitting your trade into smaller orders executed over a set period. * * * [​](https://docs.o1.exchange/features/trading#how-to-trade) How to Trade --------------------------------------------------------------------------- Follow these simple steps to place a trade: ### [​](https://docs.o1.exchange/features/trading#1-review-token-details) 1\. Review Token Details ![Token Detail](https://mintcdn.com/o1exchange/h74U8tuW1ielvxuG/images/token-detail.png?w=2500&fit=max&auto=format&n=h74U8tuW1ielvxuG&q=85&s=4a709f59bec954046a497a8b9ba5ac94) Check the token’s information, including price, liquidity, and recent activity, to make informed decisions. ### [​](https://docs.o1.exchange/features/trading#2-configure-your-wallet) 2\. Configure Your Wallet ![Wallet Configuration](https://mintcdn.com/o1exchange/ubjlOY3NPZbEbESU/images/wallet-config.png?w=2500&fit=max&auto=format&n=ubjlOY3NPZbEbESU&q=85&s=5935b3da6160bdecb76e4fd0540cfae5) Select your active wallet for multi-wallet trading. ### [​](https://docs.o1.exchange/features/trading#3-place-your-trade) 3\. Place Your Trade ![Place Trade](https://mintcdn.com/o1exchange/ubjlOY3NPZbEbESU/images/place-trade.png?w=2500&fit=max&auto=format&n=ubjlOY3NPZbEbESU&q=85&s=3d877cc82dfe1cb5abe94303bfc581b4) Choose your order type (Spot, Limit, Sniper, or TWAP), enter the trade details, and confirm your transaction. * * * Advanced trading features are continuously being improved. Stay tuned for updates and new order types! [Explore Tokens](https://docs.o1.exchange/features/explore-tokens) [Wallets](https://docs.o1.exchange/features/wallets) ⌘I --- # Platform Metrics - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/community/metrics#content-area) Dune Analytics Dashboard ------------------------ View comprehensive platform metrics including trading volumes, active users, fee generation, and network distribution Bookmark the Dune dashboard to stay updated on platform performance and trading trends. The data is particularly useful for understanding market dynamics and making informed trading decisions. [Community & Socials](https://docs.o1.exchange/community/socials) [Bug Bounty Program](https://docs.o1.exchange/community/bug-bounty) ⌘I --- # RoutePlan schema - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#content-area) The `routePlan` object is returned on every successful `/quote` and `/execute` call. It’s the canonical description of what the swap will do, broken down by route and leg. You don’t need to construct a `RoutePlan` yourself. The API generates it; this page is for callers who want to display its contents in detail or audit a swap before signing. [​](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#top-level-shape) Top-level shape -------------------------------------------------------------------------------------------------------- { "chainId": 8453, "tokenIn": "0x...", "tokenOut": "0x...", "amountIn": "1000000000", "expectedAmountOut": "484446072048780734", "minAmountOut": "479601611328292926", "slippageBps": 100, "feeBps": 30, "blockNumber": 44266656, "gasEstimate": { "gasUnits": 300000, "gasCostWei": "..." }, "feeBreakdown": { "protocolFeeAmount": "...", "integratorFeeAmount": "..." }, "routes": [ /* SplitRoute[] */ ], "metadata": { /* RouteMetadata */ }, "nativeIn": false, "nativeOut": false } | Field | Type | Description | | --- | --- | --- | | `chainId` | integer | EVM chain ID. `8453` for Base. | | `tokenIn` | address | Echo of the request `tokenIn`. | | `tokenOut` | address | Echo of the request `tokenOut`. | | `amountIn` | string | Echo of the request `amountIn`, in wei. | | `expectedAmountOut` | string | The output amount the optimizer believes you’ll receive, in wei. | | `minAmountOut` | string | The on-chain enforced minimum after slippage. | | `slippageBps` | integer | Slippage tolerance in bps. Same value as the request. | | `feeBps` | integer | Total fee in bps (protocol + optional integrator). | | `blockNumber` | integer | Block at which the routing engine snapshotted pool state. | | `gasEstimate` | object | Estimated gas usage. See [gasEstimate](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#gasestimate)
. | | `feeBreakdown` | object | Fee split between protocol and integrator. See [feeBreakdown](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#feebreakdown)
. | | `routes` | array | One or more `SplitRoute` objects. See [Routes](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#routes)
. | | `metadata` | object | Optimizer telemetry. See [metadata](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#metadata)
. | | `nativeIn` | boolean | `true` when the request used the native sentinel for `tokenIn`. The submit handler must set `useNativeIn: true` accordingly. | | `nativeOut` | boolean | `true` when the request used the native sentinel for `tokenOut`. Mirrors of `nativeIn`. | [​](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#gasestimate) `gasEstimate` -------------------------------------------------------------------------------------------------- { "gasUnits": 300000, "gasCostWei": "12000000000000000" } | Field | Type | Description | | --- | --- | --- | | `gasUnits` | integer | Estimated gas units the swap will consume. | | `gasCostWei` | string | (Optional) Estimated gas cost in wei at the snapshotted base fee. Display only; the transaction is priced by the user’s wallet, not this number. | [​](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#feebreakdown) `feeBreakdown` ---------------------------------------------------------------------------------------------------- { "protocolFeeAmount": "1457804507741243911", "integratorFeeAmount": "0" } | Field | Type | Description | | --- | --- | --- | | `protocolFeeAmount` | string | Protocol fee taken out of `expectedAmountOut`, in `tokenOut` base units. | | `integratorFeeAmount` | string | Integrator fee (when you set `feeBps` on the request), in `tokenOut` base units. | [​](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#routes) Routes -------------------------------------------------------------------------------------- `routes[]` is an array of `SplitRoute`. Each route is one path through the venue graph. When the optimizer splits a trade, you’ll see multiple entries with the input divided across them. { "amountIn": "600000000", "legs": [ /* RouteLeg[] */ ] } | Field | Type | Description | | --- | --- | --- | | `amountIn` | string | Portion of the total `amountIn` allocated to this route. | | `legs` | array | 1 to 3 hops. Each `leg` swaps one pair on a specific venue. | ### [​](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#routeleg) `RouteLeg` { "dex": "UNIV3", "tokenIn": "0x...", "tokenOut": "0x...", "amountIn": "600000000", "minOut": "0", "poolId": "0xd0b5...f224", "data": { "kind": "v3_direct", "pool": "0xd0b5...f224" } } | Field | Type | Description | | --- | --- | --- | | `dex` | `DexId` | Which venue the adapter dispatches to. See [Supported DEXes](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes)
. | | `tokenIn` | address | Input token for this leg. | | `tokenOut` | address | Output token for this leg. | | `amountIn` | string | Input amount to this leg, in wei. | | `minOut` | string | Minimum output for this leg in isolation. May be `0` because the global `minAmountOut` is the binding check. | | `poolId` | string | A human-friendly identifier for the pool, when applicable. | | `data` | object | Tagged union with `kind` discriminator. Shape varies per venue. See below. | ### [​](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#data-shapes-by-kind) `data` shapes (by `kind`) The `data` object is a tagged union keyed by `kind`. The router’s adapter for each venue knows how to consume the corresponding shape. | `kind` | Carries | Used for | | --- | --- | --- | | `v2_direct` | `pool`, `feeBps` | Single Uni V2 / Aerodrome V2-like / PancakeSwap V2 pool | | `v3_direct` | `pool` | Single Uni V3 pool | | `pancake_v3_direct` | `pool` | Single PancakeSwap V3 pool | | `algebra_direct` | `pool` | Algebra family pool (Hydrex, QuickSwap V4) | | `hydrex` | `deadline` | Hydrex multi-hop | | `univ4` | `commands`, `inputs`, `deadline` | Uniswap V4 universal-router payload | | `curve` | `pool`, `i`, `j` | Curve TwoCrypto-NG (or compatible) | | `prop_amm` | `router`, `protocol` | Proprietary AMMs (PropSwap, Tessera, Elfomofi, LunarBase, Feltir) | | `dodo_v2` | `pool`, `baseToken` | DODO V2 | | `woofi` | `router` | WooFi | | `univ2` | `path`, `deadline` | Multi-hop V2 fallback | | `univ3` | `path`, `deadline` | Multi-hop V3 path-encoded fallback | | `aerodrome_v2` | `routes`, `deadline` | Aerodrome multi-hop with stable/volatile flags | These details exist mainly for debugging and auditing. Application code rarely needs to inspect them. [​](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan#metadata) `metadata` -------------------------------------------------------------------------------------------- Optimizer telemetry. Useful for displaying a “tried N paths, picked M” indicator in dev tools or analytics. { "candidatePaths": 16, "selectedPaths": 1, "connectorsConsidered": [\ "0xcbb7...3bf",\ "0x9401...631"\ ], "candidates": [ /* RouteCandidateMetadata[] */ ] } | Field | Type | Description | | --- | --- | --- | | `candidatePaths` | integer | Number of token paths the optimizer considered. | | `selectedPaths` | integer | How many of those are in the final plan. | | `connectorsConsidered` | array of address | Intermediate tokens the optimizer hopped through. | | `candidates` | array | (Optional) Per-candidate scoring detail. Useful for debugging “why did it pick that route?” | In production UIs, the only fields most apps need from `routePlan` are `expectedAmountOut`, `minAmountOut`, `feeBps`, `gasEstimate.gasUnits`, and the list of `dex` names from `routes[].legs[]`. Treat the rest as advanced. [Router contract](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract) [Supported DEXes](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes) ⌘I --- # Portfolio - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/features/portfolio#content-area) [​](https://docs.o1.exchange/features/portfolio#portfolio-overview) Portfolio Overview ----------------------------------------------------------------------------------------- Easily track your entire crypto portfolio in one place. The portfolio dashboard provides a comprehensive summary of your assets, including real-time balances, performance stats, and detailed analytics. ![Portfolio summary dashboard](https://mintcdn.com/o1exchange/tQM_I0_yQ7HLOyvT/images/portfolio.png?w=2500&fit=max&auto=format&n=tQM_I0_yQ7HLOyvT&q=85&s=3e783e992819e518f24fabc1f917cba1) ### [​](https://docs.o1.exchange/features/portfolio#multi-wallet-analytics) Multi-Wallet Analytics You can view your portfolio analytics for: * **All wallets combined** for a complete overview * **Main wallet** or any **active wallet** * **Custom wallet combinations**—select any set of wallets to analyze their aggregated balances, performance, and token distribution #### [​](https://docs.o1.exchange/features/portfolio#1-select-wallets-to-analyze) 1\. Select Wallets to Analyze ![Select wallets for analytics](https://mintcdn.com/o1exchange/tQM_I0_yQ7HLOyvT/images/portfolio-select-wallets.png?w=2500&fit=max&auto=format&n=tQM_I0_yQ7HLOyvT&q=85&s=722936da83b9bd0193fa6055943d3270) Choose your main, active, or any combination of wallets to customize your analytics view. #### [​](https://docs.o1.exchange/features/portfolio#2-view-aggregated-analytics) 2\. View Aggregated Analytics ![Aggregated analytics across wallets](https://mintcdn.com/o1exchange/tQM_I0_yQ7HLOyvT/images/portfolio-multi-wallets.png?w=2500&fit=max&auto=format&n=tQM_I0_yQ7HLOyvT&q=85&s=2c8467aae3d043b8fd6b0528dd962bf1) Instantly see aggregated stats, token allocations, and performance metrics across your selected wallets. The portfolio dashboard gives you full flexibility to analyze your holdings across any wallet or group of wallets, helping you make informed decisions with complete visibility. [Wallets](https://docs.o1.exchange/features/wallets) [Referrals & Rewards](https://docs.o1.exchange/features/referrals-rewards) ⌘I --- # Explore Tokens - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/features/explore-tokens#content-area) o1.exchange provides comprehensive token exploration tools to help you discover new opportunities, research projects, and make informed trading decisions across multiple blockchain networks. ### [​](https://docs.o1.exchange/features/explore-tokens#token-discovery-features) Token Discovery Features Trending Tokens --------------- Discover the most popular and trending tokens based on trading volume and community interest New Listings ------------ Stay updated with newly listed tokens and early-stage opportunities Top Gainers/Losers ------------------ Track the best and worst performing tokens over various time periods High Volume ----------- Find tokens with exceptional trading volume and liquidity #### [​](https://docs.o1.exchange/features/explore-tokens#explore-tokens-in-pulse) Explore Tokens in Pulse ![Pulse page showing new token pairs](https://mintcdn.com/o1exchange/h74U8tuW1ielvxuG/images/pulse.png?w=2500&fit=max&auto=format&n=h74U8tuW1ielvxuG&q=85&s=0755efb96affb176f6d063c9864ecad1) Use the **Pulse** page to discover new trading pairs that have been recently launched. This section highlights tokens that are gaining traction, allowing you to spot emerging opportunities early. #### [​](https://docs.o1.exchange/features/explore-tokens#filter-tokens-by-your-criteria) Filter Tokens by Your Criteria ![Pulse page filter options](https://mintcdn.com/o1exchange/h74U8tuW1ielvxuG/images/pulse-filter.png?w=2500&fit=max&auto=format&n=h74U8tuW1ielvxuG&q=85&s=894538ce8488f2703f8360cee303d778) Apply advanced filters to narrow down tokens based on your selection criteria—such as trading volume, price change, liquidity, or launch time. This helps you focus on tokens that best match your investment or trading strategy. [Onramp Fiat to Crypto](https://docs.o1.exchange/features/onramp) [Trading](https://docs.o1.exchange/features/trading) ⌘I --- # Trading Season 1: Early Beta - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/getting-started/rewards/season-1#content-area) [​](https://docs.o1.exchange/getting-started/rewards/season-1#og-trader-program) OG Trader Program ----------------------------------------------------------------------------------------------------- Trading Season 1 recognizes early adopters who participated in the o1.exchange beta period. This exclusive program rewards traders who helped shape the platform during its initial launch. ### [​](https://docs.o1.exchange/getting-started/rewards/season-1#eligibility-period) Eligibility Period Start Date ---------- **May 17, 2025** - First day of eligibility End Date -------- **September 5, 2025** - Last day to qualify ### [​](https://docs.o1.exchange/getting-started/rewards/season-1#og-trader-badge-requirements) OG Trader Badge Requirements ![OG Badge](https://docs.o1.exchange/images/og-badge.gif) To earn the exclusive OG Trader Badge: * Trade during the eligibility period (May 17 - September 5, 2025) * Reach **Level Tier 2 (Silver tier)** through trading activity * Maintain active participation throughout the season ### [​](https://docs.o1.exchange/getting-started/rewards/season-1#points-calculation) Points Calculation The OG Trader program rewards early participation with higher points for earlier trading dates: * Points Schedule * How It Works | Trading Start Date | Points Earned | Bonus Type | | --- | --- | --- | | Day 1 (May 17) | **5,000 points** | Maximum Early Bird | | Week 1 | ~4,500 points | High Early Bird | | Month 1 | ~3,500 points | Early Bird | | Mid-period | ~2,550 points | Standard | | Month 3 | ~1,000 points | Late Entry | | Last day (Sep 5) | **100 points** | Minimum | | After Sep 5 | 0 points | Ineligible | * Points decrease linearly from the maximum to minimum over the eligibility period * Earlier traders receive significantly more rewards * No points are awarded for trading after the season ends * Points are awarded once per trader based on their first trade date [​](https://docs.o1.exchange/getting-started/rewards/season-1#benefits-&-recognition) Benefits & Recognition --------------------------------------------------------------------------------------------------------------- Exclusive Badge --------------- Permanent OG Trader status displayed on your profile Bonus Points ------------ Up to 5,000 additional points for early participation Community Recognition --------------------- Special recognition in the o1.exchange community The OG Trader program was a one-time opportunity for early beta participants. Future seasons will have different reward structures and requirements. [​](https://docs.o1.exchange/getting-started/rewards/season-1#maximizing-season-1-rewards) Maximizing Season 1 Rewards ------------------------------------------------------------------------------------------------------------------------- 1 [](https://docs.o1.exchange/getting-started/rewards/season-1#) Trade Early Start trading as close to May 17, 2025 as possible for maximum points 2 [](https://docs.o1.exchange/getting-started/rewards/season-1#) Reach Silver Tier Focus on achieving Level Tier 2 through consistent trading activity 3 [](https://docs.o1.exchange/getting-started/rewards/season-1#) Stay Active Maintain regular trading throughout the season to build your profile 4 [](https://docs.o1.exchange/getting-started/rewards/season-1#) Build Network Use the referral system to compound your rewards beyond the OG bonus [Points System Season 1.2](https://docs.o1.exchange/getting-started/points-system-season2) [Trading Season 2: Base](https://docs.o1.exchange/getting-started/rewards/season-2) ⌘I --- # Zora Trading Contest Season 2 - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2#content-area) [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2#contest-overview) Contest Overview ----------------------------------------------------------------------------------------------------------------------- The second Zora Trading Contest is a competitive campaign with a total reward pool of 1,250,000 $ZORA tokens for traders. ### [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2#campaign-duration) Campaign Duration Contest Period -------------- **January 5, 2026 - January 12, 2026**Contest ends at 12:00 AM PDT (7:00 AM UTC) on January 12, 2026 [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2#rewards-pool) Rewards Pool --------------------------------------------------------------------------------------------------------------- Total Prize Pool ---------------- **1,250,000 $ZORA**Allocated to top 100 winners during the contest week [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2#eligibility-requirements) Eligibility Requirements --------------------------------------------------------------------------------------------------------------------------------------- Only trades executed directly through o1.exchange count toward eligibility. External trades (including after wallet export) are not eligible. [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2#eligible-trading-activity) Eligible Trading Activity ----------------------------------------------------------------------------------------------------------------------------------------- The contest tracks bona fide trades of: * **Zora Creator Coins** * **Zora Content Coins** All trades must be executed via the o1.exchange platform to qualify for leaderboard rankings. [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2#weekly-leaderboards-&-rewards) Weekly Leaderboards & Rewards ------------------------------------------------------------------------------------------------------------------------------------------------- Each week features a volume-based leaderboard with the following reward structure: ### [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2#volume-leaderboard-1250000-$zora-total) Volume Leaderboard (1,250,000 $ZORA total) For users with Base Wizard Badge, we will apply a multiplier of 2X to count your trading volume. Top 100 accounts by aggregate trading volume across all wallets linked to the same o1 account: Reward Distribution Formula | Rank | Reward per Account ($ZORA) | | --- | --- | | 1 | 119,047.50 | | 2 | 106,095.00 | | 3 | 99,665.00 | | 4 | 86,805.00 | | 5 | 80,375.00 | | 6 | 77,160.00 | | 7 | 67,515.00 | | 8 | 61,085.00 | | 9 | 51,440.00 | | 10 | 48,225.00 | | 11–15 | 19,290.00 | | 16–20 | 14,146.00 | | 21–25 | 9,645.00 | | 26–50 | 6,430.00 | | 51–100 | 1,530.50 | [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2#reward-claims) Reward Claims ----------------------------------------------------------------------------------------------------------------- Rewards will be distributed within 7 days of the contest end.Winners must claim rewards within 14 days after the Contest Period ends. Unclaimed rewards are forfeited and revert to Zora’s control. [Zora Trading Contest](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest) [Trading Fees](https://docs.o1.exchange/getting-started/fees) ⌘I --- # Introduction - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/introduction#content-area) o1 Launchpad turns a token concept into a live onchain market. Creators configure the token, choose a quote currency, define any allocations or vesting, and launch with permanently locked Uniswap v4 liquidity. 1 billion fixed supply ---------------------- Current launches create exactly 1 billion tokens with 18 decimals. Opening FDV near USD 4,000 -------------------------- Current launches target an opening fully diluted valuation close to USD 4,000. Permanent liquidity ------------------- The Uniswap v4 market opens at launch, and its liquidity is permanently locked by the launch contracts. Flexible distribution --------------------- Creators can send tokens to selected wallets immediately or place them in fixed vesting schedules. [​](https://docs.o1.exchange/launchpad/introduction#current-production-model) Current production model --------------------------------------------------------------------------------------------------------- | Property | Current value | | --- | --- | | Production chains | Base mainnet (`8453`) and Robinhood Chain (`4663`) | | Token type | Native B20 token on Base; fixed-supply ERC-20 on Robinhood | | Supply | 1,000,000,000 tokens, 18 decimals | | Opening FDV | Close to USD 4,000 at the configured opening price | | Pool | A real Uniswap v4 market between the launch token and its selected quote currency | | Liquidity | Every token left after allocations and vesting, added without a creator quote deposit | | Lock | Permanent and enforced by the launch contracts | | Base swap fee | 1% in the quote currency | | Fee split | 50% creator, 30% platform, 20% referrer of the base fee | | Anti-snipe | Trading stays open while the total fee decreases from 99% to 1% over the first 16 seconds | | Creation fee | 0.001 ETH or 2 USDC on Base; 0.001 ETH or 2 USDG on Robinhood | | Optional at launch | Immediate allocations, staircase vesting, editable profile information, socials, announcements | These settings were verified on **July 13, 2026**. They may change for future launches, so developers should read the current values before building a transaction. See [Live configuration](https://docs.o1.exchange/launchpad/reference/live-configuration) . [​](https://docs.o1.exchange/launchpad/introduction#from-token-setup-to-live-market) From token setup to live market ----------------------------------------------------------------------------------------------------------------------- 1 [](https://docs.o1.exchange/launchpad/introduction#) Design the launch Choose the token identity, quote currency, profile-editing preference, allocations, and vesting. 2 [](https://docs.o1.exchange/launchpad/introduction#) Create the fixed supply The launch contracts create 1 billion tokens and distribute any immediate or vested allocations. 3 [](https://docs.o1.exchange/launchpad/introduction#) Open permanent liquidity The remaining supply is placed into the token’s Uniswap v4 pool, permanently locked, and available for trading immediately. 4 [](https://docs.o1.exchange/launchpad/introduction#) Use launch features Trading fees, referrals, vesting claims, token profile tools, and creator announcements become available through the token and profile pages. The Uniswap v4 pool is the token’s market from launch. Buyers exchange quote currency for tokens from the locked position. As trading continues, quote currency accumulates inside the same position and remains part of its permanent liquidity. [​](https://docs.o1.exchange/launchpad/introduction#choose-a-path) Choose a path ----------------------------------------------------------------------------------- Launch a token -------------- Identity, metadata, quote selection, allocations, vesting, and the wallet transaction. Understand liquidity -------------------- Opening-price assumptions, changing pool inventory, and the permanent liquidity lock. Review fees ----------- Creation fees, the anti-snipe clock, swap fees, referrals, and comments. Plan a launch ------------- Choose allocations, vesting, profile control, announcements, and optional airdrop claim tools. [How it works](https://docs.o1.exchange/launchpad/how-it-works) ⌘I --- # Sign Up for o1.exchange - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/getting-started/signup#content-area) [​](https://docs.o1.exchange/getting-started/signup#create-your-account) Create Your Account ----------------------------------------------------------------------------------------------- ### [​](https://docs.o1.exchange/getting-started/signup#account-creation) Account Creation 1 [](https://docs.o1.exchange/getting-started/signup#) Visit o1.exchange Go to [o1.exchange](https://o1.exchange/) and click the “Enter App” button ![o1.exchange signup page](https://mintcdn.com/o1exchange/4w9GBk7uN54lPNZK/images/o1-signup.png?w=2500&fit=max&auto=format&n=4w9GBk7uN54lPNZK&q=85&s=3cef92f5f84ab3969dc08811d77cb78a) 2 [](https://docs.o1.exchange/getting-started/signup#) Connect Your Wallet There are 3 signup options: 1. Gmail account 2. One time password for any email you choose 3. Wallet logins including Phantom, Backpack, MetaMask, Rabby, Coinbase, and over 120 wallet options. ![o1.exchange wallet login options](https://mintcdn.com/o1exchange/4w9GBk7uN54lPNZK/images/o1-signup-wallets.png?w=2500&fit=max&auto=format&n=4w9GBk7uN54lPNZK&q=85&s=607610929dcf338199c77cd21138080b) 3 [](https://docs.o1.exchange/getting-started/signup#) Complete Profile Set up your trading profile and preferences [​](https://docs.o1.exchange/getting-started/signup#next-steps) Next Steps ----------------------------------------------------------------------------- After creating your account: 1. **Fund Your Wallet**: Ensure you have sufficient balance on supported networks ![Fund your wallet on o1.exchange](https://mintcdn.com/o1exchange/h74U8tuW1ielvxuG/images/o1-fund-deposit.png?w=2500&fit=max&auto=format&n=h74U8tuW1ielvxuG&q=85&s=36719521e3d217d1a71ea694a493eacb) 2. **Explore the Platform**: Familiarize yourself with the trading interface 3. **Join the Community**: Connect with other traders on Discord 4. **Start Trading**: Begin with small positions to get comfortable with the platform Ready to Trade? --------------- [Start Trading Now](https://o1.exchange/) - Create your account and join thousands of traders on o1.exchange [Alliance DAO](https://docs.o1.exchange/AllianceDAO) [Referral System](https://docs.o1.exchange/getting-started/referral-system) ⌘I --- # Zora Trading Contest - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest#content-area) [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest#contest-overview) Contest Overview --------------------------------------------------------------------------------------------------------------- The first Zora Trading Contest is an eight-week competitive campaign with a total reward pool of 2,500,000 $ZORA tokens. ### [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest#campaign-duration) Campaign Duration Contest Period -------------- **November 3, 2025 - December 27, 2025**8 consecutive weekly periods, resetting every Monday at 00:00 SGT [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest#rewards-pool) Rewards Pool ------------------------------------------------------------------------------------------------------- Total Prize Pool ---------------- **2,500,000 $ZORA**Allocated as 312,500 $ZORA per weekly window across 8 weeks [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest#eligibility-requirements) Eligibility Requirements ------------------------------------------------------------------------------------------------------------------------------- Only trades executed directly through o1.exchange count toward eligibility. External trades (including after wallet export) are not eligible. [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest#eligible-trading-activity) Eligible Trading Activity --------------------------------------------------------------------------------------------------------------------------------- The contest tracks bona fide trades of: * **Zora Creator Coins** * **Zora Content Coins** All trades must be executed via the o1.exchange platform to qualify for leaderboard rankings. [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest#weekly-leaderboards-&-rewards) Weekly Leaderboards & Rewards ----------------------------------------------------------------------------------------------------------------------------------------- Each week features a volume-based leaderboard with the following reward structure: ### [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest#volume-leaderboard-312500-$zora-per-week) Volume Leaderboard (312,500 $ZORA per week) For users with Base Wizard Badge, we will apply a multiplier of 2X to count your trading volume. Top 100 accounts by aggregate trading volume across all wallets linked to the same o1 account: Reward Distribution Formula | Rank | Reward per Account ($ZORA) | | --- | --- | | 1 | 29,738.75 | | 2 | 26,523.75 | | 3 | 24,916.25 | | 4 | 21,701.25 | | 5 | 20,093.75 | | 6 | 19,290.00 | | 7 | 16,878.75 | | 8 | 15,271.25 | | 9 | 12,860.00 | | 10 | 12,056.25 | | 11–15 | 4,822.50 | | 16–20 | 3,536.50 | | 21–25 | 2,411.25 | | 26–50 | 1,607.50 | | 51–100 | 382.625 | [​](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest#reward-claims) Reward Claims --------------------------------------------------------------------------------------------------------- Rewards will be distributed within 7 days of the weekly volume window.Winners must claim rewards within 14 days after each Weekly Campaign Period ends. Unclaimed rewards are forfeited and revert to Zora’s control. [Trading Season 2: Base](https://docs.o1.exchange/getting-started/rewards/season-2) [Zora Trading Contest Season 2](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2) ⌘I --- # Interface and data flow - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#content-area) The o1 Launchpad interface combines wallet-signed actions, live contract reads, Uniswap v4 market data, public token profiles, and confirmed chain events. The blockchain remains authoritative for tokens, pools, balances, vesting, fees, and ownership. [​](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#main-pages) Main pages ---------------------------------------------------------------------------------------------- | Page | What users can do | | --- | --- | | Home | Discover launches, view **Trending now**, sort the feed by market cap, trending, newest, or 24-hour volume, and filter by quote currency | | Create | Configure token identity, quote currency, optional allocations and vesting, preview the result, and sign the launch transaction | | Token | Review the token and creator, view the chart and market statistics, trade, inspect holders and vesting schedules, read announcements, add comments, and copy a token referral link | | Profile | View a creator’s launches and public identity; connected owners can edit their o1 profile, claim fees and vested tokens, review referrals, and manage supported token profile or announcement features | **Trending now** is a discovery view based on indexed market activity. Ranked views also require adequate pool coverage and current market data, and placement is dynamic. They are not recommendations or guarantees of future performance. Global search accepts a token name, symbol, creator address, or token address and provides trending, new, recent, and quote-filtered views. A creator’s signed o1 profile, including its display name, bio, avatar, and socials, is separate from the optional onchain token profile permission chosen for each launch. [​](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#token-creation-flow) Token creation flow ---------------------------------------------------------------------------------------------------------------- 1 [](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#) Configure and preview The creator enters the token identity, socials, quote currency, optional distributions, vesting, and profile-editing preference. The page previews the fixed supply, opening value, creation fee, and permanent pool. 2 [](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#) Review the launch The o1 confirmation screen shows the quote, supply, creation fee, allocation and vesting totals, projected pool share, profile permission, and the predicted Base address when applicable. 3 [](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#) Prepare and sign After the creator confirms the review, the interface stores the public token profile on IPFS, refreshes the selected quote, launch settings, and chain time, and requests a stablecoin fee approval when needed. The creator then confirms the launch transaction in their wallet. 4 [](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#) Open the token page After confirmation, the token page presents the new token, live Uniswap market, allocation disclosures, vesting status, trades, holders, and public announcements. The wallet is the only signing surface. o1’s interface and data services never hold the user’s private key. [​](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#trading-flow) Trading flow -------------------------------------------------------------------------------------------------- The token page asks Uniswap v4 for a quote based on how much the trader wants to spend or sell. The interface applies the selected slippage limit and a 10-minute deadline, then asks the wallet to submit the swap through Uniswap’s Universal Router. * Paying with ETH * Paying with a token The wallet includes ETH in the swap transaction. No token approval is needed for the ETH input. When needed, the wallet first approves Uniswap’s Permit2 contract and signs a time-limited Universal Router authorization. The submitted swap still uses only the amount shown for that trade. The same flow carries an optional referral and public trade comment. o1 always submits input-amount swaps, so its normal buy and sell flow remains available during the opening anti-snipe period. ### [​](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#trade-safeguards) Trade safeguards | Setting | Current interface behavior | | --- | --- | | Automatic slippage | 1% | | Quick choices | 0.5%, 2%, or 3% | | High-slippage handling | Warns at 5% or higher and prevents submission at 50% | | Price impact | Warns at 25% or higher | | Swap deadline | 10 minutes from submission | [​](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#referral-journey) Referral journey ---------------------------------------------------------------------------------------------------------- * A profile’s **Referral** action copies a global referral link. * A token page’s **Referral link** action copies a link for that token and chain. * A public **Profile** link is separate and does not set attribution by itself. * Token-specific attribution takes priority for that token. A previously saved global attribution is the fallback. * The interface may request one gasless signature to associate a browser-saved global referral with a connected wallet. See [Fees, anti-snipe, and referrals](https://docs.o1.exchange/launchpad/trading/fees-referrals) for the full precedence and validation rules. [​](https://docs.o1.exchange/launchpad/architecture/frontend-indexer#live-and-indexed-information) Live and indexed information ---------------------------------------------------------------------------------------------------------------------------------- | Source | Used for | | --- | --- | | Launch contracts | Current launch settings, fee balances, vesting state, and creator permissions | | Uniswap v4 | Pool price, swap quotes, liquidity state, and transaction simulation | | Confirmed chain events | Launches, trades, claims, distributions, announcements, and profile updates | | IPFS | Public token image and profile document | | Indexed application data | Search, feeds, charts, holder views, histories, and wallet dashboards | After a transaction confirms, a page may briefly show that it is syncing while the indexed view updates. Live contract state and confirmed chain events remain the source of truth. [Smart contract architecture](https://docs.o1.exchange/launchpad/architecture/contracts) [Configuration and governance](https://docs.o1.exchange/launchpad/architecture/deployment-governance) ⌘I --- # Limits and validation - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/reference/limits#content-area) The interface checks launch inputs before the wallet asks for a signature. The contracts enforce the hard caps again onchain. [​](https://docs.o1.exchange/launchpad/reference/limits#current-defaults) Current defaults --------------------------------------------------------------------------------------------- | Setting | Current value | | --- | --- | | Supply | 1 billion (1,000,000,000) tokens | | Liquidity ranges | 1 | | Base swap fee | 1% | | Starting total fee | 99% | | Anti-snipe period | 16 seconds | | Base-fee split | 50% creator / 30% platform / 20% referrer | [​](https://docs.o1.exchange/launchpad/reference/limits#contract-hard-caps) Contract hard caps ------------------------------------------------------------------------------------------------- | Constraint | Hard limit | | --- | --- | | Token supply | 1 million to 1 trillion tokens | | Immediate plus vested recipients | 128 total | | Vested beneficiaries | 64 | | Vesting steps per beneficiary | 24 | | Vesting steps across one launch | 128 | | First vesting unlock | At least 1 day after launch | | Liquidity ranges | 1 to 10 | | Base swap fee | At most 10% | | Starting total fee | At most 99% | | Profile authority choice | Fixed profile or editable profile | The supply caps assume the launch token’s standard 18 decimals. [​](https://docs.o1.exchange/launchpad/reference/limits#token-fields) Token fields ------------------------------------------------------------------------------------- | Field | Interface limit | | --- | --- | | Name | 50 characters | | Symbol | 11 characters with no spaces | | Image | 2 MB; PNG, JPG, WEBP, or GIF | | Website | Valid website URL | | X | Valid X profile URL | | Telegram | Valid Telegram link | | Extra information | Non-empty keys with public values | | Trade comment | 32 UTF-8 bytes | [​](https://docs.o1.exchange/launchpad/reference/limits#creator-profile-fields) Creator profile fields --------------------------------------------------------------------------------------------------------- | Field | Interface limit | | --- | --- | | Display name | 40 characters | | Bio | 180 characters | | Avatar | 2 MB; PNG, JPG, WEBP, or GIF | | Website | Valid website URL | | X | Valid X profile URL | | Telegram | Valid Telegram link | Creator-profile changes use a wallet signature and affect the public o1 profile only. They do not change token permissions, balances, or liquidity. [​](https://docs.o1.exchange/launchpad/reference/limits#allocation-and-vesting-rules) Allocation and vesting rules --------------------------------------------------------------------------------------------------------------------- * every amount must be greater than zero; * a recipient can appear only once across immediate and vested allocations; * allocations must leave at least some supply for the market; * vesting dates must strictly increase; * each step must release a positive percentage; * all step percentages must add up to exactly 100%; * the first unlock must be at least one day after launch; * each step must release an additional token amount after rounding; * locked tokens always pay the beneficiary recorded at launch. [​](https://docs.o1.exchange/launchpad/reference/limits#fee-and-referral-rules) Fee and referral rules --------------------------------------------------------------------------------------------------------- * creator, platform, and referrer shares must add up to 100% of the base fee; * the starting total fee cannot be lower than the normal base fee; * the anti-snipe period must be longer than zero; * the platform fee receiver must be a valid address; * the trader, creator, platform fee receiver, empty address, and swap router or execution contract cannot receive referral credit for that trade; * the unused referral share goes to the platform. [​](https://docs.o1.exchange/launchpad/reference/limits#quote-requirements) Quote requirements ------------------------------------------------------------------------------------------------- Only quote currencies registered by o1 governance can be selected. Quote tokens must behave like standard ERC-20 tokens. Transfer-tax, rebasing, and other non-standard balance behavior is not supported because it can break pool and fee accounting. [​](https://docs.o1.exchange/launchpad/reference/limits#transaction-checks) Transaction checks ------------------------------------------------------------------------------------------------- A launch stops when the selected quote is unavailable, the payment is wrong, the transaction has expired, current settings differ from the values the creator reviewed, recipients or vesting are invalid, or the pool cannot open with token-only liquidity. Developers who need the exact encoded caps and field names can use [Functions and events](https://docs.o1.exchange/launchpad/reference/events-functions) and the [machine-readable production snapshot](https://docs.o1.exchange/launchpad/reference/production-deployments.json) . [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts) [Functions and events](https://docs.o1.exchange/launchpad/reference/events-functions) ⌘I --- # Plan your launch - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/launch-planning#content-area) o1 Launchpad provides the core pieces needed to create a token and open its permanent onchain market. Supply distribution, vesting, and the profile-editing choice are committed at launch, so creators and communities can understand the setup before trading begins. [​](https://docs.o1.exchange/launchpad/launch-planning#built-in-launch-options) Built-in launch options ---------------------------------------------------------------------------------------------------------- | Option | How it works | Best for | | --- | --- | --- | | Quote currency | Choose ETH or the supported stablecoin for the selected chain | Defining the market pair and creation-fee currency | | Immediate allocations | Send tokens directly to unique recipients at launch | Treasury, community, contributor, or partner allocations | | Staircase vesting | Lock allocations with dated milestones that no administrator can change | Team and contributor distributions | | Profile editing | Optionally let the creator wallet update the token name, symbol, profile link, and extra information | Projects that expect their public profile to evolve | | Fixed profile | Launch without profile editing permission | Projects that want token information fixed from launch | | Social links | Publish website, X, Telegram, description, image, and extra metadata | Token discovery and profile context | | Creator announcements | Post updates through the separate announcement contract | Public milestones and launch communications | | Referral attribution | Attach a valid referrer to a trade | Community and partner growth programs | [​](https://docs.o1.exchange/launchpad/launch-planning#a-practical-launch-flow) A practical launch flow ---------------------------------------------------------------------------------------------------------- 1 [](https://docs.o1.exchange/launchpad/launch-planning#) Choose the market Select the chain and quote currency. The quote determines the market pair, opening-price configuration, creation fee, and currency used for swap-fee claims. 2 [](https://docs.o1.exchange/launchpad/launch-planning#) Design the distribution Decide how much supply enters the pool and whether any recipients receive immediate or vested allocations. All allocations are deducted from the fixed 1 billion token supply. o1 recommends leaving at least 25% in permanent liquidity. 3 [](https://docs.o1.exchange/launchpad/launch-planning#) Choose profile control Keep profile information fixed or allow the creator wallet to edit it. This choice never allows new tokens to be created, transfers to be paused, the token to be upgraded, or liquidity to be removed. 4 [](https://docs.o1.exchange/launchpad/launch-planning#) Review the economics Confirm the opening-price assumption, approximate FDV, creation fee, base swap fee, fee recipients, and 16-second anti-snipe schedule shown by the application. 5 [](https://docs.o1.exchange/launchpad/launch-planning#) Launch and communicate Sign from the creator wallet, wait for confirmation, then use the token page and announcement registry to share updates with the community. [​](https://docs.o1.exchange/launchpad/launch-planning#distribution-examples) Distribution examples ------------------------------------------------------------------------------------------------------ * Community launch * Team and treasury * Creator-led launch Place most or all of the supply into permanent liquidity. Add a small set of immediate community or partner allocations only when needed. Send a treasury allocation directly to its destination and place contributor allocations into staircase vesting. Recipients and schedules are public from launch. Keep the pool as the primary distribution path, enable creator announcements, and use referrals to attribute community-driven trading activity. [​](https://docs.o1.exchange/launchpad/launch-planning#optional-airdrop-claim-tool) Optional airdrop claim tool ------------------------------------------------------------------------------------------------------------------ A team can fund a compatible Merkle claim contract through an immediate allocation, then publish its eligibility list and claim instructions. Review the claim contract, eligibility process, expiry, and unclaimed-token rules before launch. These rules control the airdrop only; the launch market remains open to everyone. [​](https://docs.o1.exchange/launchpad/launch-planning#before-you-launch) Before you launch ---------------------------------------------------------------------------------------------- * review every allocation recipient and amount; * review the projected pool share and any low-coverage warning; * confirm that each vesting schedule ends at 100%; * enable profile editing only when ongoing updates are needed; * check the selected quote, opening-price assumption, approximate FDV, creation fee, and fee split; * confirm the creator and referral addresses; * open the final transaction details in the wallet before signing; * publish the token address, pool, allocations, and vesting terms after confirmation. [How it works](https://docs.o1.exchange/launchpad/how-it-works) [Token creation](https://docs.o1.exchange/launchpad/create/token-creation) ⌘I --- # Live configuration - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/reference/live-configuration#content-area) These are the current onchain settings for new launches, checked on **July 13, 2026**. [​](https://docs.o1.exchange/launchpad/reference/live-configuration#current-launch-settings) Current launch settings ----------------------------------------------------------------------------------------------------------------------- Both production chains currently use the same core settings: | Setting | Current value | | --- | --- | | Token supply | 1 billion (1,000,000,000) tokens with 18 decimals | | Opening value | FDV close to USD 4,000 under the quote assumptions below | | Liquidity | One permanent token-side range using all supply left after allocations | | Base swap fee | 1% of the quote amount | | Base-fee distribution | 50% creator, 30% platform, 20% valid referrer | | Anti-snipe fee | Starts at 99% total and decays to 1% over 16 seconds | | Fee currency | The pool’s selected quote currency | Creation fees and the platform share of swap fees go to `0x1cAa...1C90`. The full address is listed in [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts#governance-and-fee-recipient) . [​](https://docs.o1.exchange/launchpad/reference/live-configuration#quotes-and-creation-fees) Quotes and creation fees ------------------------------------------------------------------------------------------------------------------------- | Chain | Quote | Creation fee | Opening assumption | | --- | --- | --- | --- | | Base | ETH | 0.001 ETH | ETH at USD 1,800 | | Base | USDC | 2 USDC | USDC at USD 1 | | Robinhood | ETH | 0.001 ETH | ETH at USD 1,800 | | Robinhood | USDG | 2 USDG | USDG at USD 1 | Under these assumptions, each quote is configured to open at an FDV close to USD 4,000. The actual USD value of an ETH-quoted launch changes with the live ETH price. [​](https://docs.o1.exchange/launchpad/reference/live-configuration#opening-value) Opening value --------------------------------------------------------------------------------------------------- FDV means token price multiplied by the complete fixed supply: opening FDV = opening token price x 1,000,000,000 It is a valuation reference. It is not money raised, quote currency deposited by the creator, or a guaranteed future price. [​](https://docs.o1.exchange/launchpad/reference/live-configuration#liquidity-range) Liquidity range ------------------------------------------------------------------------------------------------------- The current configuration places all pool supply into one token-side liquidity range beginning at the opening price. **Pool supply** means the fixed token supply minus any immediate and vested allocations. The range boundaries use Uniswap’s spacing value of `200`, which is about 2.02% between places where a range boundary may be set. This does not make trades or prices move in 2.02% jumps; trading moves continuously through the active liquidity. [​](https://docs.o1.exchange/launchpad/reference/live-configuration#values-that-can-change) Values that can change --------------------------------------------------------------------------------------------------------------------- Governance may update supply, supported quotes, opening settings, creation fees, liquidity settings, swap fees, the platform fee receiver, and announcement support for future launches. Integrations should read these values from the current factory before preparing a transaction. Once a pool opens, its token supply, creator, quote, opening range, fee settings, anti-snipe timing, allocations, vesting, and permanent liquidity are fixed for that launch. Use [`production-deployments.json`](https://docs.o1.exchange/launchpad/reference/production-deployments.json) for exact machine-readable values and [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts) for explorer-linked addresses. [Data and AI access](https://docs.o1.exchange/launchpad/integration/data-ai) [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts) ⌘I --- # Configuration and governance - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/architecture/deployment-governance#content-area) o1 Launchpad uses one current production contract set for new tokens on each supported chain. Base creates native B20 tokens, while Robinhood creates fixed-supply ERC-20 tokens. Both use the same launch model, fee system, vesting rules, announcements, and permanent Uniswap v4 liquidity. [​](https://docs.o1.exchange/launchpad/architecture/deployment-governance#who-controls-what) Who controls what ----------------------------------------------------------------------------------------------------------------- | Area | Current authority | Boundary | | --- | --- | --- | | Future launch settings | Launchpad governance owner | Changes apply only to launches created afterward | | Creation and platform swap fees | Platform fee receiver | Receives fees but cannot control tokens or pools | | Token profile editing | Creator, only when enabled at launch | Limited to supported profile information | | Announcements | Recorded launch creator | Can publish updates but receives no token or liquidity control | | Vested allocations | Vesting contract | Releases tokens only to the beneficiary on the original schedule | | Permanent liquidity | Launch hook | Cannot be removed, transferred, or redirected | The current governance owner and platform fee receiver are listed in [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts#governance-and-fee-recipient) . [​](https://docs.o1.exchange/launchpad/architecture/deployment-governance#settings-for-future-launches) Settings for future launches --------------------------------------------------------------------------------------------------------------------------------------- Governance can update these defaults: * supported quote currencies and their creation fees; * the opening price used for each quote; * fixed token supply within the contract caps; * liquidity range settings; * the base fee, anti-snipe fee, recipient split, and platform fee receiver; * announcement support. The interface refreshes the current settings before a creator signs. If the settings change while a prepared transaction is pending, the transaction stops instead of silently using different economics. [​](https://docs.o1.exchange/launchpad/architecture/deployment-governance#what-becomes-permanent) What becomes permanent --------------------------------------------------------------------------------------------------------------------------- When a launch succeeds, the following properties are fixed for that launch: * token address and total supply; * creator and selected quote currency; * opening pool and liquidity range; * creator, platform, and referral fee settings; * anti-snipe start time and duration; * immediate allocations and vesting schedules; * permanent liquidity position. Future governance changes cannot mint more tokens, modify an existing vesting schedule, change an existing pool’s fee recipients, or remove its liquidity. [​](https://docs.o1.exchange/launchpad/architecture/deployment-governance#token-authority) Token authority ------------------------------------------------------------------------------------------------------------- Tokens launch without an owner who can mint, pause, upgrade, or take balances. Creators can optionally keep a limited permission to edit token profile information. Announcements are handled separately and do not grant control over token transfers or liquidity. [​](https://docs.o1.exchange/launchpad/architecture/deployment-governance#current-configuration) Current configuration ------------------------------------------------------------------------------------------------------------------------- The human-readable values are listed in [Live configuration](https://docs.o1.exchange/launchpad/reference/live-configuration) . Developers can use the [machine-readable production snapshot](https://docs.o1.exchange/launchpad/reference/production-deployments.json) and should refresh changeable values from the active factory before preparing a transaction. [Interface and data flow](https://docs.o1.exchange/launchpad/architecture/frontend-indexer) [Direct contract integration](https://docs.o1.exchange/launchpad/integration/direct) ⌘I --- # Direct contract integration - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/integration/direct#content-area) This page intentionally uses exact contract fields for developers. For a plain-language product flow, start with [How it works](https://docs.o1.exchange/launchpad/how-it-works) . Direct integrations should discover the active chain, read current factory state, build an unsigned transaction, and let the user’s wallet sign it. Never hardcode a mutable configuration version or creation fee. [​](https://docs.o1.exchange/launchpad/integration/direct#integration-sequence) Integration sequence ------------------------------------------------------------------------------------------------------- 1 [](https://docs.o1.exchange/launchpad/integration/direct#) Select the active factory Use only the current Base or Robinhood factory from [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts) . 2 [](https://docs.o1.exchange/launchpad/integration/direct#) Read launch configuration Read `configVersion`, `launchSupply`, `tickSpacing`, `feeDefaults`, `bands`, and `quotes(selectedQuote)` at one recent block. 3 [](https://docs.o1.exchange/launchpad/integration/direct#) Validate parameters Apply the hard limits in [Limits and validation](https://docs.o1.exchange/launchpad/reference/limits) , confirm the quote remains registered, and calculate the pool supply after allocations. 4 [](https://docs.o1.exchange/launchpad/integration/direct#) Build payment For native quote, set transaction value to the exact creation fee. For ERC-20 quote, ensure the factory allowance covers the exact creation fee. 5 [](https://docs.o1.exchange/launchpad/integration/direct#) Commit to the configuration Set `expectedConfigVersion` to the fresh read and choose a short chain-time deadline. The o1 Launchpad interface uses the latest block timestamp plus 30 minutes. 6 [](https://docs.o1.exchange/launchpad/integration/direct#) Simulate, sign, and confirm Simulate `createLaunch`, present all recipients and economics to the user, then request a wallet signature and wait for a successful receipt. 7 [](https://docs.o1.exchange/launchpad/integration/direct#) Parse canonical events Read `Launched` for token and pool ID, then index the other factory, hook, PoolManager, escrow, vesting, and announcement events from the same transaction. [​](https://docs.o1.exchange/launchpad/integration/direct#read-the-current-snapshot-with-viem) Read the current snapshot with viem ------------------------------------------------------------------------------------------------------------------------------------- The example below reads Base. For Robinhood, use a Robinhood Chain client and the current Robinhood factory and quote addresses from [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts) . import { createPublicClient, http, parseAbi, zeroAddress } from "viem"; import { base } from "viem/chains"; const FACTORY = "0xa52ad458cE0282a971ecC71C051A32f28946bb9F"; const factoryReads = parseAbi([\ "function configVersion() view returns (uint64)",\ "function launchSupply() view returns (uint256)",\ "function tickSpacing() view returns (int24)",\ "function quotes(address) view returns (bool registered,uint8 decimals,int24 startTickToken0Frame,uint256 creationFee)",\ "function feeDefaults() view returns (uint16 baseFeeBps,uint16 creatorBps,uint16 platformBps,uint16 referrerBps,uint16 antiSnipeStartTotalBps,uint32 antiSnipeWindowSeconds,address platformTreasury)",\ ]); const client = createPublicClient({ chain: base, transport: http() }); const [version, supply, spacing, nativeQuote, fees] = await Promise.all([\ client.readContract({ address: FACTORY, abi: factoryReads, functionName: "configVersion" }),\ client.readContract({ address: FACTORY, abi: factoryReads, functionName: "launchSupply" }),\ client.readContract({ address: FACTORY, abi: factoryReads, functionName: "tickSpacing" }),\ client.readContract({ address: FACTORY, abi: factoryReads, functionName: "quotes", args: [zeroAddress] }),\ client.readContract({ address: FACTORY, abi: factoryReads, functionName: "feeDefaults" }),\ ]); For a transaction integration, obtain the complete verified factory ABI from the chain explorer. `LaunchParams` contains nested vesting arrays, so a partial handwritten write ABI is easy to get wrong. `startTickToken0Frame` is the factory’s internal opening-price encoding for a registered quote. The factory handles token ordering and tick spacing when it creates the pool; a launch transaction selects the quote and does not submit a starting tick. [​](https://docs.o1.exchange/launchpad/integration/direct#launchparams) `LaunchParams` ----------------------------------------------------------------------------------------- | Field | Meaning | | --- | --- | | `name`, `symbol` | Token identity | | `contractURI` | Pinned token metadata URI | | `salt` | User salt, scoped by factory to the caller | | `quote` | Registered quote address; zero address means native ETH | | `allocationRecipients`, `allocationAmounts` | Parallel immediate allocation arrays | | `vestedAllocations` | Beneficiary, amount, and cumulative staircase steps | | `expectedConfigVersion` | Exact fresh factory version | | `deadline` | Latest allowed chain timestamp | | `roleMode` | `0` for immutable metadata, `1` for metadata authority | | `metadataKeys`, `metadataValues` | Parallel on-chain metadata arrays | [​](https://docs.o1.exchange/launchpad/integration/direct#trading-integration) Trading integration ----------------------------------------------------------------------------------------------------- Launch pools are ordinary Uniswap v4 pools with a required hook. Use the listed v4 Quoter for price discovery and the Universal Router plus Permit2 for execution. Preserve the exact pool key: sorted currencies, LP fee `0`, launch tick spacing, and the active hook address. `tickSpacing` is part of the exact Uniswap pool identifier and controls valid liquidity range boundaries. The current value `200` represents about 2.02% between allowed boundaries; it does not make swap prices move in fixed 2.02% increments. Use exact-input during the anti-snipe window. Encode optional hook data as the referrer address followed by a `bytes32` comment. Simulate at current timestamp and include slippage and deadline protection. [​](https://docs.o1.exchange/launchpad/integration/direct#failure-handling) Failure handling ----------------------------------------------------------------------------------------------- Treat `StaleConfig` and `LaunchExpired` as refresh-and-rebuild errors. Treat quote removal, fee mismatch, allocation validation, salt reuse, immutability, and single-sided failures as blocking errors that require changed inputs or configuration. Do not silently fall back to another factory or quote. [Configuration and governance](https://docs.o1.exchange/launchpad/architecture/deployment-governance) [Data and AI access](https://docs.o1.exchange/launchpad/integration/data-ai) ⌘I --- # How it works - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/how-it-works#content-area) Creators use the o1 interface to configure a token and approve the launch transaction in their wallet. A stablecoin creation fee may require a token approval first. The launch contracts then create the token and its Uniswap market together. The blockchain is the source of truth, while o1 organizes confirmed public data so launches, trades, fees, and vesting are easy to view. [​](https://docs.o1.exchange/launchpad/how-it-works#end-to-end-lifecycle) End-to-end lifecycle ------------------------------------------------------------------------------------------------- 1 [](https://docs.o1.exchange/launchpad/how-it-works#) Configure the launch The creator supplies a name, symbol, image, quote currency, optional links and description, immediate allocations, vesting schedules, and a profile-editing preference. 2 [](https://docs.o1.exchange/launchpad/how-it-works#) Review the launch The o1 confirmation screen presents the quote, fixed supply, creation fee, allocation and vesting totals, projected pool share, profile permission, and the predicted Base address when applicable. 3 [](https://docs.o1.exchange/launchpad/how-it-works#) Prepare current settings After the creator confirms the review, the app stores the token image and public profile on IPFS, includes that metadata link in the launch request, and refreshes the selected quote, creation fee, supply, liquidity settings, and current chain time. 4 [](https://docs.o1.exchange/launchpad/how-it-works#) Pay the creation fee For an ETH launch, the wallet includes the creation fee in the launch transaction. A stablecoin launch may first ask for token approval. The creation fee goes directly to the platform fee receiver. 5 [](https://docs.o1.exchange/launchpad/how-it-works#) Create the token On Base, the protocol creates a native B20 token with no administrator. On Robinhood, o1 creates a fixed-supply ERC-20 with no owner or additional minting function. The fixed 1 billion supply is created once and divided between permanent pool liquidity, immediate recipient wallets, and any vesting schedules. 6 [](https://docs.o1.exchange/launchpad/how-it-works#) Open permanent liquidity The launch contracts open the Uniswap v4 pool at the configured starting price. The part of the supply not allocated to recipients or vesting is placed into permanent liquidity. 7 [](https://docs.o1.exchange/launchpad/how-it-works#) Open the launch page After confirmation, the launch page shows the token profile, live market, trading interface, allocation disclosures, vesting status, trades, holders, and announcements. [​](https://docs.o1.exchange/launchpad/how-it-works#where-each-asset-lives) Where each asset lives ----------------------------------------------------------------------------------------------------- | Asset | Location | Who can move it | | --- | --- | --- | | Tradable token supply | The permanent Uniswap liquidity position | The launch contracts prevent its removal | | Immediate allocations | Recipient wallets | Each recipient | | Vested allocations | The vesting contract | Claims always go to the beneficiary chosen at launch | | Creation fee | Platform fee receiver wallet | That wallet | | Accrued swap fees | A dedicated claimable balance for each recipient | Creator, platform, or valid referrer according to the fee split | | User trade funds | The user’s wallet and the Uniswap pool during the trade | The transaction approved by the user | [​](https://docs.o1.exchange/launchpad/how-it-works#swap-lifecycle) Swap lifecycle ------------------------------------------------------------------------------------- 1 [](https://docs.o1.exchange/launchpad/how-it-works#) Review the trade The interface shows the input amount, estimated output, minimum received, price impact, current fee, slippage limit, and estimated network fee. It automatically applies a 10-minute transaction deadline. 2 [](https://docs.o1.exchange/launchpad/how-it-works#) Sign with the wallet The wallet submits a trade for the amount the user chose to spend or sell. 3 [](https://docs.o1.exchange/launchpad/how-it-works#) Apply pool and fee logic Uniswap calculates the result, and the launch contract applies the swap fee in the pool’s quote currency. 4 [](https://docs.o1.exchange/launchpad/how-it-works#) Settle the swap The user receives the purchased or sold asset. Creator, platform, and valid referrer fee balances become claimable independently. Trading begins immediately. o1 uses input-amount swaps for both buys and sells: the trader chooses how much to spend or sell, and the interface protects the minimum amount received with a slippage limit. These swaps remain available while the anti-snipe fee decreases during the first 16 seconds. [​](https://docs.o1.exchange/launchpad/how-it-works#chain-specific-token-creation) Chain-specific token creation ------------------------------------------------------------------------------------------------------------------- * Base mainnet * Robinhood Chain The protocol creates a native B20 token with a fixed supply and no administrator. If the creator opts in, they may retain permission to update profile information only. o1 creates a standard ERC-20 with a fixed supply. It has no owner and no function to mint more tokens, pause transfers, upgrade the contract, or recover tokens. [​](https://docs.o1.exchange/launchpad/how-it-works#profile-information-comments-and-announcements) Profile information, comments, and announcements ------------------------------------------------------------------------------------------------------------------------------------------------------- | Feature | How it appears | | --- | --- | | Token profile | The image, description, website, X, Telegram, and other public fields are loaded from the IPFS metadata referenced by the token | | Profile updates | When profile editing is enabled, the creator wallet can update the supported token identity and public information | | Trade comments | A trader may attach a short comment of up to 32 UTF-8 bytes; it becomes public onchain data | | Creator announcements | The creator recorded at launch can publish updates through the separate announcement contract | Comments and announcements are public onchain records. Announcements use a separate contract, so the creator does not gain permission to create tokens, control transfers, or remove liquidity. [​](https://docs.o1.exchange/launchpad/how-it-works#what-can-change-later) What can change later --------------------------------------------------------------------------------------------------- o1 governance can update supported quote currencies, opening prices, creation fees, supply, liquidity settings, swap fees, and the announcement contract for **future** launches. Each completed launch keeps its token, creator, fee settings, opening price, liquidity range, and permanent position. Later configuration changes apply only to new launches. [Introduction](https://docs.o1.exchange/launchpad/introduction) [Plan your launch](https://docs.o1.exchange/launchpad/launch-planning) ⌘I --- # Functions and events - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/reference/events-functions#content-area) This developer reference summarizes the public contract surface. Use the verified explorer ABI for exact transaction encoding. [​](https://docs.o1.exchange/launchpad/reference/events-functions#launch-factories) Launch factories ------------------------------------------------------------------------------------------------------- Base uses `B20LaunchpadFactory`; Robinhood uses `ERC20LaunchpadFactory`. Both expose the same launch flow. | Surface | Important members | | --- | --- | | Create | `createLaunch(LaunchParams)` creates the token, distributes allocations, registers vesting, opens the pool, and seeds permanent liquidity | | Configuration reads | `quotes`, `feeDefaults`, `launchSupply`, `tickSpacing`, `bands`, `announcementRegistry`, and `vestingVault` | | Transaction-safety reads | `configVersion` and `usedLaunchSalts` | | Contract limits | `MIN_SUPPLY`, `MAX_SUPPLY`, `MAX_ALLOCATIONS`, `MAX_VESTED_ALLOCATIONS`, `MIN_VESTING_DURATION`, `MAX_VEST_STEPS`, and `MAX_TOTAL_VEST_STEPS` | | Future-launch governance | Quote, opening setting, creation fee, supply, liquidity, fee, treasury, announcement, and ownership updates | ### [​](https://docs.o1.exchange/launchpad/reference/events-functions#launch-events) Launch events | Event | Meaning | | --- | --- | | `Launched` | Token, pool ID, creator, quote, supply, and liquidity spacing | | `LaunchFeePaid` | Creation-fee payer, quote, fee receiver, and amount | | `QuoteRegistered` / `QuoteUnregistered` | Supported quote changes | | `QuoteCreationFeeUpdated` | Creation-fee change for a quote | | `BandTemplateUpdated` | Future liquidity-range change | | `FeeDefaultsUpdated` | Future fee split, anti-snipe, or treasury change | | `LaunchSupplyUpdated` / `TickSpacingUpdated` | Future supply or range-alignment change | | `OwnershipTransferStarted` / `OwnershipTransferred` | Governance ownership change | [​](https://docs.o1.exchange/launchpad/reference/events-functions#launchhook) LaunchHook ------------------------------------------------------------------------------------------- The hook exposes `poolConfig` for each launch pool. The factory registers and seeds a pool; ordinary trading then occurs through Uniswap v4. | Event | Meaning | | --- | --- | | `PoolRegistered` | The pool’s frozen creator, platform fee receiver, and fee settings | | `Seeded` | Token amount placed into the permanent position | | `Trade` | Executor, referrer, fee currency, fee amount, and optional comment; swap direction comes from the matching Uniswap event | [​](https://docs.o1.exchange/launchpad/reference/events-functions#feeescrow) FeeEscrow ----------------------------------------------------------------------------------------- | Function | Who can call | Result | | --- | --- | --- | | `owed(recipient, currency)` | Anyone | Returns the raw claimable fee balance | | `claim(recipient, currency)` | Anyone | Pays the full balance to the recorded recipient | | `claimTo(currency, to)` | Balance owner | Pays the caller’s balance to a chosen address | Events: `Credited` and `Claimed`. [​](https://docs.o1.exchange/launchpad/reference/events-functions#vestingvault) VestingVault ----------------------------------------------------------------------------------------------- | Function | Who can call | Result | | --- | --- | --- | | `claimable(token, beneficiary)` | Anyone | Returns tokens currently available to claim | | `getSchedule(token, beneficiary)` | Anyone | Returns the allocation, claimed amount, and unlock steps | | `claim(token, beneficiary)` | Anyone | Sends available tokens to the recorded beneficiary | Events: `Registered` and `Claimed`. [​](https://docs.o1.exchange/launchpad/reference/events-functions#announcementregistry) AnnouncementRegistry --------------------------------------------------------------------------------------------------------------- | Function | Who can call | Result | | --- | --- | --- | | `creatorOf(token)` | Anyone | Returns the creator allowed to announce for the token | | `usedId(token, id)` | Anyone | Checks whether an announcement ID was used | | `post(token, id, description, uri)` | Recorded creator | Publishes a unique announcement | Events: `CreatorRegistered` and `Announcement`. [​](https://docs.o1.exchange/launchpad/reference/events-functions#robinhood-launch-tokens) Robinhood launch tokens --------------------------------------------------------------------------------------------------------------------- Robinhood tokens expose standard ERC-20 reads and transfers. When profile editing was enabled at launch, the metadata authority can call `updateName`, `updateSymbol`, `updateContractURI`, and `updateExtraMetadata`. No mint, burn, pause, owner, upgrade, or recovery function exists. [​](https://docs.o1.exchange/launchpad/reference/events-functions#common-launch-errors) Common launch errors --------------------------------------------------------------------------------------------------------------- | Error | Meaning | | --- | --- | | `StaleConfig` | Refresh the current factory settings and rebuild the transaction | | `LaunchExpired` | Use a fresh deadline | | `QuoteNotRegistered` | The selected quote is unavailable | | `LaunchSaltUsed` | Use a new launch identifier | | `InvalidLaunchFeePayment` | The creation-fee payment was not exact | | `OutOfBounds` / `InvalidConfig` | A hard limit or related-field rule failed | | `NotImmutable` | The created token failed its fixed-authority checks | | `NotSingleSided` | Opening liquidity would require quote currency | | `LiquidityLocked` | The requested liquidity change is not allowed | | `ExactOutputDisabledDuringAntiSnipe` | Use an input-amount trade or wait until the normal fee begins | | `PartialFillUnsupported` | The requested quote-specified amount could not be filled completely | [Limits and validation](https://docs.o1.exchange/launchpad/reference/limits) [Security and audit](https://docs.o1.exchange/launchpad/security) ⌘I --- # Smart contract architecture - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/architecture/contracts#content-area) The production system uses separate contracts for token creation, permanent liquidity, fee balances, vesting, and announcements. Each contract has a narrow responsibility, which makes its authority and custody easier to verify. Launch path ----------- The creator signs one factory transaction. It creates and distributes the token, opens the Uniswap v4 pool, and places the remaining supply into the permanent liquidity position. Trading path ------------ The trader signs a swap through Uniswap. The launch hook applies the fee, the user receives the trade output, and the fee escrow records claimable balances. [​](https://docs.o1.exchange/launchpad/architecture/contracts#contract-responsibilities) Contract responsibilities --------------------------------------------------------------------------------------------------------------------- | Contract | Responsibility | Custody or authority | | --- | --- | --- | | Base factory | `B20LaunchpadFactory` creates B20 tokens and coordinates their launch | Controls settings for future launches only | | Robinhood factory | `ERC20LaunchpadFactory` creates ERC-20 tokens and coordinates their launch | Controls settings for future launches only | | Token deployer | `LaunchTokenDeployer` creates the fixed-supply Robinhood token for the launch factory | Callable only by the factory; holds no user funds | | Launch hook | `LaunchHook` opens approved pools, owns permanent positions, and applies swap fees | Owns and permanently locks launch liquidity positions | | Fee escrow | `FeeEscrow` records and pays each recipient’s swap-fee balance | Can pay only balances credited by the hook | | Vesting vault | `VestingVault` stores and releases vested allocations | Has no administrator; schedules are set once | | Announcement registry | `AnnouncementRegistry` publishes creator-authenticated announcements | Has no token authority and holds no funds | | Robinhood token | `LaunchToken` is the fixed-supply ERC-20 implementation | Has no owner or administrative control | [​](https://docs.o1.exchange/launchpad/architecture/contracts#factory-launch-coordination) Factory: launch coordination -------------------------------------------------------------------------------------------------------------------------- `createLaunch` coordinates the complete launch. The Base factory creates a native B20 token, while the Robinhood factory creates a fixed-supply ERC-20. Both then follow the same distribution and market-opening process. | Stage | Factory behavior | | --- | --- | | Validate | Confirms the selected quote, creation fee, deadline, supply distribution, vesting schedules, profile-editing choice, and launch limits | | Create token | Creates the fixed supply and verifies the expected immutable token properties | | Distribute | Sends immediate allocations to recipients and vested allocations to `VestingVault` | | Configure market | Records the creator, platform fee receiver, fee split, anti-snipe schedule, currencies, and exact pool identity with `LaunchHook` | | Open pool | Initializes the Uniswap v4 pool at the configured opening price | | Seed liquidity | Sends the remaining token supply to the permanent position owned by the hook | | Publish result | Emits the token address, creator, pool ID, quote, supply, and spacing in `Launched` | The factory owner may update quote currencies, supply, opening prices, liquidity ranges, fees, the platform fee receiver, and announcement support for future launches. Those changes cannot rewrite a completed token or pool. [​](https://docs.o1.exchange/launchpad/architecture/contracts#launchhook-market-enforcement) LaunchHook: market enforcement ------------------------------------------------------------------------------------------------------------------------------ Each pool receives a frozen configuration when it is created. The hook then enforces the launch market throughout its lifetime. | Responsibility | Behavior | | --- | --- | | Pool gate | Accepts initialization only for a factory-registered launch | | Liquidity seed | Creates the token-only position and verifies that no quote currency is required | | Permanent lock | Rejects every removal and every external liquidity addition | | Anti-snipe | Calculates the timestamp-based opening surcharge in quote currency | | Fee accounting | Splits the base fee between creator, platform, and valid referrer | | Trade record | Publishes the executor, referrer, fee currency, fee amount, and optional comment in the `Trade` event; swap direction comes from the matching Uniswap event | During the opening anti-snipe period, `LaunchHook` keeps o1’s input-amount buy and sell flow open while applying the temporary surcharge. It rejects exact-output requests until the total fee reaches the normal 1% rate. The detailed callback and function surface is available in [Functions and events](https://docs.o1.exchange/launchpad/reference/events-functions) . [​](https://docs.o1.exchange/launchpad/architecture/contracts#escrow-vesting-and-announcements) Escrow, vesting, and announcements ------------------------------------------------------------------------------------------------------------------------------------- `FeeEscrow` tracks claimable balances. Anyone can trigger payment to the recorded recipient, while a recipient can also redirect their own claim. Only the launch hook can add new fee credits. `VestingVault` shows each schedule and the amount available now. Anyone can trigger a claim, but payment always goes to the recorded beneficiary. Only the factory can create a schedule, and no administrator can change or recover it later. `AnnouncementRegistry` records the creator at launch. That creator can later post announcements with a unique ID, description, and URI without receiving any token administration role. [​](https://docs.o1.exchange/launchpad/architecture/contracts#trust-boundaries) Trust boundaries --------------------------------------------------------------------------------------------------- * The factory owner can change defaults for launches that have not happened yet. * The factory owner cannot change an existing pool or token. * The hook can credit fees only according to frozen pool configuration. * The escrow can pay only swap fees already credited to it. * The vesting vault can send tokens only to the recorded beneficiary. * Transaction signing stays in the user’s wallet; o1 services never hold signing keys. [Fee and vesting claims](https://docs.o1.exchange/launchpad/trading/claims) [Interface and data flow](https://docs.o1.exchange/launchpad/architecture/frontend-indexer) ⌘I --- # Trading Season 2: Base - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/getting-started/rewards/season-2#content-area) [​](https://docs.o1.exchange/getting-started/rewards/season-2#base-season-overview) Base Season Overview ----------------------------------------------------------------------------------------------------------- Trading Season 2 represents the foundation of o1.exchange’s ongoing rewards program, focusing on Base chain trading with a comprehensive tier system based on ETH trading volume. ### [​](https://docs.o1.exchange/getting-started/rewards/season-2#season-timeline) Season Timeline Start Date ---------- **September 5, 2025** - Season 2 begins immediately after Season 1 ends [​](https://docs.o1.exchange/getting-started/rewards/season-2#base-wizard-badge-) Base Wizard Badge 🧙‍♂️ ------------------------------------------------------------------------------------------------------------ ![Base Wizard Badge](https://docs.o1.exchange/images/base-wizard-badge.gif) Earn the exclusive Base Wizard Badge by completing one of the following requirements: Trading Path ------------ **Trade 100 ETH** in total volume on Base chain Referral Path ------------- **Refer 300 ETH** in total volume through your referral network The Base Wizard Badge is a special achievement that recognizes both active traders and successful community builders. You only need to complete ONE of the two paths to earn this badge. [​](https://docs.o1.exchange/getting-started/rewards/season-2#tier-benefits) Tier Benefits --------------------------------------------------------------------------------------------- Each Base Chain tier unlocks exclusive benefits and recognition: Exclusive Badges ---------------- Enter trading contest with generous bounty Point Multipliers ----------------- Higher tiers earn increased points per trade Community Status ---------------- Special recognition and leaderboard placement Season 2 focuses exclusively on Base chain ETH trading volume. Other networks and tokens may be included in future seasons. [Trading Season 1: Early Beta](https://docs.o1.exchange/getting-started/rewards/season-1) [Zora Trading Contest](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest) ⌘I --- # Production contracts - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/reference/production-contracts#content-area) These are the current production contracts used for new o1 Launchpad tokens on Base and Robinhood Chain. These addresses and connections were verified onchain on **July 13, 2026**. Always confirm the chain ID and active factory before signing. The same-looking address on another chain is not interchangeable. [​](https://docs.o1.exchange/launchpad/reference/production-contracts#base-mainnet) Base mainnet --------------------------------------------------------------------------------------------------- Chain ID `8453`. View the network on [Basescan](https://basescan.org/) . ### [​](https://docs.o1.exchange/launchpad/reference/production-contracts#o1-launchpad-contracts) o1 Launchpad contracts | Contract | Address | | --- | --- | | B20 Launchpad Factory | [`0xa52ad458cE0282a971ecC71C051A32f28946bb9F`](https://basescan.org/address/0xa52ad458cE0282a971ecC71C051A32f28946bb9F) | | Launch Hook | [`0x985C14BAa2a18316ffdA0aeFB3a632fAdfcA2AcC`](https://basescan.org/address/0x985C14BAa2a18316ffdA0aeFB3a632fAdfcA2AcC) | | Fee Escrow | [`0xa2cBD9065cec93c443CAFb0837A62800EE7C4A84`](https://basescan.org/address/0xa2cBD9065cec93c443CAFb0837A62800EE7C4A84) | | Vesting Vault | [`0x3beeA54dB87A632A5FAF20dB6765D3af94c81b31`](https://basescan.org/address/0x3beeA54dB87A632A5FAF20dB6765D3af94c81b31) | | Announcement Registry | [`0xABDcBE060724b9BEf5A2daad017d9eA3Ed72DE28`](https://basescan.org/address/0xABDcBE060724b9BEf5A2daad017d9eA3Ed72DE28) | ### [​](https://docs.o1.exchange/launchpad/reference/production-contracts#base-b20-protocol-contracts) Base B20 protocol contracts | Contract | Address | | --- | --- | | B20 Factory | [`0xB20f000000000000000000000000000000000000`](https://basescan.org/address/0xB20f000000000000000000000000000000000000) | | Activation Registry | [`0x8453000000000000000000000000000000000001`](https://basescan.org/address/0x8453000000000000000000000000000000000001) | | Policy Registry | [`0x8453000000000000000000000000000000000002`](https://basescan.org/address/0x8453000000000000000000000000000000000002) | The factory checks activation of `keccak256("base.b20_asset")` before every B20 launch. ### [​](https://docs.o1.exchange/launchpad/reference/production-contracts#uniswap-and-quotes) Uniswap and quotes | Contract | Address | | --- | --- | | v4 PoolManager | [`0x498581fF718922c3f8e6A244956aF099B2652b2b`](https://basescan.org/address/0x498581fF718922c3f8e6A244956aF099B2652b2b) | | v4 Quoter | [`0x0d5e0F971ED27FBfF6c2837bf31316121532048D`](https://basescan.org/address/0x0d5e0F971ED27FBfF6c2837bf31316121532048D) | | v4 StateView | [`0xA3c0c9b65baD0b08107Aa264b0f3dB444b867A71`](https://basescan.org/address/0xA3c0c9b65baD0b08107Aa264b0f3dB444b867A71) | | Universal Router | [`0x6fF5693b99212Da76ad316178A184AB56D299b43`](https://basescan.org/address/0x6fF5693b99212Da76ad316178A184AB56D299b43) | | Permit2 | [`0x000000000022D473030F116dDEE9F6B43aC78BA3`](https://basescan.org/address/0x000000000022D473030F116dDEE9F6B43aC78BA3) | | Native ETH | `0x0000000000000000000000000000000000000000` | | USDC | [`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`](https://basescan.org/address/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913) | [​](https://docs.o1.exchange/launchpad/reference/production-contracts#robinhood-chain) Robinhood Chain --------------------------------------------------------------------------------------------------------- Chain ID `4663`. View the network on [Robinhood Chain Blockscout](https://robinhoodchain.blockscout.com/) . ### [​](https://docs.o1.exchange/launchpad/reference/production-contracts#o1-launchpad-contracts-2) o1 Launchpad contracts | Contract | Address | | --- | --- | | ERC-20 Launchpad Factory | [`0x411F21283D3E492BC395027329e08f9F4F560Ba5`](https://robinhoodchain.blockscout.com/address/0x411F21283D3E492BC395027329e08f9F4F560Ba5) | | Launch Hook | [`0x441F773B3bb1Ed4c6457D0528624112e43C02acc`](https://robinhoodchain.blockscout.com/address/0x441F773B3bb1Ed4c6457D0528624112e43C02acc) | | Fee Escrow | [`0x32f7a9A05bD62487D085Ad494e14Ec42543e19d2`](https://robinhoodchain.blockscout.com/address/0x32f7a9A05bD62487D085Ad494e14Ec42543e19d2) | | Launch Token Deployer | [`0x7dA2f15e0bbc564fbde55a4E23147f490061BbAb`](https://robinhoodchain.blockscout.com/address/0x7dA2f15e0bbc564fbde55a4E23147f490061BbAb) | | Vesting Vault | [`0x6bdAAe32F36da5896533fdAD5b7A72a2541063BE`](https://robinhoodchain.blockscout.com/address/0x6bdAAe32F36da5896533fdAD5b7A72a2541063BE) | | Announcement Registry | [`0x163f3A09278918bDdaf74cF2a4178F6369a9a3c1`](https://robinhoodchain.blockscout.com/address/0x163f3A09278918bDdaf74cF2a4178F6369a9a3c1) | ### [​](https://docs.o1.exchange/launchpad/reference/production-contracts#uniswap-and-quotes-2) Uniswap and quotes | Contract | Address | | --- | --- | | v4 PoolManager | [`0x8366a39CC670B4001A1121B8F6A443A643e40951`](https://robinhoodchain.blockscout.com/address/0x8366a39CC670B4001A1121B8F6A443A643e40951) | | v4 Quoter | [`0x8dc178efb8111bb0973dd9d722ebeff267c98f94`](https://robinhoodchain.blockscout.com/address/0x8dc178efb8111bb0973dd9d722ebeff267c98f94) | | v4 StateView | [`0xf3334192d15450cdd385c8b70e03f9a6bd9e673b`](https://robinhoodchain.blockscout.com/address/0xf3334192d15450cdd385c8b70e03f9a6bd9e673b) | | Universal Router | [`0x8876789976decbfcbbbe364623c63652db8c0904`](https://robinhoodchain.blockscout.com/address/0x8876789976decbfcbbbe364623c63652db8c0904) | | Permit2 | [`0x000000000022D473030F116dDEE9F6B43aC78BA3`](https://robinhoodchain.blockscout.com/address/0x000000000022D473030F116dDEE9F6B43aC78BA3) | | Native ETH | `0x0000000000000000000000000000000000000000` | | USDG | [`0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168`](https://robinhoodchain.blockscout.com/address/0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168) | [​](https://docs.o1.exchange/launchpad/reference/production-contracts#governance-and-fee-recipient) Governance and fee recipient ----------------------------------------------------------------------------------------------------------------------------------- These addresses are the same on both production chains. Future-launch governance owner ------------------------------ `0x5519a8Cc7211F483e19ff8d50A3B0c892701044D`[Base explorer](https://basescan.org/address/0x5519a8Cc7211F483e19ff8d50A3B0c892701044D) · [Robinhood explorer](https://robinhoodchain.blockscout.com/address/0x5519a8Cc7211F483e19ff8d50A3B0c892701044D) Platform fee receiver --------------------- `0x1cAa1962428382106Eb3f29B9719bdF797621C90`[Base explorer](https://basescan.org/address/0x1cAa1962428382106Eb3f29B9719bdF797621C90) · [Robinhood explorer](https://robinhoodchain.blockscout.com/address/0x1cAa1962428382106Eb3f29B9719bdF797621C90) The current owner controls configuration for future launches. The platform fee receiver receives creation fees and the platform share of swap fees. Neither address can modify a completed token or remove its liquidity. [​](https://docs.o1.exchange/launchpad/reference/production-contracts#verification-links) Verification links --------------------------------------------------------------------------------------------------------------- Each address links to its chain explorer. Base’s native B20 addresses are also defined in the [Base B20 specification](https://docs.base.org/base-chain/specs/upgrades/beryl/b20) , and the Uniswap addresses match the [official Uniswap v4 deployment list](https://developers.uniswap.org/docs/protocols/v4/deployments) . See the [machine-readable deployment snapshot](https://docs.o1.exchange/launchpad/reference/production-deployments.json) for normalized addresses and current configuration values. [Live configuration](https://docs.o1.exchange/launchpad/reference/live-configuration) [Limits and validation](https://docs.o1.exchange/launchpad/reference/limits) ⌘I --- # Token creation - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/create/token-creation#content-area) Every launch creates a new fixed-supply token and opens its Uniswap v4 market in the same transaction. The creator does not deposit quote currency and cannot create more tokens later. [​](https://docs.o1.exchange/launchpad/create/token-creation#form-fields) Form fields ---------------------------------------------------------------------------------------- | Field | Requirement | | --- | --- | | Name | Required, maximum 50 characters | | Symbol | Required, maximum 11 characters, no spaces; the UI normalizes it to uppercase | | Image | Required, maximum 2 MB; PNG, JPG, WEBP, or GIF | | Quote | Required; ETH or USDC on Base, ETH or USDG on Robinhood | | Description | Optional, included in the token’s public IPFS profile | | Website | Optional valid website URL | | X | Optional X profile URL | | Telegram | Optional Telegram link | | Extra information | Optional public key/value entries; keys cannot be empty | | Profile editing | Optional; grants permission to edit token information only | | Allocations and vesting | Optional launch distributions subject to the contract limits | [​](https://docs.o1.exchange/launchpad/create/token-creation#base-address-preview) Base address preview ---------------------------------------------------------------------------------------------------------- For Base launches, the create page previews the B20 token address before signing and searches for an address ending in `01`. The creator can refresh the preview before launch. This visual suffix does not change the token’s permissions, supply, price, or market. [​](https://docs.o1.exchange/launchpad/create/token-creation#supply-and-distribution) Supply and distribution ---------------------------------------------------------------------------------------------------------------- Current launches create a fixed supply of **1 billion (1,000,000,000) tokens**. The supply cannot increase after launch. pool supply = total supply - immediate allocations - vested allocations The supply is divided only once: * immediate allocations go directly to recipient wallets; * vested allocations go to the vesting contract and unlock on the chosen schedule; * every remaining token goes into the permanent Uniswap liquidity position. Allocations and vesting must leave some tokens for the market, so no launch can allocate the entire supply away from liquidity. [​](https://docs.o1.exchange/launchpad/create/token-creation#token-implementation) Token implementation ---------------------------------------------------------------------------------------------------------- * Base B20 * Robinhood ERC-20 The protocol creates a native B20 token with no administrator. Its 1 billion supply is created once. The creator may optionally retain permission to edit profile information, but cannot mint more tokens or control transfers.Base’s B20 protocol contracts are listed in [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts) . o1 creates a standard fixed-supply ERC-20 with no owner. Its 1 billion supply is created once, and the contract cannot mint more tokens, pause transfers, or be upgraded.The token supports normal ERC-20 transfers and approvals. Optional profile editing does not grant control over balances or the market. [​](https://docs.o1.exchange/launchpad/create/token-creation#profile-editing) Profile editing ------------------------------------------------------------------------------------------------ The default is no ongoing authority. If the creator opts in, they may update token profile information after launch. The creator can update: * token name; * token symbol; * public profile information, including the image, description, website, X, and Telegram; * extra profile information. This permission cannot create more tokens, change balances, pause transfers, upgrade the token, or remove liquidity. [​](https://docs.o1.exchange/launchpad/create/token-creation#transaction-safety) Transaction safety ------------------------------------------------------------------------------------------------------ The factory rejects a launch if: * the quote is no longer registered; * the unique launch identifier was already used; * the launch settings changed after the app prepared the transaction; * the deadline has passed; * the creation fee is wrong or cannot be transferred exactly; * allocation, vesting, profile, or liquidity requirements fail; * the token cannot be created exactly as shown; * opening the pool would require the creator to supply quote currency. The frontend refreshes the launch settings and chain time immediately before submission. If launch economics change while the transaction is pending, the call stops instead of silently launching with different settings. [​](https://docs.o1.exchange/launchpad/create/token-creation#creation-result) Creation result ------------------------------------------------------------------------------------------------ After confirmation, the app shows the token address and live pool. It also records the final distribution, vesting schedules, creation fee, and market settings from the confirmed transaction. Developers can find exact function and event names in [Functions and events](https://docs.o1.exchange/launchpad/reference/events-functions) . [Plan your launch](https://docs.o1.exchange/launchpad/launch-planning) [Allocations and vesting](https://docs.o1.exchange/launchpad/create/allocations-vesting) ⌘I --- # Data and AI access - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/integration/data-ai#content-area) o1 Launchpad documentation and production configuration are available in formats that work for people, search tools, coding agents, and other AI clients. [​](https://docs.o1.exchange/launchpad/integration/data-ai#documentation-resources) Documentation resources -------------------------------------------------------------------------------------------------------------- | Resource | Access | Use | | --- | --- | --- | | Documentation index | [Open `llms.txt`](https://docs.o1.exchange/llms.txt) | Discover available documentation pages | | Full documentation | [Open full text](https://docs.o1.exchange/llms-full.txt) | Retrieve the public documentation as one text corpus | | Page Markdown | Add `.md` to a documentation page URL | Retrieve clean context for one page | | Skill description | [Open `skill.md`](https://docs.o1.exchange/skill.md) | Read the documentation’s agent-facing capability summary | | Documentation MCP | `https://docs.o1.exchange/mcp` | Connect an MCP client to search and retrieve public documentation | The MCP URL is a client endpoint, not a web page. Opening it directly in a browser may return a method-not-allowed response. [​](https://docs.o1.exchange/launchpad/integration/data-ai#machine-readable-production-configuration) Machine-readable production configuration -------------------------------------------------------------------------------------------------------------------------------------------------- [`production-deployments.json`](https://docs.o1.exchange/launchpad/reference/production-deployments.json) provides the current Base and Robinhood contract addresses, Uniswap dependencies, quote currencies, fees, opening settings, governance addresses, and contract caps. The file is a dated public snapshot. Applications that prepare transactions should also read the current factory configuration before asking a wallet to sign. [​](https://docs.o1.exchange/launchpad/integration/data-ai#public-market-and-launch-data) Public market and launch data -------------------------------------------------------------------------------------------------------------------------- The o1 interface presents: * launch discovery, search, newest tokens, market-cap ranking, trending, and 24-hour volume; * token profiles, creators, socials, and explorer links; * pool price, FDV, liquidity, charts, recent trades, and holders; * immediate allocations and vesting schedules; * creator announcements and token profile updates; * creator, referral, platform, and vesting claim information. Contract state and chain events are the authoritative sources for tokens, pools, trades, fees, claims, and vesting. The interface adds searchable and historical views around that public data. [​](https://docs.o1.exchange/launchpad/integration/data-ai#safe-agent-workflow) Safe agent workflow ------------------------------------------------------------------------------------------------------ 1 [](https://docs.o1.exchange/launchpad/integration/data-ai#) Read current information Retrieve the relevant documentation, production addresses, and live contract configuration. 2 [](https://docs.o1.exchange/launchpad/integration/data-ai#) Prepare an unsigned action Build the launch, trade, or claim request with the selected chain, current fees, recipients, slippage, and deadline. 3 [](https://docs.o1.exchange/launchpad/integration/data-ai#) Show the complete result Present the contract, assets, amounts, recipients, and expected outcome before requesting approval. 4 [](https://docs.o1.exchange/launchpad/integration/data-ai#) Sign with the user's wallet The user reviews and signs in their wallet. Documentation and data tools never need the private key. Agents and integrations should never store a private key, auto-sign transactions, or reuse a stale factory configuration. [Direct contract integration](https://docs.o1.exchange/launchpad/integration/direct) [Live configuration](https://docs.o1.exchange/launchpad/reference/live-configuration) ⌘I --- # Single-sided liquidity - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/trading/liquidity#content-area) Every launch opens a real Uniswap v4 pool. All tokens available to the market begin on the token side of the opening price, so the creator does not need to deposit ETH, USDC, or USDG as liquidity. [​](https://docs.o1.exchange/launchpad/trading/liquidity#current-market-setup) Current market setup ------------------------------------------------------------------------------------------------------ | Setting | Current value | | --- | --- | | Pair | Launch token and the creator’s selected quote | | Opening value | FDV close to USD 4,000 under the current quote assumptions | | Pool supply | Fixed supply minus immediate and vested allocations | | Liquidity | One continuous token-side range beginning at the opening price | | Range share | 100% of the pool supply | | Position owner | `LaunchHook` | | Removal | Permanently disabled | The liquidity range uses Uniswap’s spacing value of `200`. This controls where the range can begin and end; it does not force prices or trades to move in fixed steps. [​](https://docs.o1.exchange/launchpad/trading/liquidity#opening-fdv) Opening FDV ------------------------------------------------------------------------------------ Current launches have a fixed supply of **1 billion (1,000,000,000) tokens**. The opening FDV is the opening token price multiplied by that complete supply. | Quote assumption | Current opening target | | --- | --- | | ETH at USD 1,800 | FDV close to USD 4,000 | | USDC at USD 1 | FDV close to USD 4,000 | | USDG at USD 1 | FDV close to USD 4,000 | FDV is a valuation reference, not money raised or deposited. For ETH markets, its USD value changes with the live ETH price. Trading then moves the token price according to Uniswap v4 market activity. [​](https://docs.o1.exchange/launchpad/trading/liquidity#how-inventory-changes) How inventory changes -------------------------------------------------------------------------------------------------------- 1 [](https://docs.o1.exchange/launchpad/trading/liquidity#) The market opens with tokens The permanent position starts with the pool supply in launch tokens and no quote deposit from the creator. 2 [](https://docs.o1.exchange/launchpad/trading/liquidity#) Buys add quote currency Buyers send ETH, USDC, or USDG and receive tokens. Token inventory decreases while quote inventory increases. 3 [](https://docs.o1.exchange/launchpad/trading/liquidity#) Sells return tokens Sellers send tokens back to the pool and receive quote currency at the live Uniswap v4 price. 4 [](https://docs.o1.exchange/launchpad/trading/liquidity#) The position stays active Remaining tokens and accumulated quote currency continue supporting the market inside the same permanent position. Because the position starts with tokens and no quote inventory, early sell quotes depend on quote currency added by earlier buys. A sell may be limited or unavailable until the pool has enough ETH, USDC, or USDG to return. pool supply = 1,000,000,000 - immediate allocations - vested allocations [​](https://docs.o1.exchange/launchpad/trading/liquidity#token-only-launch-check) Token-only launch check ------------------------------------------------------------------------------------------------------------ Before the launch completes, the contracts verify that opening the position requires tokens only. If a configuration would require ETH or a stablecoin from the creator, the transaction stops. [​](https://docs.o1.exchange/launchpad/trading/liquidity#why-liquidity-is-permanent) Why liquidity is permanent ------------------------------------------------------------------------------------------------------------------ * `LaunchHook` owns the position; * its liquidity cannot be decreased or removed; * outside accounts cannot modify the locked position; * there is no transferable LP token or position NFT; * there is no administrator withdrawal or recovery path. The assets remain inside Uniswap. o1 can adjust settings for later launches but cannot remove or rewrite an existing position. [Allocations and vesting](https://docs.o1.exchange/launchpad/create/allocations-vesting) [Fees, anti-snipe, and referrals](https://docs.o1.exchange/launchpad/trading/fees-referrals) ⌘I --- # Allocations and vesting - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/create/allocations-vesting#content-area) Allocations are optional and are deducted from the supply placed into the pool. They must be fully specified before the launch transaction is signed. [​](https://docs.o1.exchange/launchpad/create/allocations-vesting#allocation-types) Allocation types ------------------------------------------------------------------------------------------------------- Immediate allocation -------------------- The recipient receives the specified token amount in the launch transaction and can transfer it immediately. Vested allocation ----------------- The vesting contract receives the amount at launch and releases it to the beneficiary at the chosen milestones. No administrator can change the recipient or schedule later. [​](https://docs.o1.exchange/launchpad/create/allocations-vesting#current-caps) Current caps ----------------------------------------------------------------------------------------------- | Constraint | Limit | | --- | --- | | Immediate plus vested recipients | 128 total | | Vested beneficiaries | 64 | | Steps per beneficiary | 24 | | Vesting steps across the launch | 128 | | First unlock | At least 1 day after launch | | Final unlocked percentage | Exactly 100% | | Total allocated amount | Strictly less than total token supply | Recipient addresses must be valid and unique across both allocation types. Launch system contracts cannot be used as recipients. [​](https://docs.o1.exchange/launchpad/create/allocations-vesting#pool-coverage-and-discovery) Pool coverage and discovery ----------------------------------------------------------------------------------------------------------------------------- Immediate and vested allocations reduce the number of tokens placed into permanent liquidity. o1 recommends leaving at least **25% of the fixed supply** in the pool for healthier market depth. This is a market-quality recommendation, not the contract minimum. The create form and final review show the projected pool share before signing. Larger allocations can increase price impact and volatility, and very low pool coverage can make a launch ineligible for ranked discovery views such as Trending, Market Cap, or 24-hour Volume. New, search, the token page, and trading remain available. Ranked placement is never guaranteed. [​](https://docs.o1.exchange/launchpad/create/allocations-vesting#staircase-schedules) Staircase schedules ------------------------------------------------------------------------------------------------------------- Each step contains: * the number of days after launch; * the percentage released at that step. The interface accepts whole days and percentages with up to two decimal places. Step percentages must add up to 100%, and the preview shows both the newly released share and the cumulative amount available by each date. For a 1,000,000 token allocation: | Day | Newly unlocked | Total unlocked | Total tokens available | | --- | --- | --- | --- | | 30 | 20% | 20% | 200,000 | | 90 | 30% | 50% | 500,000 | | 180 | 50% | 100% | 1,000,000 | Nothing streams between steps. At day 89, only the first 200,000 tokens are vested. At day 90, the cumulative vested amount becomes 500,000. [​](https://docs.o1.exchange/launchpad/create/allocations-vesting#validation-rules) Validation rules ------------------------------------------------------------------------------------------------------- For every schedule: 1. unlock dates must strictly increase; 2. every step must release a positive percentage; 3. step percentages must add up to exactly 100%; 4. rounded cumulative token amounts must strictly increase; 5. the first point must be at least one day after launch. For very small allocations, each milestone must unlock at least some additional token amount. A step that rounds to the same amount as the previous step is rejected. [​](https://docs.o1.exchange/launchpad/create/allocations-vesting#claims-and-guarantees) Claims and guarantees ----------------------------------------------------------------------------------------------------------------- The vesting contract has no administrator. Nobody can withdraw locked tokens early, change a schedule, replace a beneficiary, or redirect a claim. Anyone may trigger a claim, but the tokens always go to the beneficiary chosen at launch. The app shows the total allocation, amount already claimed, schedule, and amount available now. For a larger claim campaign, an immediate allocation can fund a separately deployed and audited Merkle claim contract. See [Plan your launch](https://docs.o1.exchange/launchpad/launch-planning#optional-airdrop-claim-tool) . [Token creation](https://docs.o1.exchange/launchpad/create/token-creation) [Single-sided liquidity](https://docs.o1.exchange/launchpad/trading/liquidity) ⌘I --- # Fee and vesting claims - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/trading/claims#content-area) Swap fees and vested allocations remain available until they are claimed. One inactive recipient cannot block swaps, launches, or anyone else’s claim. [​](https://docs.o1.exchange/launchpad/trading/claims#fee-claims) Fee claims ------------------------------------------------------------------------------- The connected wallet’s Profile page shows its available balances separately for ETH, USDC, or USDG. Its **Claim** action always pays the recorded recipient. | Contract option | Who may start it | Destination | | --- | --- | --- | | `claim` | Anyone | Always the recorded recipient | | `claimTo` | The balance owner through a direct contract interaction | An address chosen by that owner | Claims pay the same quote currency used by the launch market. A Base USDC market pays USDC fees, a Robinhood USDG market pays USDG fees, and an ETH market pays ETH fees. [​](https://docs.o1.exchange/launchpad/trading/claims#vesting-claims) Vesting claims --------------------------------------------------------------------------------------- The Profile page shows how many vested tokens are available now, how many have already been claimed, and the remaining milestones. The contract also allows anyone to trigger a claim, but the tokens always go to the beneficiary selected at launch. This permits automation without giving the caller custody. [​](https://docs.o1.exchange/launchpad/trading/claims#profile-overview) Profile overview ------------------------------------------------------------------------------------------- The connected Profile page groups: * claimable hook-fee balances by asset; * referral activity and attributed trades; * beneficiary vesting schedules and claimable amounts; * the wallet’s launches and supported management tools. Creator and referral earnings are claimed from **Profile > Fees**. **Profile > Referrals** shows attributed trade counts, hook-fee volume, and recent referral activity; it is not the claimable-balance view. Wallet Activity shows indexed claim transactions. Profile views may briefly sync after confirmation; the contracts remain authoritative. [​](https://docs.o1.exchange/launchpad/trading/claims#currency-handling) Currency handling --------------------------------------------------------------------------------------------- * ETH * USDC or USDG The app claims native ETH directly to the destination. The app claims the stablecoin used by that launch pool. Developers should use the exact quote address listed in [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts) . Developers can find the exact read and claim functions in [Functions and events](https://docs.o1.exchange/launchpad/reference/events-functions) . [Fees, anti-snipe, and referrals](https://docs.o1.exchange/launchpad/trading/fees-referrals) [Smart contract architecture](https://docs.o1.exchange/launchpad/architecture/contracts) ⌘I --- # Fees, anti-snipe, and referrals - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/trading/fees-referrals#content-area) o1 Launchpad charges a one-time token creation fee and a fee on every swap. Swap fees are collected in the pool’s quote currency and become claimable by the creator, platform, and valid referrer. [​](https://docs.o1.exchange/launchpad/trading/fees-referrals#creation-fees) Creation fees --------------------------------------------------------------------------------------------- | Chain | Quote | Current fee | | --- | --- | --- | | Base | ETH | 0.001 ETH | | Base | USDC | 2 USDC | | Robinhood | ETH | 0.001 ETH | | Robinhood | USDG | 2 USDG | For ETH, the wallet includes the creation fee in the launch transaction. For USDC or USDG, the wallet may first request token approval. The fee goes directly to the platform fee receiver. [​](https://docs.o1.exchange/launchpad/trading/fees-referrals#normal-swap-fee) Normal swap fee ------------------------------------------------------------------------------------------------- The normal swap fee is **1% of the quote amount**. With a valid referrer, that 1% is divided as follows: | Recipient | Share of the 1% fee | Equivalent share of the trade | | --- | --- | --- | | Creator | 50% | 0.5% | | Platform | 30% | 0.3% | | Referrer | 20% | 0.2% | If a trade has no valid referrer, the unused 0.2% referral share goes to the platform. Fees are always denominated in the selected quote, such as ETH, USDC, or USDG. [​](https://docs.o1.exchange/launchpad/trading/fees-referrals#first-16-seconds) First 16 seconds --------------------------------------------------------------------------------------------------- Trading remains open when the pool launches. The total fee starts at 99% and decreases linearly to the normal 1% fee over 16 seconds. This timestamp-based schedule makes immediate sniping intentionally uneconomic. | Time since launch | Approximate total fee | | --- | --- | | At launch | 99% | | 4 seconds | 74.5% | | 8 seconds | 50% | | 12 seconds | 25.5% | | 16 seconds and later | 1% | The creator and referrer shares are calculated from the normal 1% fee. The temporary amount above 1% is the anti-snipe surcharge and goes to the platform. o1 uses input-amount swaps: traders enter how much they want to spend or sell, and those swaps remain available throughout the 16-second period. Direct integrations that request an exact output are rejected until the fee reaches 1%. [​](https://docs.o1.exchange/launchpad/trading/fees-referrals#get-a-referral-link) Get a referral link --------------------------------------------------------------------------------------------------------- o1 provides two types of referral links: | Link | Where to copy it | When it applies | | --- | --- | --- | | Global referral | Open your profile and select **Referral** | Used as your general referral across o1 Launchpad | | Token referral | Open a token page, connect your wallet, and select **Referral link** | Applies first to that token on that chain | The **Profile** link on a profile page is only a public profile link. It does not set referral attribution unless it also contains a referral parameter. [​](https://docs.o1.exchange/launchpad/trading/fees-referrals#which-referral-is-used) Which referral is used --------------------------------------------------------------------------------------------------------------- For each token, the interface checks referral attribution in this order: 1. a token-specific referral for that exact chain and token; 2. the connected wallet’s previously saved global referral; 3. a global referral saved in the current browser. If the first candidate is invalid, the interface tries the next valid candidate. Opening a token-specific referral link also becomes the global fallback when the visitor does not already have one. Once a wallet has saved a global referral, later global links do not replace it; a token-specific link can still take priority for its exact chain and token. When a connected wallet first uses a browser-saved global referral, the interface may request a gasless signature to save that attribution to the wallet profile. This is not a token approval or an onchain transaction. When the trader submits a swap, the interface includes the selected referral address with that trade. `LaunchHook` validates it again onchain before crediting the referrer’s share. An invalid referral never blocks the swap: the hook ignores it and sends the unused referral share to the platform. [​](https://docs.o1.exchange/launchpad/trading/fees-referrals#referral-protections) Referral protections ----------------------------------------------------------------------------------------------------------- A referral is ignored when it points to: * the trader’s connected wallet; * the launch creator; * the platform fee receiver; * an empty or malformed address; * the swap router or execution contract. These checks prevent self-referral and protected-recipient referral. If no candidate is valid, the trade still works and the referral share goes to the platform. [​](https://docs.o1.exchange/launchpad/trading/fees-referrals#trade-comments) Trade comments ----------------------------------------------------------------------------------------------- A trader may attach an optional comment of up to 32 UTF-8 bytes. The comment is included with the public onchain trade record, together with the direction, quote currency, referrer, and fee. [​](https://docs.o1.exchange/launchpad/trading/fees-referrals#claiming-fees) Claiming fees --------------------------------------------------------------------------------------------- Creator, platform, and referral balances accumulate until claimed. Creators and referrers can open their connected Profile page and use **Fee claims**, where balances are grouped by asset. See [Claims](https://docs.o1.exchange/launchpad/trading/claims) for the complete interface flow and [Functions and events](https://docs.o1.exchange/launchpad/reference/events-functions) for direct contract integration. [Single-sided liquidity](https://docs.o1.exchange/launchpad/trading/liquidity) [Fee and vesting claims](https://docs.o1.exchange/launchpad/trading/claims) ⌘I --- # MiCA Whitepaper - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/token/mica-whitepaper#content-area) [​](https://docs.o1.exchange/token/mica-whitepaper#mica-whitepaper) MiCA Whitepaper -------------------------------------------------------------------------------------- The Markets in Crypto-Assets (MiCA) whitepaper for the $O token is available for download below. Download MiCA Whitepaper ------------------------ View or download the full MiCA whitepaper (PDF) [Whitepaper](https://docs.o1.exchange/token/whitepaper) [Disclosure](https://docs.o1.exchange/token/disclosure) ⌘I --- # Disclosure - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/token/disclosure#content-area) Writing as of June 2, 2026 The following disclosure is intended to provide an overview of o1.exchange and the $O token. It does not purport to be complete or to contain all information that a recipient may consider relevant in making a decision regarding the token. Nothing in this disclosure should be viewed as a statement about the future of o1.exchange or the financial performance of the $O token. [​](https://docs.o1.exchange/token/disclosure#1-project-information) 1\. Project Information ----------------------------------------------------------------------------------------------- o1.exchange is the Onchain Everything Exchange — a non-custodial, lightning-fast trading platform that delivers institutional-grade execution for spot trading, perpetual futures, and prediction markets across Base, Solana, and BNB Chain. The platform aggregates liquidity from 100+ sources, offers sub-block latency execution, advanced order types (limit, TWAP, stops, sniping), real-time analytics, TradingView integration, and quantitative/algorithmic trading tools. o1.exchange has achieved $180M+ in spot trading volume, 3M+ transactions, and 400,000+ user signups within 7 months of beta, reaching top-3 revenue protocols on Base. ### [​](https://docs.o1.exchange/token/disclosure#executive-officers-and-key-personnel) Executive Officers and Key Personnel **Company:** MoonX Foundation PO Box 144, 3119 9 Forum Lane, Camana Bay, George Town, Grand Cayman, KY1-9006, Cayman Islands **Founders and Executive Officers:** * Claudio Romildo Pezzia, Director * Jerry Pan, Founder ### [​](https://docs.o1.exchange/token/disclosure#backers-and-third-party-contributors) Backers and Third-Party Contributors o1.exchange raised a $4.8M seed round from the following institutional investors: * Coinbase Ventures * a16z (Andreessen Horowitz) * AllianceDAO * The House Fund * Amber Group * 30+ other select angels and institutional investors No third-party development shops or external contractors materially contributed to the development of the protocol or the token. [​](https://docs.o1.exchange/token/disclosure#2-token-sale-information) 2\. Token Sale Information ----------------------------------------------------------------------------------------------------- o1.exchange has not conducted and does not plan to conduct a public token sale. $O token distribution is driven entirely by usage (trading points program) and ecosystem growth. There is no public offering, presale, or crowdsale of $O tokens. [​](https://docs.o1.exchange/token/disclosure#3-token-and-token-distribution-information) 3\. Token and Token Distribution Information ----------------------------------------------------------------------------------------------------------------------------------------- ### [​](https://docs.o1.exchange/token/disclosure#token-overview) Token Overview $O is the native utility token of the o1.exchange platform. It is an ERC-20 token deployed on the Base blockchain (L2 on Ethereum). $O provides the following utility to holders: * **Tiered Trading Fee Discounts:** Holding or staking $O reduces trading fees in real time across all markets on o1.exchange and swap.o1.exchange DEX Aggregator; discounts scale with amount held/staked. * **Early Access to Alpha Features:** Priority access to quantitative trading tools, strategy automation, advanced order types, and upcoming AI/alpha-generation features before public release. * **Limited Badge Claims & Revenue Sharing Eligibility:** Users who stake at least a required amount of $O for a required period may become eligible to claim limited ecosystem badges. Badge holders qualify to apply for a portion of o1.exchange platform revenue sharing. The minimum staking amount and staking duration are still TBD. $O does not represent equity, debt, or profit-sharing in any legal entity. Token holders are not entitled to dividends, interest, revenue share, or any other financial consideration. The platform may conduct discretionary ecosystem initiatives (grants, liquidity support) at the sole discretion of the project team; such actions do not confer enforceable rights on token holders. ### [​](https://docs.o1.exchange/token/disclosure#token-supply-and-dynamics) Token Supply and Dynamics * **Token Standard:** ERC-20 * **Blockchain:** Base (Ethereum L2) * **Total Supply:** 1,000,000,000 $O (fixed; no inflation or minting after TGE) * **Circulating Supply at TGE:** 16% (160,000,000 $O) * Community Airdrop / Trading Points: 3% (claimable at TGE) * Ecosystem / Trading Competition: 3% * Liquidity Fund (CEX/DEX): 6% (unlocked at TGE) * Treasury: 4% (unlocked at TGE) * No inflationary mechanics; token supply is fixed at genesis. * Future token issuances: None planned. Any changes will be publicly disclosed at least one week before taking effect. ### [​](https://docs.o1.exchange/token/disclosure#token-allocation-and-vesting) Token Allocation and Vesting The total supply of 1,000,000,000 $O is allocated as follows: | Category | Allocation | Tokens | TGE Unlock | | --- | --- | --- | --- | | Community | 25% | 250,000,000 | 3% | | Ecosystem | 25% | 250,000,000 | 3% | | Investors | 18% | 180,000,000 | 0% | | Team | 10% | 100,000,000 | 0% | | Treasury | 16% | 160,000,000 | 4% | | Liquidity | 6% | 60,000,000 | 6% | **Vesting Details:** * **Community (25%)** — Trading points airdrop and rewards. Season 1: 3% at TGE; Season 2: 5%; Season 3+: TBD. * **Ecosystem (25%)** — Liquidity incentives and trading competitions. 1-year cliff followed by 36-month linear vesting. Only used for long-term development of the ecosystem and does not benefit insiders. * **Investors (18%)** — Private venture round investors. 1-year cliff followed by 36-month linear vesting. * **Team (10%)** — Project team. 1-year cliff followed by 36-month linear vesting. * **Treasury (16%)** — Platform development, operations, and ecosystem initiatives. 4% unlocked at TGE; remainder held under multi-sig control. Only used for long-term development of the platform and does not benefit insiders. * **Liquidity (6%)** — Initial DEX/CEX liquidity provisioning. Fully unlocked at TGE. ### [​](https://docs.o1.exchange/token/disclosure#prior-funding-rounds) Prior Funding Rounds o1.exchange has completed one funding round: * **Round:** Seed * **Year:** 2025 * **Amount Raised:** $4.8M * **Investors:** Coinbase Ventures, a16z, AllianceDAO, The House Fund, Amber Group, and 30+ other select angels and institutional investors. * **Vesting:** Investor token allocation (18% of total supply) is subject to a 1-year cliff lock starting at TGE, followed by 36-month linear vesting. * Locked tokens cannot be staked. The staking program provides only non-financial utility benefits (fee discounts, feature access) and does not involve unvested token allocations. [​](https://docs.o1.exchange/token/disclosure#4-airdrop-information) 4\. Airdrop Information ----------------------------------------------------------------------------------------------- o1.exchange plans to distribute $O tokens to the community via a trading points conversion program at TGE. * **Total Airdrop Allocation:** 25% of total supply (250,000,000 $O). 12% of them, i.e. 3%, will be distributed at TGE (Season 1). * **Eligible Recipients:** Users who accumulated trading points on o1.exchange during the points program period (approximately 400,000 registered users). * **Eligibility Requirements:** Active trading on o1.exchange platform, completion of identity verification, and passing of sanctions screening. * **Geographic Restrictions:** Users in jurisdictions subject to OFAC and other applicable sanctions are excluded from claiming. * **Claim Process:** Eligible users will be able to claim $O tokens through an on-chain distribution contract beginning at TGE. Wallet authentication and applicable compliance checks are required. Tokens are not automatically pushed to wallets. * **Unclaimed Tokens Policy:** Undeliverable tokens will be returned to the project treasury wallet and held for 90 days, during which affected users may contact the team. After 90 days, any undeliverable tokens will be permanently returned to the community treasury for future distribution programs as decided by the Project Team. [​](https://docs.o1.exchange/token/disclosure#5-conflicts-of-interest-information) 5\. Conflicts of Interest Information --------------------------------------------------------------------------------------------------------------------------- No related-party transactions involving the token other than the token allocations described in this disclosure have occurred. [​](https://docs.o1.exchange/token/disclosure#6-market-makers-&-liquidity-information) 6\. Market Makers & Liquidity Information ----------------------------------------------------------------------------------------------------------------------------------- o1.exchange will deploy liquidity for $O via the Liquidity allocation (6% of total supply, 60,000,000 $O) at TGE. This allocation is designated for initial DEX and CEX liquidity provisioning. No exchange listing fees have been paid to date. Market maker arrangements, if any, will be disclosed prior to TGE. Any contracted market maker identities, token allocations, and durations will be provided no later than one week before the Day 1 listing event. Specific market maker details are pending finalization as of the date of this disclosure and will be updated accordingly. No tokens have been allocated or granted to any market maker as of the date of this document. [​](https://docs.o1.exchange/token/disclosure#7-security-information) 7\. Security Information ------------------------------------------------------------------------------------------------- * **Token Contract:** The $O token contract (ERC-20) is deployed on Base. * **Smart Contract Audits:** Third-party security audits of the $O token contract and all vesting contracts have been audited: [https://xors.xyz/audits/o1-exchange-2026-05-02.pdf](https://xors.xyz/audits/o1-exchange-2026-05-02.pdf) . * **Vesting Enforcement:** Token vesting for team and investor allocations is enforced through time-bound smart contracts on the Base blockchain. These contracts programmatically release tokens according to the vesting schedule. Contract code will be publicly verifiable on Basescan. * **Platform Security:** o1.exchange is non-custodial. Users retain full control of assets. The platform supports multi-wallet authentication and on-chain verifiable transaction history. ### [​](https://docs.o1.exchange/token/disclosure#public-resources) Public Resources * Website: [o1.exchange](https://o1.exchange/) * Twitter/X: [x.com/o1\_exchange](https://x.com/o1_exchange) * Discord: [discord.gg/o1exchange](https://discord.gg/o1exchange) * Dune Analytics: [dune.com/stambouli\_o1/o1exchange](https://dune.com/stambouli_o1/o1exchange) * DefiLlama: [defillama.com/protocol/o1.exchange](https://defillama.com/protocol/o1.exchange) [​](https://docs.o1.exchange/token/disclosure#8-risks) 8\. Risks ------------------------------------------------------------------- The following risks are material to holders and prospective holders of $O: 1. **Utility Token Only:** $O is a utility token providing platform benefits only. It does not represent equity, or debt in any legal entity. Token holders are not entitled to receive any payments, dividends, interest, revenue share, or other financial consideration by virtue of holding $O. 2. **Market and Price Risk:** Token value is determined by market dynamics and utility. Cryptocurrencies are highly volatile and may lose substantial value. Past performance of other digital assets is not indicative of future results. 3. **No Guaranteed Revenue or Buybacks:** No guarantees are made regarding future revenue, token buybacks, or fee discounts. Any treasury ecosystem initiatives are discretionary and do not confer enforceable rights on token holders. 4. **Staking Cooldown:** Staking involves a 30-day cooldown period. Tokens are non-transferable during this period. The cooldown resets if additional unstaking occurs during an active cooldown. 5. **Regulatory Risk:** Regulatory treatment of digital assets and utility tokens varies by jurisdiction and may change. The platform applies geo-restrictions in sanctioned jurisdictions (OFAC-listed countries). Certain features, such as prediction market routing, may not be available in specific jurisdictions including the United States. 6. **Platform Development Risk:** Future platform features, governance mechanisms, and roadmap milestones are subject to change. Governance exploration ($O-based voting) and synthetic assets are under consideration but not guaranteed. 7. **Concentration Risk:** The founding team and seed investors collectively control significant token allocations. While vesting schedules reduce short-term concentration risk, these parties may have significant influence after vesting periods. 8. **Liquidity Risk:** There is no guarantee of ongoing liquidity for $O on any exchange. Market conditions may make it difficult to buy or sell $O at desired prices. 9. **This Disclosure:** This disclosure is for informational purposes only and does not constitute investment advice, a solicitation to purchase $O, or a prospectus. Recipients should conduct their own due diligence. [MiCA Whitepaper](https://docs.o1.exchange/token/mica-whitepaper) [Community](https://docs.o1.exchange/token/community) ⌘I --- # Whitepaper - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/token/whitepaper#content-area) **$O – The Utility Token of the Onchain Everything Exchange** Writing as of June 2, 2026 Version 1.0 | April 2026 TGE: June 2026 17 | Deployed on Base (ERC-20) [​](https://docs.o1.exchange/token/whitepaper#executive-summary) Executive Summary ------------------------------------------------------------------------------------- o1.exchange is the Onchain Everything Exchange — a lightning-fast, non-custodial trading platform that delivers institutional-grade execution for spot, perpetuals, prediction markets, and future synthetic/tokenized assets across Base, Solana, and BNB Chain. Built for retail traders, quant funds, and AI agents alike, o1.exchange aggregates liquidity from 100+ sources, offers sub-block latency execution, advanced order types (limit, TWAP, stops, sniping), real-time analytics, TradingView integration, and quantitative/algorithmic trading tools previously reserved for CeFi. The utility token $O powers the ecosystem. Holders and stakers receive tiered trading fee discounts, early access to alpha features (quant automation, advanced order types, strategy builders). A trading points program further rewards active traders with $O allocations, driving long-term platform loyalty. Backed by Coinbase Ventures, a16z, AllianceDAO, The House Fund, Amber Group, and 30+ other select angels and institutional investors in a $4.8M seed round, o1.exchange has already achieved $220M+ spot volume, 3M+ transactions, and 400k+ user signups in just 7 months of beta, reaching top-3 revenue protocols on Base while expanding to perps (Hyperliquid) and prediction markets (Kalshi). [​](https://docs.o1.exchange/token/whitepaper#1-the-problem-fragmented-expensive-and-underpowered-onchain-trading) 1\. The Problem: Fragmented, Expensive, and Underpowered Onchain Trading ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- DeFi trading today suffers from: * Fragmented liquidity and poor price discovery across chains and venues. * High slippage, MEV exposure, and gas costs. * Lack of advanced execution tools (no native TWAP, limits, or algo strategies on most DEXs). * Slow, clunky UX compared to centralized exchanges. * No seamless support for perps, prediction markets, or emerging asset classes (synthetics, tokenized equities) in one unified interface. * High fees that erode retail and institutional profitability. Traders are forced to juggle multiple apps, bridges, and wallets, losing edge and paying premium prices. [​](https://docs.o1.exchange/token/whitepaper#2-the-solution-o1-exchange-%E2%80%93-onchain-everything-exchange) 2\. The Solution: o1.exchange – Onchain Everything Exchange ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ o1.exchange is a fully non-custodial trading terminal that brings CeFi-grade performance to DeFi rails. Key features include: * **Low-latency execution** (≤1 block or microsecond-level on supported chains). * **Aggregated liquidity** across 100+ DEXs, on-chain venues, and off-chain PMMs for best-in-class fills. * **Advanced order types** (limit, TWAP, stops/take-profit, sniping) with algorithmic automation. * **Quantitative & AI-powered tools** — strategy builders, backtesting, real-time analytics, PnL tracking, and multi-chain portfolio views. * **Multi-asset coverage** — spot, perpetual futures (via Hyperliquid), prediction markets (via Kalshi), and roadmap for tokenized equities/synthetics. * **Multi-chain & gas abstraction** — trade on Base (primary), Solana, BNB Chain without managing gas or bridges. * **Self-custodial security** — multi-wallet support, on-chain verifiable history, no custody. * **Institutional-ready** — sub-accounts, role-based access, post-trade reporting, order-flow masking. The result: traders get more tokens on every trade, lower costs, and professional-grade tools in one seamless platform. [​](https://docs.o1.exchange/token/whitepaper#3-$o-token-utility) 3\. $O Token Utility ----------------------------------------------------------------------------------------- $O is the core utility token that aligns user incentives with platform growth. Primary benefits for $O holders and stakers: ### [​](https://docs.o1.exchange/token/whitepaper#tiered-trading-fee-discounts) Tiered Trading Fee Discounts Hold or stake $O to unlock meaningful reductions in trading fees. Discounts are tiered by amount held/staked and apply in real time across all markets. ### [​](https://docs.o1.exchange/token/whitepaper#early-access-to-alpha-features) Early Access to Alpha Features $O holders gain priority access to quantitative trading tools, strategy automation, advanced order types, and upcoming AI/alpha-generation features before public release. ### [​](https://docs.o1.exchange/token/whitepaper#limited-badge-claim-&-revenue-sharing-eligibility) Limited Badge Claim & Revenue Sharing Eligibility Users who stake at least a required amount of $O for a required period may become eligible to claim limited ecosystem badges. Badge holders qualify to apply for a portion of o1.exchange platform revenue sharing, creating a direct link between long-term staking commitment and platform economic participation. ### [​](https://docs.o1.exchange/token/whitepaper#trading-points-program) Trading Points Program Active traders earn points convertible to $O allocations. This incentivizes volume and loyalty from day one. ### [​](https://docs.o1.exchange/token/whitepaper#staking-mechanics) Staking Mechanics * Navigate to the staking page on o1.exchange, connect wallet, and stake $O. * 30-day cooldown on unstaking (resets if additional unstaking occurs during cooldown). * Staked tokens remain in your wallet; no lock-up beyond the cooldown. [​](https://docs.o1.exchange/token/whitepaper#4-tokenomics) 4\. Tokenomics ----------------------------------------------------------------------------- * **Token Standard:** ERC-20 on Base * **Total Supply:** 1,000,000,000 $O (fixed, no inflation) **Allocation Breakdown** (approximate, subject to final TGE parameters): | Category | Allocation | Description | | --- | --- | --- | | Community | 25% | Trading points airdrop (3% at TGE for Season 1), rewards. Season 1: 3%; Season 2: 5%; Season 3+: TBD | | Ecosystem | 25% | Liquidity incentives and trading competitions | | Investors | 18% | Seed round backers | | Team | 10% | Vested with 12-month cliff + linear release | | Treasury | 16% | Platform development, operations, future initiatives | | Liquidity | 6% | Initial DEX/CEX liquidity provisioning | * **Circulating Supply at TGE:** 16% * **Vesting:** Investor and team tokens follow standard 1-year cliff + linear vesting to ensure long-term alignment. * **No public sale** — distribution driven by usage (points program) and ecosystem growth. [​](https://docs.o1.exchange/token/whitepaper#5-platform-growth-&-treasury) 5\. Platform Growth & Treasury ------------------------------------------------------------------------------------------------------------- Higher trading volume drives platform growth and operational sustainability. As the platform matures, the treasury may allocate resources toward ecosystem initiatives — including discretionary market operations such as liquidity support, grants, and ecosystem incentives — at the sole discretion of the project team. These actions, if implemented, are not guaranteed and do not confer any enforceable rights or financial entitlements to token holders. Staking $O provides access to tiered fee discounts and early feature access, directly reducing trading costs and improving the user experience. Staking does not entitle holders to any payments, dividends, interest, revenue share, or other financial consideration. [​](https://docs.o1.exchange/token/whitepaper#6-roadmap-&-future-governance) 6\. Roadmap & Future Governance --------------------------------------------------------------------------------------------------------------- * **Q2–Q3 2026:** Expanded quant/AI tools, additional chain integrations, and discretionary treasury ecosystem initiatives. * **2026+:** Onchain governance exploration (potential $O voting on select parameters), synthetic assets, deeper institutional tooling. Current governance is team-led with community feedback via Discord/Telegram. Future $O-based governance is under active consideration. [​](https://docs.o1.exchange/token/whitepaper#7-team-&-backers) 7\. Team & Backers ------------------------------------------------------------------------------------- * **Founder:** Jerry Pan * **Director:** Claudio Romildo Pezzia * **Company:** MoonX Foundation, incorporated in Cayman Islands * **Backers:** Coinbase Ventures, a16z, AllianceDAO, The House Fund, Amber Group, and 30+ other select angels and institutional investors. [​](https://docs.o1.exchange/token/whitepaper#8-risks-&-disclaimers) 8\. Risks & Disclaimers ----------------------------------------------------------------------------------------------- * $O is a utility token providing platform benefits only. It does not represent equity, debt, or profit-sharing rights in any legal entity. * Token value is determined by market dynamics and utility. Cryptocurrencies are volatile and may lose value. * Staking involves a 30-day cooldown; tokens are non-transferable during this period. * Token holders are not entitled to receive any payments, dividends, interest, revenue share, or other financial consideration by virtue of holding $O. No guarantees are made regarding future revenue, buybacks, or fee discounts. * o1.exchange is non-custodial; users retain full control of assets. * The platform applies geo-restrictions to users in sanctioned jurisdictions (e.g., OFAC-listed countries). Certain third-party features, such as prediction market routing, may not be available in specific jurisdictions including the United States. Core platform functionality and $O token utility remain available where legally permitted. * This whitepaper is for informational purposes only and does not constitute investment advice, a solicitation to purchase $O, or a prospectus. For the latest updates, visit [o1.exchange](https://o1.exchange/) , follow official channels, and review the token contract upon deployment. _o1.exchange – Onchain Everything Exchange._ [Changelog](https://docs.o1.exchange/api/dex-aggregator/reference/changelog) [MiCA Whitepaper](https://docs.o1.exchange/token/mica-whitepaper) ⌘I --- # Community - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/token/community#content-area) [​](https://docs.o1.exchange/token/community#season-1-airdrop) Season 1 Airdrop ---------------------------------------------------------------------------------- The community allocation rewards authentic o1.exchange traders through a carefully designed airdrop mechanism. While the exact algorithm is not open-sourced or publicly disclosed, it was built to ensure that genuine users are well rewarded for their contributions to the platform. The airdrop allocation for each user is determined by a sophisticated, nonlinear function that factors in: * **S1.1 and S1.2 Points** — Core trading points earned across both phases of Season 1. * **Net Fees Paid** — The actual fees paid to o1.exchange after accounting for each user’s individual cashback rate, ensuring that users who contribute more to platform revenue are proportionally rewarded. * **Referrals** — The number of users referred to o1.exchange, rewarding those who helped grow the community. * **Trading Patterns** — Variety of token mints traded, token holding periods, user retention on the platform, and other behavioral signals used to differentiate real traders from farmers. * **Social Impact** — Contributions and engagement on X (Twitter) and Discord, including Discord Maxi roles and community participation. These inputs are combined in a way that disproportionately rewards consistent, organic platform usage over gameable single-dimension metrics. The goal is to distribute $O to the users who genuinely contributed to o1.exchange’s growth during Season 1. [Disclosure](https://docs.o1.exchange/token/disclosure) [Token Contract Audits](https://docs.o1.exchange/token/audits) ⌘I --- # Token Contract Audits - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/token/audits#content-area) Third-party security audits have been conducted on the $O token contract and related smart contracts to ensure the integrity and safety of the protocol. [​](https://docs.o1.exchange/token/audits#audit-reports) Audit Reports ------------------------------------------------------------------------- Audit Report 1 -------------- View the first token contract audit report. Audit Report 2 -------------- View the second token contract audit report. [Community](https://docs.o1.exchange/token/community) [Community & Socials](https://docs.o1.exchange/community/socials) ⌘I --- # Security and audit - o1 Exchange > Documentation Index > ------------------- > > Fetch the complete documentation index at: [/llms.txt](https://docs.o1.exchange/llms.txt) > > Use this file to discover all available pages before exploring further. [Skip to main content](https://docs.o1.exchange/launchpad/security#content-area) o1 Launchpad is designed around fixed token supply, token-only opening liquidity, permanent Uniswap v4 liquidity, transparent fee accounting, and vesting schedules that cannot be changed after launch. XORS launchpad audit -------------------- Independent o1 Launchpad report dated June 29, 2026. Production contracts -------------------- Inspect the current Base and Robinhood addresses on their chain explorers. [​](https://docs.o1.exchange/launchpad/security#audit-result) Audit result ----------------------------------------------------------------------------- XORS completed an independent o1 Launchpad contract review dated June 29, 2026. The report records seven Low findings and no Critical, High, or Medium findings, with the status of each finding documented in the report. Reviewed areas include launch initialization, governance and fee-recipient trust, referral protection, configuration changes, optional profile authority, opening-price bounds, and opening-window trading behavior. [​](https://docs.o1.exchange/launchpad/security#core-safety-properties) Core safety properties ------------------------------------------------------------------------------------------------- * launch tokens have fixed supply and no mint, pause, upgrade, or balance-seizure authority; * opening liquidity uses launch tokens only, requires no creator quote deposit, and stays in a hook-owned position that cannot be removed; * swap-fee balances are backed by Uniswap v4 claims until withdrawn, and all recipient credits add up to the charged fee; * optional creator authority is limited to supported token profile information; * a pending launch stops if the settings change before it confirms; * vesting schedules and beneficiaries cannot be changed; * private keys and transaction signing remain in the user’s wallet. [​](https://docs.o1.exchange/launchpad/security#governance-boundary) Governance boundary ------------------------------------------------------------------------------------------- Governance can update defaults for future launches only. A completed launch keeps its token supply, pool, fee settings, allocations, vesting schedules, and permanent liquidity. See [Configuration and governance](https://docs.o1.exchange/launchpad/architecture/deployment-governance) for the complete boundary. The current governance owner and platform fee receiver are listed in [Production contracts](https://docs.o1.exchange/launchpad/reference/production-contracts#governance-and-fee-recipient) . [​](https://docs.o1.exchange/launchpad/security#what-users-and-integrators-should-verify) What users and integrators should verify ------------------------------------------------------------------------------------------------------------------------------------- * use the current factory and contract addresses for the selected chain; * confirm the wallet is connected to the intended chain; * review current supply, quote, opening value, creation fee, swap fee, and recipients; * review the chain, contract, amounts, and wallet transaction details before signing. To report a potential issue, follow the [o1 Exchange bug bounty guidance](https://docs.o1.exchange/community/bug-bounty) . [Functions and events](https://docs.o1.exchange/launchpad/reference/events-functions) ⌘I --- # Unknown \# o1 Exchange > Trade with o1 Exchange and build on o1 Launchpad, a single-sided Uniswap v4 token launch protocol for Base and Robinhood Chain. ## Docs - \[Alliance DAO\](https://docs.o1.exchange/AllianceDAO.md): Strategic Partnerships Powering o1.exchange - \[Authentication\](https://docs.o1.exchange/api/dex-aggregator/authentication.md): Request an API key, send it on every request, and stay within the rate limit. - \[POST /execute\](https://docs.o1.exchange/api/dex-aggregator/endpoints/execute.md): One-shot quote + submit. Returns a fresh quote and broadcast-ready calldata in a single call. - \[GET /health\](https://docs.o1.exchange/api/dex-aggregator/endpoints/health.md): Liveness probe for the DEX Aggregator API. - \[POST /quote\](https://docs.o1.exchange/api/dex-aggregator/endpoints/quote.md): Price a swap and receive a routePlan you can hand back to /submit. Read-only, no user address required. - \[POST /submit\](https://docs.o1.exchange/api/dex-aggregator/endpoints/submit.md): Build a broadcast-ready transaction from a previously fetched quoteId. - \[ERC-20 approvals\](https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals.md): How to grant the O1Router permission to spend your tokens — including the gasless EIP-2612 permit flow. - \[Error handling\](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling.md): How to interpret every error the API can return and the recommended retry strategy for each. - \[Integration patterns\](https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns.md): When to use the two-step /quote + /submit flow versus the one-step /execute call. - \[Native ETH\](https://docs.o1.exchange/api/dex-aggregator/guides/native-eth.md): Sell native ETH or receive native ETH directly, without manually wrapping or unwrapping WETH. - \[Quote freshness\](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness.md): How to keep the displayed price live in your UI and gracefully handle expired quotes. - \[Introduction\](https://docs.o1.exchange/api/dex-aggregator/introduction.md): Quote and execute optimal swaps on Base through a single REST endpoint, backed by the O1Router contract and a multi-venue routing engine. - \[Quickstart\](https://docs.o1.exchange/api/dex-aggregator/quickstart.md): Get a quote, build a transaction, and execute your first swap on Base in under five minutes. - \[Changelog\](https://docs.o1.exchange/api/dex-aggregator/reference/changelog.md): Notable API changes for the DEX Aggregator API. - \[Rate limits\](https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits.md): How the per-key rate limit works, what to do when you hit it, and how to request a higher quota. - \[RoutePlan schema\](https://docs.o1.exchange/api/dex-aggregator/reference/route-plan.md): Every field in the routePlan object returned by /quote and /execute. - \[Router contract\](https://docs.o1.exchange/api/dex-aggregator/reference/router-contract.md): The on-chain entrypoint that executes every aggregator swap. - \[Supported DEXes\](https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes.md): Every venue the routing engine can quote and dispatch to on Base. - \[Trading API\](https://docs.o1.exchange/api/trading.md): Execute trades programmatically with MEV protection, Permit2 support, and automatic slippage handling - \[Bug Bounty Program\](https://docs.o1.exchange/community/bug-bounty.md): Help secure o1.exchange and earn rewards for finding vulnerabilities - \[Platform Metrics\](https://docs.o1.exchange/community/metrics.md) - \[Community & Socials\](https://docs.o1.exchange/community/socials.md) - \[Explore Tokens\](https://docs.o1.exchange/features/explore-tokens.md) - \[Onramp Fiat to Crypto\](https://docs.o1.exchange/features/onramp.md) - \[Portfolio\](https://docs.o1.exchange/features/portfolio.md): Comprehensive portfolio tracking and analytics - \[Referrals & Rewards\](https://docs.o1.exchange/features/referrals-rewards.md): Earn rewards through referrals and trading activities - \[Trading\](https://docs.o1.exchange/features/trading.md): Advanced trading features and order types - \[Wallets\](https://docs.o1.exchange/features/wallets.md): Secure wallet integration and management - \[Trading Fees\](https://docs.o1.exchange/getting-started/fees.md): The more you trade, the more you earn back! - \[Points System Season 1.1\](https://docs.o1.exchange/getting-started/points-system-season1.md): Points system rewards active traders and contributors to the o1.exchange community - \[Points System Season 1.2\](https://docs.o1.exchange/getting-started/points-system-season2.md): Competitive weekly leaderboard mechanism distributing predetermined point pools based on trading volume - \[Referral System\](https://docs.o1.exchange/getting-started/referral-system.md): Earn rewards through our 4-tier referral program - \[Trading Season 1: Early Beta\](https://docs.o1.exchange/getting-started/rewards/season-1.md): OG Trader rewards during early Beta period - \[Trading Season 2: Base\](https://docs.o1.exchange/getting-started/rewards/season-2.md): Base Season rewards and point structure - \[Zora Trading Contest\](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest.md): Eight-week trading contest for Zora Creator and Content Coins - \[Zora Trading Contest Season 2\](https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2.md): Season 2 for Zora Creator and Content Coins - \[Sign Up for o1.exchange\](https://docs.o1.exchange/getting-started/signup.md): Quick onboarding - \[o1.exchange - Democratizing Alpha for Traders\](https://docs.o1.exchange/introduction.md): The Ultimate Trading Terminal for DeFi - \[Smart contract architecture\](https://docs.o1.exchange/launchpad/architecture/contracts.md): How the factory, launch hook, fee escrow, vesting vault, announcement registry, and launch tokens work together. - \[Configuration and governance\](https://docs.o1.exchange/launchpad/architecture/deployment-governance.md): What o1 governance can change for future launches and which properties remain permanent after a token launches. - \[Interface and data flow\](https://docs.o1.exchange/launchpad/architecture/frontend-indexer.md): How the o1 Launchpad home, create, token, and profile pages connect wallet actions with live and indexed chain data. - \[Allocations and vesting\](https://docs.o1.exchange/launchpad/create/allocations-vesting.md): Distribute tokens at launch through immediate allocations or fixed staircase vesting without adding control to the token. - \[Token creation\](https://docs.o1.exchange/launchpad/create/token-creation.md): Create a fixed-supply Base B20 or Robinhood ERC-20 token, publish its profile, distribute allocations, and open permanent liquidity. - \[How it works\](https://docs.o1.exchange/launchpad/how-it-works.md): The complete o1 Launchpad lifecycle from setup and token creation to trading, fee claims, announcements, and vesting claims. - \[Data and AI access\](https://docs.o1.exchange/launchpad/integration/data-ai.md): Public documentation, machine-readable launchpad configuration, onchain data, and safe wallet-based agent workflows. - \[Direct contract integration\](https://docs.o1.exchange/launchpad/integration/direct.md): Read current launch configuration, build safe launch transactions, trade through Uniswap v4, and consume canonical launch events. - \[Introduction\](https://docs.o1.exchange/launchpad/introduction.md): Create a fixed-supply token with a live Uniswap v4 market, permanent liquidity, flexible allocations, vesting, and built-in fee sharing. - \[Plan your launch\](https://docs.o1.exchange/launchpad/launch-planning.md): Choose the token setup, distribution, vesting, profile control, announcements, and optional airdrop claim tools that fit your launch. - \[Functions and events\](https://docs.o1.exchange/launchpad/reference/events-functions.md): Public functions, important reads, and events for the current o1 Launchpad contracts. - \[Limits and validation\](https://docs.o1.exchange/launchpad/reference/limits.md): Current launch defaults, contract hard caps, form limits, allocation rules, vesting rules, fee limits, and quote requirements. - \[Live configuration\](https://docs.o1.exchange/launchpad/reference/live-configuration.md): Current Base and Robinhood launch settings for supply, opening value, liquidity, creation fees, swap fees, and fee recipients. - \[Production contracts\](https://docs.o1.exchange/launchpad/reference/production-contracts.md): Current active o1 Launchpad, Uniswap v4, quote token, and Base B20 addresses for Base mainnet and Robinhood Chain. - \[Security and audit\](https://docs.o1.exchange/launchpad/security.md): Launchpad audit report, reviewed security areas, production safety properties, governance boundaries, and verification guidance. - \[Fee and vesting claims\](https://docs.o1.exchange/launchpad/trading/claims.md): View and claim creator, platform, referral, and vested token balances. - \[Fees, anti-snipe, and referrals\](https://docs.o1.exchange/launchpad/trading/fees-referrals.md): Current creation fees, swap fees, the 16-second anti-snipe period, referral links, attribution rules, and trade comments. - \[Single-sided liquidity\](https://docs.o1.exchange/launchpad/trading/liquidity.md): How the opening value, token-only liquidity, changing pool inventory, and permanent Uniswap v4 market work. - \[Token Contract Audits\](https://docs.o1.exchange/token/audits.md): Security audit reports for the $O token smart contracts - \[Community\](https://docs.o1.exchange/token/community.md): How o1.exchange rewards authentic traders through the Season 1 airdrop - \[Disclosure\](https://docs.o1.exchange/token/disclosure.md): o1.exchange / $O Token – Disclosure - \[MiCA Whitepaper\](https://docs.o1.exchange/token/mica-whitepaper.md): Markets in Crypto-Assets (MiCA) Whitepaper for $O Token - \[Whitepaper\](https://docs.o1.exchange/token/whitepaper.md): $O – The Utility Token of the Onchain Everything Exchange ## OpenAPI Specs - \[openapi\](https://docs.o1.exchange/openapi.yaml) --- # Unknown ```json { "schemaVersion": 1, "project": "o1 Launchpad", "environment": "production", "latestProductionOnly": true, "lastUpdatedAt": "2026-07-13", "notes": [ "Mutable values are a dated snapshot. Read the active factory before building a transaction.", "Native currency uses the zero address." ], "governance": { "owner": "0x5519a8Cc7211F483e19ff8d50A3B0c892701044D", "platformTreasury": "0x1cAa1962428382106Eb3f29B9719bdF797621C90" }, "hardCaps": { "minSupplyRaw": "1000000000000000000000000", "maxSupplyRaw": "1000000000000000000000000000000", "maxAllocations": 128, "maxVestedAllocations": 64, "minVestingDurationSeconds": 86400, "maxVestStepsPerBeneficiary": 24, "maxTotalVestSteps": 128, "maxBands": 10, "maxTickSpacing": 16384, "maxBaseFeeBps": 1000, "maxTotalFeeBps": 9900 }, "currentDefaults": { "launchSupplyRaw": "1000000000000000000000000000", "launchSupplyTokens": "1000000000", "tokenDecimals": 18, "tickSpacing": 200, "baseFeeBps": 100, "creatorShareOfBaseFeeBps": 5000, "platformShareOfBaseFeeBps": 3000, "referrerShareOfBaseFeeBps": 2000, "antiSnipeStartTotalBps": 9900, "antiSnipeWindowSeconds": 16, "feeCurrencyMode": "quote", "feeClock": "block.timestamp", "bands": [ { "lowerOffset": 0, "upperOffset": 8388607, "upperOffsetMeaning": "MAXIMUM_USABLE_BOUNDARY", "bps": 10000 } ] }, "chains": [ { "name": "Base Mainnet", "chainId": 8453, "tokenMode": "b20", "explorer": "https://basescan.org", "contracts": { "factory": "0xa52ad458cE0282a971ecC71C051A32f28946bb9F", "hook": "0x985C14BAa2a18316ffdA0aeFB3a632fAdfcA2AcC", "feeEscrow": "0xa2cBD9065cec93c443CAFb0837A62800EE7C4A84", "vestingVault": "0x3beeA54dB87A632A5FAF20dB6765D3af94c81b31", "announcementRegistry": "0xABDcBE060724b9BEf5A2daad017d9eA3Ed72DE28" }, "b20": { "factory": "0xB20f000000000000000000000000000000000000", "activationRegistry": "0x8453000000000000000000000000000000000001", "policyRegistry": "0x8453000000000000000000000000000000000002", "assetFeature": "keccak256(base.b20_asset)" }, "uniswapV4": { "poolManager": "0x498581fF718922c3f8e6A244956aF099B2652b2b", "quoter": "0x0d5e0F971ED27FBfF6c2837bf31316121532048D", "stateView": "0xA3c0c9b65baD0b08107Aa264b0f3dB444b867A71", "universalRouter": "0x6fF5693b99212Da76ad316178A184AB56D299b43", "permit2": "0x000000000022D473030F116dDEE9F6B43aC78BA3" }, "quotes": [ { "symbol": "ETH", "address": "0x0000000000000000000000000000000000000000", "decimals": 18, "startTickToken0Frame": -199200, "creationFeeRaw": "1000000000000000", "creationFeeDisplay": "0.001 ETH" }, { "symbol": "USDC", "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "decimals": 6, "startTickToken0Frame": -400600, "creationFeeRaw": "2000000", "creationFeeDisplay": "2 USDC" } ] }, { "name": "Robinhood Chain", "chainId": 4663, "tokenMode": "erc20", "rpc": "https://rpc.mainnet.chain.robinhood.com", "explorer": "https://robinhoodchain.blockscout.com", "contracts": { "factory": "0x411F21283D3E492BC395027329e08f9F4F560Ba5", "hook": "0x441F773B3bb1Ed4c6457D0528624112e43C02acc", "feeEscrow": "0x32f7a9A05bD62487D085Ad494e14Ec42543e19d2", "launchTokenDeployer": "0x7dA2f15e0bbc564fbde55a4E23147f490061BbAb", "vestingVault": "0x6bdAAe32F36da5896533fdAD5b7A72a2541063BE", "announcementRegistry": "0x163f3A09278918bDdaf74cF2a4178F6369a9a3c1" }, "uniswapV4": { "poolManager": "0x8366a39CC670B4001A1121B8F6A443A643e40951", "quoter": "0x8dc178efb8111bb0973dd9d722ebeff267c98f94", "stateView": "0xf3334192d15450cdd385c8b70e03f9a6bd9e673b", "universalRouter": "0x8876789976decbfcbbbe364623c63652db8c0904", "permit2": "0x000000000022D473030F116dDEE9F6B43aC78BA3" }, "quotes": [ { "symbol": "ETH", "address": "0x0000000000000000000000000000000000000000", "decimals": 18, "startTickToken0Frame": -199200, "creationFeeRaw": "1000000000000000", "creationFeeDisplay": "0.001 ETH" }, { "symbol": "USDG", "address": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168", "decimals": 6, "startTickToken0Frame": -400600, "creationFeeRaw": "2000000", "creationFeeDisplay": "2 USDG" } ] } ] } ``` --- # Unknown \# Alliance DAO Source: https://docs.o1.exchange/AllianceDAO Strategic Partnerships Powering o1.exchange ## Elite Backing First investor in [pump.fun](https://pump.fun/) , [Moonshot](https://moonshot.money/) , [Believe App](https://believe.app//) We're proud to announce that o1.exchange is backed by these elite investors in the blockchain space and many more, bringing institutional credibility and strategic resources to our platform. These strategic partnerships empower o1.exchange to push the boundaries of DeFi trading technology. We're rapidly developing cutting-edge solutions to deliver a divine trading experience that sets new standards in the industry. # Authentication Source: https://docs.o1.exchange/api/dex-aggregator/authentication Request an API key, send it on every request, and stay within the rate limit. Every endpoint except \[\`GET /health\`\](/api/dex-aggregator/endpoints/health) requires an API key. ## How to get an API key API keys are currently issued directly by the o1 team. Self-serve key creation is on the roadmap; for now, the flow is: Contact the o1 team through your usual partnership or support channel and request a DEX Aggregator API key. Include a short description of your integration (app name, expected volume, environment) so we can size your rate limit correctly. The team provisions a key scoped to your integration and shares it securely. Each key is independent, so you can request additional keys for staging, dev, or per-environment isolation. Treat your API key like a password. Keep it server-side, never commit it to source control, and never expose it in browser-side code. Need to rotate or revoke a key? Reach out to the same channel. The team can create a replacement and revoke the old one with a short overlap window so you can deploy without downtime. \## Sending the key Pass your key on every request via the \`x-api-key\` HTTP header. \`\`\`bash cURL theme={null} theme={null} curl -X POST https://quiet-bloodhound-531.convex.site/quote \\ -H "x-api-key: o1\_your\_key\_here" \\ -H "content-type: application/json" \\ -d '{ "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100 }' \`\`\` \`\`\`ts TypeScript theme={null} theme={null} await fetch(\`${API\_URL}/quote\`, { method: "POST", headers: { "x-api-key": process.env.O1\_API\_KEY!, "content-type": "application/json", }, body: JSON.stringify({ /\* ... \*/ }), }); \`\`\` \`\`\`python Python theme={null} theme={null} import os, requests requests.post( f"{API\_URL}/quote", headers={ "x-api-key": os.environ\["O1\_API\_KEY"\], "content-type": "application/json", }, json={ ... }, ) \`\`\` Never expose your API key in client-side JavaScript. Proxy through your own server. If your key has leaked, revoke it immediately and rotate. \## Rate limits The default rate limit is \*\*120 requests per minute per API key\*\*. Higher tiers are available on request — contact the o1 team if you expect sustained traffic above that. The window is sliding (60 seconds), enforced server-side. When you exceed it you get a \`429\`: \`\`\`json theme={null} theme={null} { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } \`\`\` See \[Rate limits\](/api/dex-aggregator/reference/rate-limits) for the recommended retry strategy. ## Error responses Missing or invalid \`x-api-key\`. \`\`\`json theme={null} theme={null} { "error": "unauthorized" } \`\`\` You've exceeded the per-minute quota. Back off for at least one second before retrying. \`\`\`json theme={null} theme={null} { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } \`\`\` \## Best practices Use a distinct key per app, environment, or backend service. Makes revocation painless when something rotates. Rotate keys quarterly or whenever an engineer with access leaves the team. Old keys can stay live for a short overlap window during the migration. Tag your outbound requests with a request ID so you can correlate API errors with your server logs. On \`429\`, back off and retry with jitter. Don't hammer. \# POST /execute Source: https://docs.o1.exchange/api/dex-aggregator/endpoints/execute openapi.yaml POST /execute One-shot quote + submit. Returns a fresh quote and broadcast-ready calldata in a single call. \`POST /execute\` is the one-step convenience endpoint. It runs \`/quote\` and \`/submit\` server-side and returns both the route plan (so you can display it) and the calldata (so you can broadcast). Use this when: \* You don't need a separate price preview step (one-click swap, server-side bot). \* You want to avoid the \`quoteId\` round trip. \* You always submit immediately after quoting. For UIs that show a quote, let the user think, then submit, prefer the \[\`/quote\` + \`/submit\`\](/api/dex-aggregator/guides/integration-patterns) two-step flow so the user sees the final price before signing. \* \*\*Authentication:\*\* \`x-api-key\` header required. \* \*\*\`user\` is required\*\* here (unlike \`/quote\`) because the response includes signed-ready calldata. \## Request \`\`\`http theme={null} theme={null} POST {API\_URL}/execute Content-Type: application/json x-api-key: \`\`\` \`\`\`json theme={null} theme={null} { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100, "user": "0xYourWalletAddress", "useNativeIn": false, "unwrapNativeOut": true, "feeBps": 30 } \`\`\` \### Body parameters \`/execute\` accepts the union of \`/quote\` and \`/submit\` parameters. | Field | Type | Required | Description | | --------------------- | ---------------- | -------- | -------------------------------------------------- | | \`chainId\` | integer | yes | \`8453\` for Base. | | \`tokenIn\` | address | yes | Token to sell. Native sentinel allowed. | | \`tokenOut\` | address | yes | Token to buy. Native sentinel allowed. | | \`amountIn\` | string | yes | Amount in wei as a decimal string. | | \`slippageBps\` | integer | yes | Slippage tolerance in bps (\`0..10000\`). | | \`user\` | address | yes | Wallet that will sign the tx. | | \`useNativeIn\` | boolean | no | Override native-in detection. | | \`unwrapNativeOut\` | boolean | no | Receive native ETH instead of WETH. | | \`feeBps\` | integer | no | Integrator fee in bps. | | \`maxHops\` | integer | no | Default \`3\`. | | \`splitEnabled\` | boolean | no | Default \`true\`. | | \`enforcePoolDisjoint\` | boolean | no | Default \`false\`. | | \`allowedDexes\` | array of \`DexId\` | no | Restrict routing to specific venues. | | \`permit\` | object | no | EIP-2612 permit payload (same shape as \`/submit\`). | See \[\`POST /quote\`\](/api/dex-aggregator/endpoints/quote) and \[\`POST /submit\`\](/api/dex-aggregator/endpoints/submit) for full descriptions of each field. ## Response \`\`\`json theme={null} theme={null} { "quoteId": "a1b2c3d4e5f6...", "chainId": 8453, "to": "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3", "data": "0x...", "value": "0", "expiresAt": 1712180000000, "routePlan": { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "expectedAmountOut": "484446072048780734", "minAmountOut": "479601611328292926", "slippageBps": 100, "blockNumber": 44266656, "routes": \[ /\* ... \*/ \] } } \`\`\` \`\`\`json theme={null} theme={null} { "error": "no routes for pair" } \`\`\` \`\`\`json theme={null} theme={null} { "error": "unauthorized" } \`\`\` \`\`\`json theme={null} theme={null} { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } \`\`\` \### Response fields A union of the \`/quote\` response (so you can display the price) and \`/submit\` response (so you can broadcast). | Field | Type | Description | | ----------- | ------- | ------------------------------------------------------------------------------------- | | \`quoteId\` | string | The freshly issued quote ID. Useful for log correlation. | | \`chainId\` | integer | \`8453\`. | | \`to\` | address | Always the \`O1Router\`. | | \`data\` | hex | \`swapExactIn(...)\` calldata. | | \`value\` | string | \`msg.value\` in wei. | | \`expiresAt\` | integer | Unix milliseconds at which the cached quote drops. | | \`routePlan\` | object | Full route plan. See \[RoutePlan reference\](/api/dex-aggregator/reference/route-plan). | ## Examples \`\`\`ts TypeScript theme={null} theme={null} const exec = await fetch(\`${API\_URL}/execute\`, { method: "POST", headers: { "x-api-key": process.env.O1\_API\_KEY!, "content-type": "application/json", }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", slippageBps: 100, user: walletAddress, }), }).then((r) => r.json()); const txHash = await walletClient.sendTransaction({ to: exec.to as \`0x${string}\`, data: exec.data as \`0x${string}\`, value: BigInt(exec.value), }); \`\`\` \`\`\`bash cURL theme={null} theme={null} curl -X POST https://quiet-bloodhound-531.convex.site/execute \\ -H "x-api-key: $O1\_API\_KEY" \\ -H "content-type: application/json" \\ -d '{ "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100, "user": "0xYourWalletAddress" }' \`\`\` \`/execute\` always returns a fresh quote. There's no risk of \`404 expired\` here because the quote is consumed immediately on the server side. \# GET /health Source: https://docs.o1.exchange/api/dex-aggregator/endpoints/health openapi.yaml GET /health Liveness probe for the DEX Aggregator API. Returns \`{ "ok": true }\` when the service is reachable. No authentication required. This endpoint is \*\*public\*\* — it does not require an \`x-api-key\` header. \## Request \`\`\`http theme={null} theme={null} GET {API\_URL}/health \`\`\` ## Response \`\`\`json theme={null} theme={null} { "ok": true } \`\`\` ## When to use this Schedule periodic health checks from your monitoring system. Treat anything other than \`200 { "ok": true }\` as down. Use as the first call in an integration test to confirm DNS, TLS, and API key plumbing without spending quota on a real quote. \`\`\`bash theme={null} theme={null} curl https://quiet-bloodhound-531.convex.site/health \`\`\` # POST /quote Source: https://docs.o1.exchange/api/dex-aggregator/endpoints/quote openapi.yaml POST /quote Price a swap and receive a routePlan you can hand back to /submit. Read-only, no user address required. Use \`POST /quote\` to fetch a price. The response includes a stable \`quoteId\` you echo on \`/submit\` when the user is ready to swap. \* \*\*Authentication:\*\* \`x-api-key\` header required. \* \*\*Rate limit:\*\* 120 req/min per key (default). See \[Rate limits\](/api/dex-aggregator/reference/rate-limits). \## Request \`\`\`http theme={null} theme={null} POST {API\_URL}/quote Content-Type: application/json x-api-key: \`\`\` \`\`\`json theme={null} theme={null} { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100, "feeBps": 30, "maxHops": 3, "splitEnabled": true } \`\`\` \### Body parameters | Field | Type | Required | Description | | --------------------- | ---------------- | -------- | ------------------------------------------------------------------------------------------------------------- | | \`chainId\` | integer | yes | EVM chain ID. Currently only \`8453\` (Base) is supported. | | \`tokenIn\` | address | yes | Token to sell. Use \`0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\` or the zero address for native ETH. | | \`tokenOut\` | address | yes | Token to buy. Same native sentinel rules apply. | | \`amountIn\` | string | yes | Amount in base units (wei) as a decimal string. Must be \`> 0\`. | | \`slippageBps\` | integer | yes | Slippage tolerance in basis points (\`100\` = 1%). Range \`0..10000\`. | | \`feeBps\` | integer | no | Integrator fee in basis points, taken out of \`expectedAmountOut\`. Range \`0..10000\`. | | \`maxHops\` | integer | no | Maximum hops per route. Default \`3\`. | | \`splitEnabled\` | boolean | no | Allow the optimizer to split the trade across multiple routes when it improves output. Default \`true\`. | | \`enforcePoolDisjoint\` | boolean | no | When splitting, require routes to use disjoint pool sets. Off by default. | | \`allowedDexes\` | array of \`DexId\` | no | Restrict routing to a subset of venues. See \[Supported DEXes\](/api/dex-aggregator/reference/supported-dexes). | | \`taker\` | address | no | Optional taker hint. Doesn't affect pricing for most callers. | | \`timeBudgetMs\` | integer | no | Per-request override of the optimizer wall-clock budget. Range \`50..10000\`. | ## Response \`\`\`json theme={null} theme={null} { "quoteId": "a1b2c3d4e5f6...", "expiresAt": 1712180000000, "routePlan": { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "expectedAmountOut": "484446072048780734", "minAmountOut": "479601611328292926", "slippageBps": 100, "feeBps": 30, "blockNumber": 44266656, "gasEstimate": { "gasUnits": 300000 }, "feeBreakdown": { "protocolFeeAmount": "1457804507741243911", "integratorFeeAmount": "0" }, "routes": \[ { "amountIn": "1000000000", "legs": \[ { "dex": "UNIV3", "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "minOut": "0", "poolId": "0xd0b5...f224", "data": { "kind": "v3\_direct", "pool": "0xd0b5...f224" } } \] } \], "metadata": { "candidatePaths": 16, "selectedPaths": 1, "connectorsConsidered": \[ "0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf", "0x9401e5e6564db35c0f86573a9828df69fc778631" \] } } } \`\`\` \`\`\`json theme={null} theme={null} { "error": "amountIn must be > 0" } \`\`\` Other common 400 messages: \`chainId required\`, \`slippageBps out of range\`, \`no routes for pair\`. \`\`\`json theme={null} theme={null} { "error": "unauthorized" } \`\`\` \`\`\`json theme={null} theme={null} { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } \`\`\` \### Response fields | Field | Type | Description | | ----------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | \`quoteId\` | string | Stable identifier for this quote. Hand to \`/submit\`. | | \`expiresAt\` | integer | Unix milliseconds at which the cached quote drops. | | \`routePlan\` | object | Full plan including pricing, gas estimate, and per-leg detail. See the \[RoutePlan reference\](/api/dex-aggregator/reference/route-plan) for every field. | The fields you'll most commonly surface to users: \* \`routePlan.expectedAmountOut\` — the price you display \* \`routePlan.minAmountOut\` — the worst case after slippage \* \`routePlan.routes\[\].legs\[\].dex\` — list of venues used (e.g. \`UNIV3 → AERODROME\_CL\`) \* \`routePlan.feeBps\` — protocol + integrator fee in bps \* \`routePlan.gasEstimate.gasUnits\` — estimated gas for the swap ## Caching and freshness Quotes are cached server-side under their \`quoteId\` for roughly 10 seconds. After \`expiresAt\`, calling \`/submit\` returns \`404 quote not found or expired\`. For UIs that show a live price, the recommended pattern is to re-fetch the quote every 5 to 8 seconds while the swap modal is open. See \[Quote freshness\](/api/dex-aggregator/guides/quote-freshness). ## Examples \`\`\`ts TypeScript theme={null} theme={null} const quote = await fetch(\`${API\_URL}/quote\`, { method: "POST", headers: { "x-api-key": process.env.O1\_API\_KEY!, "content-type": "application/json", }, body: JSON.stringify({ chainId: 8453, tokenIn: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", tokenOut: "0x4200000000000000000000000000000000000006", amountIn: "1000000000", slippageBps: 100, }), }).then((r) => r.json()); \`\`\` \`\`\`bash cURL theme={null} theme={null} curl -X POST https://quiet-bloodhound-531.convex.site/quote \\ -H "x-api-key: $O1\_API\_KEY" \\ -H "content-type: application/json" \\ -d '{ "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "slippageBps": 100 }' \`\`\` Pair this with \[\`POST /submit\`\](/api/dex-aggregator/endpoints/submit) for the standard two-step flow, or use \[\`POST /execute\`\](/api/dex-aggregator/endpoints/execute) when you don't need a price preview step. \# POST /submit Source: https://docs.o1.exchange/api/dex-aggregator/endpoints/submit openapi.yaml POST /submit Build a broadcast-ready transaction from a previously fetched quoteId. Use \`POST /submit\` to convert a \`quoteId\` from \[\`POST /quote\`\](/api/dex-aggregator/endpoints/quote) into the calldata your wallet broadcasts. \* \*\*Authentication:\*\* \`x-api-key\` header required. \* \*\*Quote TTL:\*\* quotes expire roughly 10 seconds after \`/quote\`. Submitting an expired \`quoteId\` returns \`404\`. \## Request \`\`\`http theme={null} theme={null} POST {API\_URL}/submit Content-Type: application/json x-api-key: \`\`\` \`\`\`json theme={null} theme={null} { "quoteId": "a1b2c3d4e5f6...", "user": "0xYourWalletAddress", "useNativeIn": false, "unwrapNativeOut": true } \`\`\` \### Body parameters | Field | Type | Required | Description | | ------------------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------------------------- | | \`quoteId\` | string | yes | The \`quoteId\` from a recent \`/quote\` response. | | \`user\` | address | yes | The wallet that will sign and broadcast the transaction. | | \`useNativeIn\` | boolean | no | Override \`routePlan.nativeIn\`. Set \`true\` to send native ETH; the router wraps \`msg.value\` to WETH before dispatching legs. | | \`unwrapNativeOut\` | boolean | no | Override \`routePlan.nativeOut\`. Set \`true\` to receive native ETH instead of WETH. | | \`permit\` | object | no | Optional EIP-2612 permit payload for one-tx approve+swap. See \[\`permit\` payload\](#permit-payload) below. | | \`gasPriceWei\` | string | no | Hint for legacy gas pricing (\`gasPrice\`). | | \`maxFeePerGasWei\` | string | no | Hint for EIP-1559 \`maxFeePerGas\`. | | \`maxPriorityFeePerGasWei\` | string | no | Hint for EIP-1559 \`maxPriorityFeePerGas\`. | The gas price fields are hints only. They are not currently echoed back into the calldata; your wallet client should set its own gas pricing when broadcasting. \#### \`permit\` payload When you have a fresh EIP-2612 permit signature for \`tokenIn\`, include it to skip the standard \`approve\` transaction. \`\`\`json theme={null} theme={null} { "permit": { "value": "1000000000", "deadline": 1712180600, "v": 27, "r": "0x...", "s": "0x..." } } \`\`\` | Field | Type | Notes | | --------------- | ---------- | ------------------------------------------------------------ | | \`value\` | string | Amount permitted in token base units. Must be \`>= amountIn\`. | | \`deadline\` | integer | Unix seconds at which the permit expires. | | \`v\` / \`r\` / \`s\` | components | EIP-2612 signature pieces. | The router consumes the permit inside the same transaction; if it fails, the whole swap reverts. See \[ERC-20 approvals\](/api/dex-aggregator/guides/erc20-approvals) for the full pattern. ## Response \`\`\`json theme={null} theme={null} { "quoteId": "a1b2c3d4e5f6...", "chainId": 8453, "to": "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3", "data": "0x...", "value": "0" } \`\`\` \`\`\`json theme={null} theme={null} { "error": "quote not found or expired" } \`\`\` The \`quoteId\` either never existed or has aged out of the cache. Re-fetch via \`/quote\` and retry. \`\`\`json theme={null} theme={null} { "error": "user is required" } \`\`\` Other common 400 messages: \`invalid user address\`, \`permit signature invalid\`. \`\`\`json theme={null} theme={null} { "error": "unauthorized" } \`\`\` \`\`\`json theme={null} theme={null} { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } \`\`\` \### Response fields | Field | Type | Description | | --------- | ------- | --------------------------------------------------------------------------------------------------------- | | \`quoteId\` | string | Echo of the \`quoteId\` you submitted. | | \`chainId\` | integer | Always \`8453\` while only Base is supported. | | \`to\` | address | Always the \`O1Router\` address. See \[Router contract\](/api/dex-aggregator/reference/router-contract). | | \`data\` | hex | Encoded \`swapExactIn(...)\` calldata. | | \`value\` | string | \`msg.value\` to send with the transaction in wei. Non-zero only for native-in swaps (\`useNativeIn: true\`). | ## Sending the transaction The response is intentionally minimal so any signer works. Example with \`viem\`: \`\`\`ts theme={null} theme={null} const txHash = await walletClient.sendTransaction({ to: submit.to as \`0x${string}\`, data: submit.data as \`0x${string}\`, value: BigInt(submit.value), }); \`\`\` ethers v6: \`\`\`ts theme={null} theme={null} const txResponse = await wallet.sendTransaction({ to: submit.to, data: submit.data, value: submit.value, }); \`\`\` Do not modify \`data\` before sending. The router validates the route plan against the submitted \`quoteId\`; any tamper attempt will revert. \## Native ETH and unwrap behavior | Want to | Set on \`/quote\` | Set on \`/submit\` | | ------------------ | ------------------------------------------------------ | ----------------------- | | Sell native ETH | \`tokenIn\` = native sentinel (\`0xEeee...EEeE\` or \`0x0\`) | \`useNativeIn: true\` | | Receive native ETH | \`tokenOut\` = native sentinel | \`unwrapNativeOut: true\` | When you sell native ETH, the response \`value\` carries \`amountIn\` and the router wraps to WETH internally. See the \[Native ETH guide\](/api/dex-aggregator/guides/native-eth) for the full matrix. ## Common pitfalls Quote expired. Re-fetch via \`/quote\` with the same parameters and resubmit. Don't cache \`quoteId\` longer than \`expiresAt\` minus a small safety window. You forgot \`useNativeIn: true\`. The router can't infer it from \`tokenIn\` alone in \`/submit\` because the API does not assume the user has changed their mind since \`/quote\`. Pool state moved between \`/quote\` and broadcast. Increase \`slippageBps\` slightly or re-quote and resend. The user hasn't approved the router for \`tokenIn\`. Approve \`O1Router\` for at least \`amountIn\`, or use a \`permit\` payload. See \[ERC-20 approvals\](/api/dex-aggregator/guides/erc20-approvals). \# ERC-20 approvals Source: https://docs.o1.exchange/api/dex-aggregator/guides/erc20-approvals How to grant the O1Router permission to spend your tokens — including the gasless EIP-2612 permit flow. Before the router can pull \`tokenIn\` from a user, the user must approve the router as a spender. This is standard ERC-20 behavior. The aggregator supports two patterns: 1. \*\*Standard \`approve\` + swap\*\* — two transactions, but works for any ERC-20. 2. \*\*EIP-2612 permit + swap\*\* — one transaction, but only works for tokens that implement the permit extension. No approval is needed when \`tokenIn\` is native ETH (using the sentinel \`0xEeee...EEeE\` or \`0x0\`). In that case, the router pulls value via \`msg.value\`. See \[Native ETH\](/api/dex-aggregator/guides/native-eth). \## Pattern 1: standard \`approve\` This is the universal fallback. Two transactions per first swap, then no approvals on subsequent swaps if the previous allowance is large enough. \`\`\`ts theme={null} theme={null} import { erc20Abi } from "viem"; const ROUTER = "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3"; // 1. Read current allowance const allowance = await publicClient.readContract({ address: tokenIn, abi: erc20Abi, functionName: "allowance", args: \[walletAddress, ROUTER\], }); // 2. Approve if insufficient if (allowance < BigInt(amountIn)) { const approveHash = await walletClient.writeContract({ address: tokenIn, abi: erc20Abi, functionName: "approve", args: \[ROUTER, BigInt(amountIn)\], }); await publicClient.waitForTransactionReceipt({ hash: approveHash }); } // 3. Now safe to call /submit and broadcast the swap \`\`\` ### Approve amount strategies Approve exactly \`amountIn\`. Re-approves on every swap. Safest from a security standpoint — the router only ever has rights to the exact amount being swapped. \`\`\`ts theme={null} theme={null} args: \[ROUTER, BigInt(amountIn)\], \`\`\` Approve \`2^256 - 1\`. User signs an approve once and never sees an approve dialog again for that token. \`\`\`ts theme={null} theme={null} const MAX\_UINT256 = (1n << 256n) - 1n; args: \[ROUTER, MAX\_UINT256\], \`\`\` Max allowance means the router has perpetual rights to spend that token. Any future bug or compromise affects every wallet that approved max. Most consumer swap UIs do this; high-value flows usually don't. Approve \`amountIn × 1.1\` or some user-configured tier (e.g. "approve enough for 10 swaps"). Compromise between friction and risk. \## Pattern 2: EIP-2612 permit (one transaction) For tokens that implement EIP-2612 (USDC and a growing number of others on Base), the user can sign an off-chain permit that the router consumes inside the same transaction as the swap. Net effect: \*\*one signature, one transaction, no \`approve\` step\*\*. ### How it works Read the token's \`name\`, \`EIP712\_VERSION\`, and the user's \`nonces(user)\`. Construct the EIP-712 domain and message. Use \`signTypedData\` (eth\\\_signTypedData\\\_v4). No gas, no on-chain state change. Pass \`{ value, deadline, v, r, s }\` in the \`permit\` field on \`POST /submit\`. \`O1Router.swapExactIn(...)\` calls \`IERC20Permit(token).permit(...)\` then pulls funds, all in one tx. \### Example \`\`\`ts theme={null} theme={null} import { signTypedData } from "viem/actions"; const PERMIT\_TYPES = { Permit: \[ { name: "owner", type: "address" }, { name: "spender", type: "address" }, { name: "value", type: "uint256" }, { name: "nonce", type: "uint256" }, { name: "deadline", type: "uint256" }, \], }; async function buildPermit(token: \`0x${string}\`, owner: \`0x${string}\`, value: bigint) { const \[name, nonce, chainId\] = await Promise.all(\[ publicClient.readContract({ address: token, abi: erc20PermitAbi, functionName: "name" }), publicClient.readContract({ address: token, abi: erc20PermitAbi, functionName: "nonces", args: \[owner\] }), publicClient.getChainId(), \]); const deadline = Math.floor(Date.now() / 1000) + 600; // 10 minutes const signature = await walletClient.signTypedData({ account: owner, domain: { name, version: "1", chainId, verifyingContract: token }, types: PERMIT\_TYPES, primaryType: "Permit", message: { owner, spender: ROUTER, value, nonce, deadline: BigInt(deadline), }, }); // Split into v / r / s const r = \`0x${signature.slice(2, 66)}\` as const; const s = \`0x${signature.slice(66, 130)}\` as const; const v = parseInt(signature.slice(130, 132), 16); return { value: value.toString(), deadline, v, r, s }; } \`\`\` Then on \`/submit\`: \`\`\`ts theme={null} theme={null} const permit = await buildPermit(tokenIn, walletAddress, BigInt(amountIn)); const submit = await fetch(\`${API\_URL}/submit\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: quote.quoteId, user: walletAddress, permit, }), }).then((r) => r.json()); const txHash = await walletClient.sendTransaction({ to: submit.to as \`0x${string}\`, data: submit.data as \`0x${string}\`, value: BigInt(submit.value), }); \`\`\` Cache \`name\` and the EIP-712 domain per token to avoid an RPC call on every swap. Don't cache \`nonce\` though; it changes after every permit consumption. \## Detecting permit support Not every token implements EIP-2612. The cheapest way to detect support is to read \`nonces(user)\` on the token and treat a successful read as a positive signal. Tokens without permit will revert. \`\`\`ts theme={null} theme={null} async function supportsPermit(token: \`0x${string}\`, user: \`0x${string}\`): Promise { try { await publicClient.readContract({ address: token, abi: \[{ name: "nonces", type: "function", stateMutability: "view", inputs: \[{ name: "owner", type: "address" }\], outputs: \[{ type: "uint256" }\] }\], functionName: "nonces", args: \[user\], }); return true; } catch { return false; } } \`\`\` For better UX, fall back to standard \`approve\` automatically when permit support is missing. ## Security checklist The approval target is \*\*always\*\* the canonical \`O1Router\` address: \`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3\`. Reject any UI that asks you to approve a different address while using this API. \`submit.to\` should equal the router address. If it doesn't, abort and report. Use a short deadline (5 to 15 minutes). Don't sign permits with deadlines hours in the future — they're a long-lived approval risk if the signature leaks. Each permit signature consumes a \`nonce\`. Don't try to bundle multiple swaps under a single permit. \# Error handling Source: https://docs.o1.exchange/api/dex-aggregator/guides/error-handling How to interpret every error the API can return and the recommended retry strategy for each. The API uses HTTP status codes plus a JSON body of the form \`{ "error": "" }\` for every error. This guide covers what each status code means and the right response. ## Status code reference | Status | Meaning | Retry? | | ------ | --------------------------------------- | ------------------------- | | \`200\` | Success | n/a | | \`400\` | Validation error or no routes available | No (fix the request) | | \`401\` | Missing or invalid \`x-api-key\` | No (fix the key) | | \`404\` | Quote expired (only on \`/submit\`) | Yes (re-quote) | | \`429\` | Rate limit exceeded | Yes (backoff) | | \`5xx\` | Internal error | Yes (backoff with jitter) | ## Common error messages \`\`\`json theme={null} theme={null} { "error": "amountIn must be > 0" } \`\`\` \`\`\`json theme={null} theme={null} { "error": "no routes for pair" } \`\`\` \`\`\`json theme={null} theme={null} { "error": "slippageBps out of range" } \`\`\` \`\`\`json theme={null} theme={null} { "error": "invalid token address" } \`\`\` \*\*Treatment:\*\* show the user a clear message ("This pair has no liquidity right now"), do not retry. If \`no routes for pair\` happens often for a specific token, the token may not have routable on-chain liquidity on Base. \`\`\`json theme={null} theme={null} { "error": "unauthorized" } \`\`\` \*\*Treatment:\*\* verify the \`x-api-key\` header is set, the key is current, and your code isn't accidentally trimming whitespace. If you've recently rotated, redeploy with the new key. \`\`\`json theme={null} theme={null} { "error": "quote not found or expired" } \`\`\` \*\*Treatment:\*\* call \`/quote\` with the same parameters and submit again. Don't show a user-facing error unless this happens twice in a row. See \[Quote freshness\](/api/dex-aggregator/guides/quote-freshness) for the full recovery pattern. \`\`\`json theme={null} theme={null} { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } \`\`\` \*\*Treatment:\*\* back off for at least 1 second, ideally with jitter (\`1s + random(0..500ms)\`). If you sustain this, contact the o1 team to request a higher rate limit. \`\`\`json theme={null} theme={null} { "error": "internal error" } \`\`\` \*\*Treatment:\*\* retry once after 1-2 seconds with jitter. If the second retry fails, surface a generic error to the user and emit an internal alert. \## On-chain transaction failures Errors above are HTTP errors. Once you have a \`submit\` response and broadcast the transaction, a separate class of failures can happen on-chain: | Revert reason | Likely cause | Fix | | -------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------ | | \`Slippage\` | Pool state moved between \`/quote\` and inclusion. | Increase \`slippageBps\`, or re-quote and resend. | | \`TRANSFER\_FROM\_FAILED\` / \`INSUFFICIENT\_ALLOWANCE\` | Allowance for \`tokenIn\` is below \`amountIn\`. | Approve the router for \`amountIn\`, or use a \`permit\` payload. | | \`TRANSFER\_FROM\_FAILED\` (with sufficient allowance) | The user's balance is below \`amountIn\`. | Validate balance before submitting. | | \`Permit failed\` | Permit signature invalid or already consumed. | Re-sign with a fresh nonce; verify the EIP-712 domain matches the token. | | \`Out of gas\` | Gas estimate was too low (rare; happens during chain congestion). | Re-broadcast with a higher gas limit, e.g. \`gasEstimate.gasUnits × 1.5\`. | The on-chain \`Slippage\` revert is intentional. It means the safety net worked. If a user complains, the most common fix is "use slightly higher slippage" or "re-quote and retry quickly." \## Recommended retry policy \`\`\`ts theme={null} theme={null} async function callWithRetry(fn: () => Promise, maxRetries = 2): Promise { for (let attempt = 0; attempt <= maxRetries; attempt++) { const res = await fn(); if (res.ok) return res.json(); const body = await res.json().catch(() => ({})); // Non-retryable: fix the request and return if (res.status === 400 || res.status === 401) { throw new Error(body.error ?? \`${res.status}\`); } // 404 on /submit: caller must re-quote. Bubble up a typed error. if (res.status === 404) { throw new Error("QUOTE\_EXPIRED"); } // 429 / 5xx: back off and retry if (attempt === maxRetries) { throw new Error(body.error ?? \`${res.status}\`); } const baseDelay = res.status === 429 ? 1000 : 1500; const jitter = Math.random() \* 500; await new Promise((r) => setTimeout(r, baseDelay + jitter)); } throw new Error("unreachable"); } \`\`\` Then in the submit handler: \`\`\`ts theme={null} theme={null} try { const submit = await callWithRetry(() => fetch(\`${API\_URL}/submit\`, { /\* ... \*/ }), ); // broadcast as usual } catch (e) { if (e.message === "QUOTE\_EXPIRED") { const fresh = await refreshQuote(params); // retry submit with fresh.quoteId } else { showError(e.message); } } \`\`\` ## What NOT to do \`400\` means the request itself is malformed or unroutable. Retrying doesn't help; fix the request. The rate limit window is per API key. Retrying immediately after a \`429\` makes the situation worse and burns the rest of your minute. Always back off. Translate \`error\` strings into UI-friendly copy. "no routes for pair" → "Couldn't find liquidity for this pair, try a different amount or token." Always check \`receipt.status === "success"\` after \`waitForTransactionReceipt\`. A \`0x\` tx hash is not the same as a successful swap. \# Integration patterns Source: https://docs.o1.exchange/api/dex-aggregator/guides/integration-patterns When to use the two-step /quote + /submit flow versus the one-step /execute call. The DEX Aggregator API supports two integration shapes. They produce equivalent on-chain transactions; the difference is when the routing engine runs. \`/quote\` → human reviews price → \`/submit\` → broadcast. Best for swap UIs. \`/execute\` → broadcast. Best for one-click flows and bots. \## Two-step (recommended for swap UIs) Use this flow when a user reviews the quoted price before they commit. \`\`\`mermaid theme={null} theme={null} sequenceDiagram participant U as User participant C as Client participant A as o1 API participant W as Wallet participant R as Router U->>C: Pick tokens, enter amount C->>A: POST /quote A-->>C: quoteId + routePlan C->>U: Display price + route U->>C: Click "Swap" C->>A: POST /submit (quoteId, user) A-->>C: { to, data, value } C->>W: sendTransaction W->>R: swapExactIn(...) R-->>W: tx hash \`\`\` \`\`\`ts theme={null} theme={null} // 1. Quote const quote = await fetch(\`${API\_URL}/quote\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json" }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", slippageBps: 100, }), }).then((r) => r.json()); // 2. Display to user showQuote({ output: formatUnits(BigInt(quote.routePlan.expectedAmountOut), 18), minOutput: formatUnits(BigInt(quote.routePlan.minAmountOut), 18), route: quote.routePlan.routes .map((r) => r.legs.map((l) => l.dex).join(" → ")) .join(" | "), fee: \`${(quote.routePlan.feeBps ?? 0) / 100}%\`, }); // 3. User clicks "Swap" → build tx const submit = await fetch(\`${API\_URL}/submit\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: quote.quoteId, user: walletAddress, }), }).then((r) => r.json()); // 4. Send to wallet const txHash = await walletClient.sendTransaction({ to: submit.to as \`0x${string}\`, data: submit.data as \`0x${string}\`, value: BigInt(submit.value), }); \`\`\` ### Pros \* User confirms the price they see; no last-second surprise. \* You can run validation between quote and submit (e.g. "is this trade > \\$X? require a confirm dialog"). \* Clean separation between read (quote) and write (submit) for caching, analytics, and rate limiting. ### Cons \* Quotes have a TTL (\\~10 seconds). If the user takes too long, \`/submit\` returns \`404\` and you must re-quote. See \[Quote freshness\](/api/dex-aggregator/guides/quote-freshness). \* Two API calls per swap. \*\*\* ## One-step (instant swap) Use this flow when there's no preview step. \`\`\`mermaid theme={null} theme={null} sequenceDiagram participant C as Client participant A as o1 API participant W as Wallet participant R as Router C->>A: POST /execute A-->>C: routePlan + { to, data, value } C->>W: sendTransaction W->>R: swapExactIn(...) R-->>W: tx hash \`\`\` \`\`\`ts theme={null} theme={null} const exec = await fetch(\`${API\_URL}/execute\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json" }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", slippageBps: 100, user: walletAddress, }), }).then((r) => r.json()); const txHash = await walletClient.sendTransaction({ to: exec.to as \`0x${string}\`, data: exec.data as \`0x${string}\`, value: BigInt(exec.value), }); \`\`\` ### Pros \* Single round trip. \* No \`quoteId\` to track, no expiry to handle. ### Cons \* The user (or bot) doesn't see the price before signing. If you still want to show it, log \`exec.routePlan.expectedAmountOut\` after the fact. \* Less flexibility for caching and analytics, since each call rebuilds the full route plan server-side. \*\*\* ## Choosing the right pattern | Use case | Pattern | | --------------------------------------------- | -------------------------------- | | Standard swap UI with confirm dialog | Two-step | | One-click "swap now" button | One-step | | Server-side market-maker / bot | One-step | | Limit-order style flow with delayed execution | Two-step (re-quote on each tick) | | Mobile UI with poor connectivity | One-step (fewer round trips) | Even when you use \`/execute\` for the user-facing call, you can still hit \`/quote\` separately for live price display in the modal. Just be aware they consume separate rate-limit budget. \## Always: handle expired quotes Whichever pattern you pick, treat \`404 quote not found or expired\` from \`/submit\` as recoverable: re-fetch \`/quote\` with the same parameters and retry. Don't surface this as a user-facing error unless it happens repeatedly. See \[Quote freshness\](/api/dex-aggregator/guides/quote-freshness) for the full pattern. # Native ETH Source: https://docs.o1.exchange/api/dex-aggregator/guides/native-eth Sell native ETH or receive native ETH directly, without manually wrapping or unwrapping WETH. The \`O1Router\` handles all wrapping and unwrapping internally. From the API caller's perspective there are two flags: | Flag | Where | What it does | | ----------------- | -------------------------- | ---------------------------------------------------------------------------------------------- | | \`useNativeIn\` | \`/submit\` (and \`/execute\`) | When \`true\`, send \`msg.value = amountIn\` and the router wraps to WETH before dispatching legs. | | \`unwrapNativeOut\` | \`/submit\` (and \`/execute\`) | When \`true\`, the router unwraps WETH to ETH for the recipient before completing the swap. | ## Sentinel addresses for native ETH When you want to swap \*\*native ETH\*\* in \`tokenIn\` or \`tokenOut\`, use one of these sentinels: | Sentinel | Notes | | -------------------------------------------- | ----------------------------------------------- | | \`0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\` | Standard EIP-7528 native sentinel. Recommended. | | \`0x0000000000000000000000000000000000000000\` | Zero-address fallback, also accepted. | The aggregator detects either form and sets \`routePlan.nativeIn\` or \`routePlan.nativeOut\` to \`true\` automatically. You still need to set the corresponding flag on \`/submit\` or \`/execute\`, since the user might have changed their mind about wrapping between quote and submit. ## The four common cases Sell native ETH, receive an ERC-20 like USDC. \*\*Quote:\*\* \`\`\`json theme={null} theme={null} { "tokenIn": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "tokenOut": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "amountIn": "1000000000000000000", "slippageBps": 100, "chainId": 8453 } \`\`\` \*\*Submit:\*\* \`\`\`json theme={null} theme={null} { "quoteId": "...", "user": "0x...", "useNativeIn": true } \`\`\` \*\*Send transaction:\*\* the response \`value\` will equal \`amountIn\` (\`1000000000000000000\`). \`\`\`ts theme={null} theme={null} await walletClient.sendTransaction({ to: submit.to, data: submit.data, value: BigInt(submit.value), // = 1 ETH }); \`\`\` \*\*Approval:\*\* none needed. Sell an ERC-20 like USDC, receive native ETH. \*\*Quote:\*\* \`\`\`json theme={null} theme={null} { "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "amountIn": "1000000000", "slippageBps": 100, "chainId": 8453 } \`\`\` \*\*Submit:\*\* \`\`\`json theme={null} theme={null} { "quoteId": "...", "user": "0x...", "unwrapNativeOut": true } \`\`\` \*\*Approval:\*\* standard ERC-20 approve of the router for \`amountIn\`, or use \`permit\`. The router pulls USDC, swaps to WETH internally, then unwraps and sends ETH to \`user\` in the same transaction. A pure wrap or unwrap also goes through the aggregator. The router uses a no-op routing path — there's no swap math involved, just a \`deposit()\` or \`withdraw()\` call against WETH. \*\*Wrap:\*\* \`\`\`json theme={null} theme={null} { "tokenIn": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", "tokenOut": "0x4200000000000000000000000000000000000006", ... } \`\`\` Then on \`/submit\` set \`useNativeIn: true\`. \*\*Unwrap:\*\* \`\`\`json theme={null} theme={null} { "tokenIn": "0x4200000000000000000000000000000000000006", "tokenOut": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", ... } \`\`\` Then on \`/submit\` set \`unwrapNativeOut: true\`. No native handling. Don't set either flag. The router pulls \`tokenIn\`, swaps to \`tokenOut\`, sends to the user. \*\*Approval:\*\* required (or use \`permit\`). \## Common mistakes \`/submit\` response has \`value: "0"\` even though \`tokenIn\` was the native sentinel. Cause: you didn't set \`useNativeIn: true\` on \`/submit\`. The API errs on the side of safety and assumes you might have changed your mind. The router rejects any non-zero \`msg.value\` when \`useNativeIn\` is \`false\`. If your wallet is sending ETH along, double-check you didn't carry over \`value\` from a previous swap. For an \`ETH → ERC-20\` swap with \`useNativeIn: true\`, the user does not need to approve WETH. The router handles the wrap from \`msg.value\` and the resulting WETH never leaves the router contract. User receives WETH instead of ETH because \`unwrapNativeOut\` was omitted on \`/submit\`. Always set it explicitly when you want native ETH back. \## Why both quote and submit need the flag The aggregator detects native intent on \`/quote\` from the sentinel and sets \`routePlan.nativeIn\` / \`routePlan.nativeOut\`. But \`/submit\` requires you to re-confirm with the explicit flag because: 1. The \`quoteId\` is independent of the user. The same quote can be submitted by different users with different preferences. 2. Some integrators want to auto-wrap on the user's behalf, e.g. always pull ERC-20 WETH from the user even when the quote was for native ETH. Always pass \`useNativeIn\` / \`unwrapNativeOut\` explicitly on \`/submit\` to remove ambiguity. # Quote freshness Source: https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness How to keep the displayed price live in your UI and gracefully handle expired quotes. Quotes are price snapshots at a specific block. Pool reserves, tick state, and competing trades can move the market between the moment you quote and the moment your transaction lands. The aggregator handles this with a short server-side cache TTL and explicit expiry semantics. ## The contract Each \`/quote\` response includes \`expiresAt\` (Unix milliseconds). The default TTL is 10 seconds. After that, the cache entry is gone. Once \`expiresAt\` has passed, \`POST /submit\` with that \`quoteId\` returns \`{ "error": "quote not found or expired" }\`. Re-quote and retry. \## Recommended UI pattern On modal open, call \`/quote\` and store the result. Display the price. While the modal is open, re-fetch the quote periodically. Compare \`expectedAmountOut\` against the previous value to decide whether to flash an "updated" indicator. When the user clicks "Swap" (or your equivalent), pause polling so the price doesn't change between their decision and the wallet prompt. Always submit using the \`quoteId\` from the most recent successful \`/quote\`. Don't reuse an older one. If \`/submit\` returns \`404\`, automatically re-fetch \`/quote\` and retry once. Only surface a user-facing error if the second attempt also fails. \## Reference implementation \`\`\`ts theme={null} theme={null} import { useEffect, useRef, useState } from "react"; interface QuoteState { quoteId: string; expectedOut: bigint; minOut: bigint; expiresAt: number; } function useLiveQuote(params: QuoteParams, isOpen: boolean) { const \[quote, setQuote\] = useState(null); const isFreezingRef = useRef(false); useEffect(() => { if (!isOpen) return; let cancelled = false; const tick = async () => { if (cancelled || isFreezingRef.current) return; try { const q = await fetch(\`${API\_URL}/quote\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json" }, body: JSON.stringify(params), }).then((r) => r.json()); if (!cancelled && q.quoteId) { setQuote({ quoteId: q.quoteId, expectedOut: BigInt(q.routePlan.expectedAmountOut), minOut: BigInt(q.routePlan.minAmountOut), expiresAt: q.expiresAt, }); } } catch (e) { // ignore transient failures; next tick will retry } }; tick(); const id = setInterval(tick, 6000); return () => { cancelled = true; clearInterval(id); }; }, \[isOpen, JSON.stringify(params)\]); const freeze = () => { isFreezingRef.current = true; }; const unfreeze = () => { isFreezingRef.current = false; }; return { quote, freeze, unfreeze }; } \`\`\` Then in the swap submit handler: \`\`\`ts theme={null} theme={null} async function onSwap() { if (!quote) return; freeze(); // stop background re-quoting try { const submit = await fetch(\`${API\_URL}/submit\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: quote.quoteId, user: walletAddress }), }).then(async (r) => { if (r.status === 404) { // Quote expired between the freeze and the submit. Re-quote and retry. const fresh = await refreshQuote(params); return fetch(\`${API\_URL}/submit\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: fresh.quoteId, user: walletAddress }), }).then((r2) => r2.json()); } return r.json(); }); const txHash = await walletClient.sendTransaction({ to: submit.to, data: submit.data, value: BigInt(submit.value), }); onSuccess(txHash); } finally { unfreeze(); } } \`\`\` ## Why not use \`/execute\` for this? \`/execute\` always returns a fresh quote, so it sidesteps the 404 problem. But: \* You lose the ability to display the quoted price \*before\* the user signs. \* Every \`/execute\` call burns rate-limit budget \*and\* re-runs the routing engine, so it's more expensive than alternating \`/quote\` and \`/submit\`. Use \`/execute\` for one-click flows where preview doesn't matter. Use the two-step pattern with the freshness loop above for any UI that shows a price. ## Slippage as a freshness backstop Even with aggressive re-quoting, your submitted transaction may land 1-2 blocks after \`/quote\` ran. Use \`slippageBps\` as the safety margin: | Pair type | Recommended \`slippageBps\` | | -------------------------------------- | --------------------------- | | Stablecoin to stablecoin (USDC → USDT) | \`10\` to \`30\` (0.1% to 0.3%) | | Blue-chip to blue-chip (WETH → cbBTC) | \`30\` to \`100\` (0.3% to 1%) | | Blue-chip to mid-cap | \`100\` to \`300\` (1% to 3%) | | Long tail / memecoins | \`300\` to \`1000\` (3% to 10%) | The user's \`minAmountOut\` is set on the router, so the swap reverts cleanly if real output falls below the slippage threshold — your transaction never lands in a worse-than-expected state. Cache the user's preferred slippage per pair-type. Forcing the user to set slippage manually on every swap is a common UX pitfall. \# Introduction Source: https://docs.o1.exchange/api/dex-aggregator/introduction Quote and execute optimal swaps on Base through a single REST endpoint, backed by the O1Router contract and a multi-venue routing engine. The DEX Aggregator API is currently \*\*Base mainnet only\*\* (\`chainId: 8453\`). Multi-chain support is on the roadmap. The o1.exchange DEX Aggregator API gives you institutional-grade swap pricing on Base in two HTTP calls. The routing engine searches across 20+ on-chain venues, splits trades when it improves output, and returns broadcast-ready calldata for the canonical \`O1Router\` contract. Quotes pulled from Uniswap V2/V3/V4, Aerodrome, PancakeSwap, Curve, DODO, WooFi, Hydrex, and proprietary on-chain PMMs. A convex solver allocates input across multiple paths when the marginal output beats a single-route quote. Optional EIP-2612 permit payload lets the router pull tokens in the same transaction as the swap, no separate approval needed. \## How it works Send \`chainId\`, \`tokenIn\`, \`tokenOut\`, \`amountIn\`, and \`slippageBps\`. Receive a \`quoteId\`, an \`expectedAmountOut\`, and a \`routePlan\` describing which venues will be used. Echo the \`quoteId\` plus the user's wallet address. Receive \`{ to, data, value }\`, ready to hand to any EVM signer. The user's wallet signs and submits the transaction. The router executes all legs atomically and emits the configured slippage check. If you don't need a price preview step, \[\`POST /execute\`\](/api/dex-aggregator/endpoints/execute) collapses quote and submit into one call. ## What you get Up to 3 hops per route, multiple routes per swap. Slippage is checked per-leg and globally inside the router contract. Use \`0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\` (or the zero address) as the \`tokenIn\` / \`tokenOut\` to swap raw ETH; the router handles the wrap and unwrap automatically. Pass \`feeBps\` on the quote request to take a cut of the output. The fee is enforced inside the router contract, not the API. \## Architecture at a glance \`\`\`mermaid theme={null} theme={null} flowchart LR C\[Client\] -->|POST /quote| API\[o1 API\] API -->|quoteId + routePlan| C C -->|POST /submit| API API -->|to, data, value| C C -->|sendTransaction| W\[Wallet\] W -->|swapExactIn| R\[O1Router\] R --> V\[(On-chain venues)\] \`\`\` The aggregator has three layers: 1. \*\*Routing engine:\*\* \`packages/sdk/src/router\` runs beam-search path finding plus split optimization. It calls a pool repository (live Codex queries by default) to fetch reserves and tick state. 2. \*\*HTTP API:\*\* Exposed by Convex HTTP actions in production and a Fastify service for self-hosting. Handles auth, rate limiting, quote storage, and calldata assembly. 3. \*\*On-chain layer:\*\* \`O1Router.swapExactIn(...)\` dispatches each leg to a venue adapter, enforces slippage, and optionally wraps or unwraps native ETH. For the algorithmic details (beam search, convex split solver, AMM math per venue), see \[\`docs/ALGORITHM.md\`\](https://github.com/o1exchange/o1-dex-agg/blob/main/docs/ALGORITHM.md) in the source repo. ## Choose your integration pattern Best when the user reviews the price before committing. \`\`\` POST /quote → show quote, poll until user clicks "Swap" POST /submit → build the tx sign + send → user wallet broadcasts \`\`\` See the \[Quickstart\](/api/dex-aggregator/quickstart) for full code. Best for one-click flows, bots, and server-side integrations where there's no price preview. \`\`\` POST /execute → returns quote + calldata in one call sign + send → user wallet broadcasts \`\`\` See \[\`POST /execute\`\](/api/dex-aggregator/endpoints/execute) for the full request shape. \## Next steps Your first quote and swap in 30 lines of TypeScript. How to obtain and use an API key. Request and response schemas for every endpoint. The full list of venues in the routing graph. Already integrating? Skim \[Quote freshness\](/api/dex-aggregator/guides/quote-freshness) and \[Error handling\](/api/dex-aggregator/guides/error-handling) before you ship. They cover the two failure modes that catch most teams. \# Quickstart Source: https://docs.o1.exchange/api/dex-aggregator/quickstart Get a quote, build a transaction, and execute your first swap on Base in under five minutes. This guide walks you through a complete swap from a TypeScript client. We'll trade \*\*1,000 USDC for WETH\*\* on Base, then receive native ETH back instead of WETH. Production base URL is currently \`https://quiet-bloodhound-531.convex.site\`. If you're integrating against a vanity domain (e.g. \`https://api.o1.exchange/dex\`), substitute that throughout. \## Prerequisites See \[Authentication\](/api/dex-aggregator/authentication) to request one. Any Base mainnet RPC works. We use \`viem\` defaults below. Plus a small ETH balance to pay gas (and approve the router if this is your first swap). \## 1. Set up your client \`\`\`ts theme={null} theme={null} import { createPublicClient, createWalletClient, http, erc20Abi } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; const API\_URL = "https://quiet-bloodhound-531.convex.site"; const API\_KEY = process.env.O1\_API\_KEY!; const account = privateKeyToAccount(process.env.PRIVATE\_KEY as \`0x${string}\`); const publicClient = createPublicClient({ chain: base, transport: http() }); const walletClient = createWalletClient({ chain: base, account, transport: http() }); const USDC = "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"; const WETH = "0x4200000000000000000000000000000000000006"; \`\`\` ## 2. Get a quote \*\*Endpoint:\*\* \`POST {API\_URL}/quote\` \`\`\`ts theme={null} theme={null} const quote = await fetch(\`${API\_URL}/quote\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json", }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", // 1,000 USDC (6 decimals) slippageBps: 100, // 1% slippage tolerance }), }).then((r) => r.json()); \`\`\` \`\`\`json theme={null} theme={null} { "quoteId": "a1b2c3d4...", "expiresAt": 1712180000000, "routePlan": { "chainId": 8453, "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "expectedAmountOut": "484446072048780734", "minAmountOut": "479601611328292926", "slippageBps": 100, "blockNumber": 44266656, "gasEstimate": { "gasUnits": 300000 }, "routes": \[ { "amountIn": "1000000000", "legs": \[ { "dex": "UNIV3", "tokenIn": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "tokenOut": "0x4200000000000000000000000000000000000006", "amountIn": "1000000000", "minOut": "0", "poolId": "0xd0b5...f224", "data": { "kind": "v3\_direct", "pool": "0xd0b5...f224" } } \] } \] } } \`\`\` The fields you'll display to the user: \* \`routePlan.expectedAmountOut\` — the price you quote \* \`routePlan.minAmountOut\` — the worst-case fill after slippage \* \`routePlan.routes\[\].legs\[\].dex\` — which venues are involved \* \`expiresAt\` — quote validity window (about 10 seconds; see \[Quote freshness\](/api/dex-aggregator/guides/quote-freshness)) ## 3. Approve the router (first swap only) Skip this step entirely if \`tokenIn\` is native ETH, or if you're using an EIP-2612 permit (see \[\`POST /submit\`\](/api/dex-aggregator/endpoints/submit) → \`permit\`). \`\`\`ts theme={null} theme={null} const ROUTER = "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3"; const allowance = await publicClient.readContract({ address: USDC, abi: erc20Abi, functionName: "allowance", args: \[account.address, ROUTER\], }); if (allowance < BigInt(quote.routePlan.amountIn)) { await walletClient.writeContract({ address: USDC, abi: erc20Abi, functionName: "approve", args: \[ROUTER, BigInt(quote.routePlan.amountIn)\], }); } \`\`\` ## 4. Build the transaction \*\*Endpoint:\*\* \`POST {API\_URL}/submit\` \`\`\`ts theme={null} theme={null} const submit = await fetch(\`${API\_URL}/submit\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json", }, body: JSON.stringify({ quoteId: quote.quoteId, user: account.address, unwrapNativeOut: true, // receive native ETH instead of WETH }), }).then((r) => r.json()); \`\`\` \`\`\`json theme={null} theme={null} { "quoteId": "a1b2c3d4...", "chainId": 8453, "to": "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3", "data": "0x...", "value": "0" } \`\`\` \## 5. Sign and send \`\`\`ts theme={null} theme={null} const txHash = await walletClient.sendTransaction({ to: submit.to as \`0x${string}\`, data: submit.data as \`0x${string}\`, value: BigInt(submit.value), }); console.log(\`Submitted: https://basescan.org/tx/${txHash}\`); \`\`\` That's it. Wait for the receipt with \`publicClient.waitForTransactionReceipt({ hash: txHash })\` and the swap is complete. ## Full example, end to end \`\`\`ts theme={null} theme={null} import { createPublicClient, createWalletClient, http, erc20Abi } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; const API\_URL = "https://quiet-bloodhound-531.convex.site"; const API\_KEY = process.env.O1\_API\_KEY!; const ROUTER = "0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3"; const USDC = "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"; const WETH = "0x4200000000000000000000000000000000000006"; async function main() { const account = privateKeyToAccount(process.env.PRIVATE\_KEY as \`0x${string}\`); const publicClient = createPublicClient({ chain: base, transport: http() }); const walletClient = createWalletClient({ chain: base, account, transport: http() }); // 1. Quote const quote = await fetch(\`${API\_URL}/quote\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json" }, body: JSON.stringify({ chainId: 8453, tokenIn: USDC, tokenOut: WETH, amountIn: "1000000000", slippageBps: 100, }), }).then((r) => r.json()); console.log(\`Expected out: ${quote.routePlan.expectedAmountOut} WETH (wei)\`); // 2. Approve if needed const allowance = await publicClient.readContract({ address: USDC, abi: erc20Abi, functionName: "allowance", args: \[account.address, ROUTER\], }); if (allowance < BigInt(quote.routePlan.amountIn)) { const approveHash = await walletClient.writeContract({ address: USDC, abi: erc20Abi, functionName: "approve", args: \[ROUTER, BigInt(quote.routePlan.amountIn)\], }); await publicClient.waitForTransactionReceipt({ hash: approveHash }); } // 3. Submit const submit = await fetch(\`${API\_URL}/submit\`, { method: "POST", headers: { "x-api-key": API\_KEY, "content-type": "application/json" }, body: JSON.stringify({ quoteId: quote.quoteId, user: account.address, unwrapNativeOut: true, }), }).then((r) => r.json()); // 4. Send const txHash = await walletClient.sendTransaction({ to: submit.to as \`0x${string}\`, data: submit.data as \`0x${string}\`, value: BigInt(submit.value), }); const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash }); console.log(\`Confirmed in block ${receipt.blockNumber}\`); } main().catch(console.error); \`\`\` \## What's next When to use \`/quote\` + \`/submit\` vs \`/execute\`. Approve patterns, including one-tx permit-enabled swaps. Sell ETH directly without wrapping, or receive ETH instead of WETH. How to keep the displayed price live in your UI. \# Changelog Source: https://docs.o1.exchange/api/dex-aggregator/reference/changelog Notable API changes for the DEX Aggregator API. This page tracks user-visible changes to the DEX Aggregator API. Breaking changes are flagged explicitly. ## 2026-04-30 — Public docs published \* Initial public documentation for the DEX Aggregator API at \`docs.o1.exchange/api/dex-aggregator\`. \* Endpoints: \`/quote\`, \`/submit\`, \`/execute\`, \`/health\`. \* Live on Base mainnet (chain ID \`8453\`). \* Default rate limit: 120 requests / minute / API key. \* Router contract: \[\`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3\`\](https://basescan.org/address/0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3). ## Versioning policy The API does not use a versioned URL prefix today. We treat published behavior as stable and add fields additively whenever possible. Breaking changes will be: 1. Pre-announced here at least two weeks before deployment. 2. Mirrored at a versioned path (\`/v1/quote\`, \`/v2/quote\`) for the duration of the migration window. 3. Documented with a migration note describing the old and new shapes. ## What "breaking" means \* Removing or renaming a field on a response. \* Changing the type or units of an existing field. \* Tightening a validation rule that previously accepted a value. \* Removing or renaming an endpoint. Adding new optional request fields, new optional response fields, or new endpoints is \*\*not\*\* breaking. ## Subscribing to updates If you'd like change notifications, contact the o1 team to be added to an integrator mailing list. The changelog page here is the canonical record either way. # Rate limits Source: https://docs.o1.exchange/api/dex-aggregator/reference/rate-limits How the per-key rate limit works, what to do when you hit it, and how to request a higher quota. The DEX Aggregator API enforces a per-key sliding-window rate limit. The default is \*\*120 requests per minute per API key\*\*. ## How it works The window is keyed off the \`x-api-key\` header, not your IP. Each key gets its own bucket. Hits are tracked with timestamps. The window is \`now − 60s..now\`. There's no hard reset on the minute boundary; the oldest hits drop off as time passes. \## What counts as a request Every authenticated call counts: \* \`POST /quote\` \* \`POST /submit\` \* \`POST /execute\` \`GET /health\` is public and free. ## What you get on overflow \`\`\`http theme={null} theme={null} HTTP/1.1 429 Too Many Requests Content-Type: application/json \`\`\` \`\`\`json theme={null} theme={null} { "error": "rate limit exceeded", "limit": 120, "windowSec": 60 } \`\`\` ## Recommended retry \`\`\`ts theme={null} theme={null} async function fetchWithBackoff(req: () => Promise, maxAttempts = 3) { for (let attempt = 1; attempt <= maxAttempts; attempt++) { const res = await req(); if (res.status !== 429) return res; if (attempt === maxAttempts) return res; // Linear backoff with jitter is fine here. Don't go below 1 second. const delay = 1000 + Math.random() \* 500; await new Promise((r) => setTimeout(r, delay)); } throw new Error("unreachable"); } \`\`\` Don't retry immediately on \`429\`. The window is sliding, so a fast retry just lands at the same spot in the bucket. Wait at least 1 second. \## Capacity planning A few guidelines for sizing your usage: | Workload | Approximate rate | Headroom | | ------------------------------------------------------------------ | ------------------ | --------------------------------------- | | Single-user swap UI with live quote polling (one user, 8s polling) | \\~7 req/min | Plenty | | 10 concurrent users polling | \\~75 req/min | Comfortable | | 50 concurrent users polling | \\~375 req/min | Exceeds default — request a higher tier | | Server-side bot quoting once per second per pair | 60 req/min × pairs | Scales linearly | If you expect sustained load above the default 120 req/min, contact the o1 team to discuss a higher tier. ## Per-pair caching tips You can dramatically reduce request count on the client by: 1. \*\*Debouncing user input.\*\* Don't quote on every keystroke; quote 300ms after the last input. 2. \*\*Coalescing identical quotes.\*\* If two components need the same \`(tokenIn, tokenOut, amountIn)\` quote, share one fetch. 3. \*\*Pausing polling when the tab is hidden.\*\* Use \`document.visibilityState === "hidden"\` to skip ticks. ## What does NOT scale your quota \* Adding more API keys for the same product. The o1 team can detect related keys and apply combined limits if abuse is suspected. \* Spreading requests across IPs while reusing one key. The limit is keyed on the key, not the IP. If you legitimately need more headroom, ask. The defaults exist to protect upstream RPC and pool-data providers, and higher tiers are available. # RoutePlan schema Source: https://docs.o1.exchange/api/dex-aggregator/reference/route-plan Every field in the routePlan object returned by /quote and /execute. The \`routePlan\` object is returned on every successful \`/quote\` and \`/execute\` call. It's the canonical description of what the swap will do, broken down by route and leg. You don't need to construct a \`RoutePlan\` yourself. The API generates it; this page is for callers who want to display its contents in detail or audit a swap before signing. ## Top-level shape \`\`\`json theme={null} theme={null} { "chainId": 8453, "tokenIn": "0x...", "tokenOut": "0x...", "amountIn": "1000000000", "expectedAmountOut": "484446072048780734", "minAmountOut": "479601611328292926", "slippageBps": 100, "feeBps": 30, "blockNumber": 44266656, "gasEstimate": { "gasUnits": 300000, "gasCostWei": "..." }, "feeBreakdown": { "protocolFeeAmount": "...", "integratorFeeAmount": "..." }, "routes": \[ /\* SplitRoute\[\] \*/ \], "metadata": { /\* RouteMetadata \*/ }, "nativeIn": false, "nativeOut": false } \`\`\` | Field | Type | Description | | ------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------- | | \`chainId\` | integer | EVM chain ID. \`8453\` for Base. | | \`tokenIn\` | address | Echo of the request \`tokenIn\`. | | \`tokenOut\` | address | Echo of the request \`tokenOut\`. | | \`amountIn\` | string | Echo of the request \`amountIn\`, in wei. | | \`expectedAmountOut\` | string | The output amount the optimizer believes you'll receive, in wei. | | \`minAmountOut\` | string | The on-chain enforced minimum after slippage. | | \`slippageBps\` | integer | Slippage tolerance in bps. Same value as the request. | | \`feeBps\` | integer | Total fee in bps (protocol + optional integrator). | | \`blockNumber\` | integer | Block at which the routing engine snapshotted pool state. | | \`gasEstimate\` | object | Estimated gas usage. See \[gasEstimate\](#gasestimate). | | \`feeBreakdown\` | object | Fee split between protocol and integrator. See \[feeBreakdown\](#feebreakdown). | | \`routes\` | array | One or more \`SplitRoute\` objects. See \[Routes\](#routes). | | \`metadata\` | object | Optimizer telemetry. See \[metadata\](#metadata). | | \`nativeIn\` | boolean | \`true\` when the request used the native sentinel for \`tokenIn\`. The submit handler must set \`useNativeIn: true\` accordingly. | | \`nativeOut\` | boolean | \`true\` when the request used the native sentinel for \`tokenOut\`. Mirrors of \`nativeIn\`. | ## \`gasEstimate\` \`\`\`json theme={null} theme={null} { "gasUnits": 300000, "gasCostWei": "12000000000000000" } \`\`\` | Field | Type | Description | | ------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | \`gasUnits\` | integer | Estimated gas units the swap will consume. | | \`gasCostWei\` | string | (Optional) Estimated gas cost in wei at the snapshotted base fee. Display only; the transaction is priced by the user's wallet, not this number. | ## \`feeBreakdown\` \`\`\`json theme={null} theme={null} { "protocolFeeAmount": "1457804507741243911", "integratorFeeAmount": "0" } \`\`\` | Field | Type | Description | | --------------------- | ------ | -------------------------------------------------------------------------------- | | \`protocolFeeAmount\` | string | Protocol fee taken out of \`expectedAmountOut\`, in \`tokenOut\` base units. | | \`integratorFeeAmount\` | string | Integrator fee (when you set \`feeBps\` on the request), in \`tokenOut\` base units. | ## Routes \`routes\[\]\` is an array of \`SplitRoute\`. Each route is one path through the venue graph. When the optimizer splits a trade, you'll see multiple entries with the input divided across them. \`\`\`json theme={null} theme={null} { "amountIn": "600000000", "legs": \[ /\* RouteLeg\[\] \*/ \] } \`\`\` | Field | Type | Description | | ---------- | ------ | ----------------------------------------------------------- | | \`amountIn\` | string | Portion of the total \`amountIn\` allocated to this route. | | \`legs\` | array | 1 to 3 hops. Each \`leg\` swaps one pair on a specific venue. | ### \`RouteLeg\` \`\`\`json theme={null} theme={null} { "dex": "UNIV3", "tokenIn": "0x...", "tokenOut": "0x...", "amountIn": "600000000", "minOut": "0", "poolId": "0xd0b5...f224", "data": { "kind": "v3\_direct", "pool": "0xd0b5...f224" } } \`\`\` | Field | Type | Description | | ---------- | ------- | ------------------------------------------------------------------------------------------------------------ | | \`dex\` | \`DexId\` | Which venue the adapter dispatches to. See \[Supported DEXes\](/api/dex-aggregator/reference/supported-dexes). | | \`tokenIn\` | address | Input token for this leg. | | \`tokenOut\` | address | Output token for this leg. | | \`amountIn\` | string | Input amount to this leg, in wei. | | \`minOut\` | string | Minimum output for this leg in isolation. May be \`0\` because the global \`minAmountOut\` is the binding check. | | \`poolId\` | string | A human-friendly identifier for the pool, when applicable. | | \`data\` | object | Tagged union with \`kind\` discriminator. Shape varies per venue. See below. | ### \`data\` shapes (by \`kind\`) The \`data\` object is a tagged union keyed by \`kind\`. The router's adapter for each venue knows how to consume the corresponding shape. | \`kind\` | Carries | Used for | | ------------------- | -------------------------------- | ----------------------------------------------------------------- | | \`v2\_direct\` | \`pool\`, \`feeBps\` | Single Uni V2 / Aerodrome V2-like / PancakeSwap V2 pool | | \`v3\_direct\` | \`pool\` | Single Uni V3 pool | | \`pancake\_v3\_direct\` | \`pool\` | Single PancakeSwap V3 pool | | \`algebra\_direct\` | \`pool\` | Algebra family pool (Hydrex, QuickSwap V4) | | \`hydrex\` | \`deadline\` | Hydrex multi-hop | | \`univ4\` | \`commands\`, \`inputs\`, \`deadline\` | Uniswap V4 universal-router payload | | \`curve\` | \`pool\`, \`i\`, \`j\` | Curve TwoCrypto-NG (or compatible) | | \`prop\_amm\` | \`router\`, \`protocol\` | Proprietary AMMs (PropSwap, Tessera, Elfomofi, LunarBase, Feltir) | | \`dodo\_v2\` | \`pool\`, \`baseToken\` | DODO V2 | | \`woofi\` | \`router\` | WooFi | | \`univ2\` | \`path\`, \`deadline\` | Multi-hop V2 fallback | | \`univ3\` | \`path\`, \`deadline\` | Multi-hop V3 path-encoded fallback | | \`aerodrome\_v2\` | \`routes\`, \`deadline\` | Aerodrome multi-hop with stable/volatile flags | These details exist mainly for debugging and auditing. Application code rarely needs to inspect them. ## \`metadata\` Optimizer telemetry. Useful for displaying a "tried N paths, picked M" indicator in dev tools or analytics. \`\`\`json theme={null} theme={null} { "candidatePaths": 16, "selectedPaths": 1, "connectorsConsidered": \[ "0xcbb7...3bf", "0x9401...631" \], "candidates": \[ /\* RouteCandidateMetadata\[\] \*/ \] } \`\`\` | Field | Type | Description | | ---------------------- | ---------------- | ------------------------------------------------------------------------------------------- | | \`candidatePaths\` | integer | Number of token paths the optimizer considered. | | \`selectedPaths\` | integer | How many of those are in the final plan. | | \`connectorsConsidered\` | array of address | Intermediate tokens the optimizer hopped through. | | \`candidates\` | array | (Optional) Per-candidate scoring detail. Useful for debugging "why did it pick that route?" | In production UIs, the only fields most apps need from \`routePlan\` are \`expectedAmountOut\`, \`minAmountOut\`, \`feeBps\`, \`gasEstimate.gasUnits\`, and the list of \`dex\` names from \`routes\[\].legs\[\]\`. Treat the rest as advanced. \# Router contract Source: https://docs.o1.exchange/api/dex-aggregator/reference/router-contract The on-chain entrypoint that executes every aggregator swap. Every transaction the API produces calls the same canonical router contract on Base. \* \*\*Address:\*\* \[\`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3\`\](https://basescan.org/address/0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3) \* \*\*Chain ID:\*\* \`8453\` \* \*\*Source:\*\* \[\`contracts/src/O1Router.sol\`\](https://github.com/o1exchange/o1-dex-agg/blob/main/contracts/src/O1Router.sol) This is the only address you should ever approve as a spender for swaps via this API. If a \`/submit\` response returns a different \`to\` address, \*\*abort and report it\*\*. \## What it does The \`O1Router\` is a thin orchestrator that: 1. Pulls \`tokenIn\` from the user (via \`transferFrom\` or, if a \`permit\` is supplied, via \`permit + transferFrom\` in the same tx). 2. Optionally wraps \`msg.value\` to WETH when \`useNativeIn\` is set. 3. Dispatches each route leg to the corresponding venue adapter (Uniswap V2/V3/V4, Aerodrome, Pancake, Curve, DODO, WooFi, Hydrex, etc.). 4. Aggregates outputs from all routes. 5. Optionally unwraps WETH to native ETH when \`unwrapNativeOut\` is set. 6. Sends final \`tokenOut\` to the user. 7. Reverts if \`actualOutput < minAmountOut\` (slippage check), per-leg or globally. ## Public function signature \`\`\`solidity theme={null} theme={null} function swapExactIn( SwapParams calldata params ) external payable returns (uint256 amountOut); \`\`\` Where \`SwapParams\` is constructed by the API; you don't need to encode it yourself. Just send \`submit.data\` as the \`data\` field of your transaction. ## Slippage and safety The router enforces three layers of protection: Each leg has its own \`minOut\` checked by the corresponding adapter. The aggregate output is checked against \`routePlan.minAmountOut\`. The whole tx reverts if it's lower. If a \`permit\` payload is supplied, the EIP-712 deadline is enforced before the swap proceeds. \## Native wrapping The router uses a configured wrapped-native token address. On Base that's WETH at \`0x4200000000000000000000000000000000000006\`. \* \`useNativeIn: true\` → router calls \`WETH.deposit{value: msg.value}()\` before dispatching legs. \* \`unwrapNativeOut: true\` → router calls \`WETH.withdraw(amount)\` after legs settle, then forwards ETH to the user. You don't need to interact with WETH directly. ## Verifying on-chain Before integrating, verify the deployment: \`\`\`bash theme={null} theme={null} # Check that the bytecode at the address is non-empty cast code 0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3 --rpc-url https://mainnet.base.org \`\`\` Or just open it on \[Basescan\](https://basescan.org/address/0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3) and confirm: \* Contract is verified. \* Source matches \`contracts/src/O1Router.sol\` in the public repo. \* Constructor args set \`WETH\`, the fee recipient, and the venue adapter allowlist. Do not derive the router address from the API response without sanity checking it against this hardcoded value. Production integrations should hardcode the address and treat any mismatch in \`submit.to\` as fatal. \# Supported DEXes Source: https://docs.o1.exchange/api/dex-aggregator/reference/supported-dexes Every venue the routing engine can quote and dispatch to on Base. The router can dispatch legs to the venues below. The \`DexId\` value appears in \`routePlan.routes\[\].legs\[\].dex\` on every quote response, and you can pass any subset of these in the optional \`allowedDexes\` field on \`/quote\` and \`/execute\` to restrict routing. ## Constant-product (V2-style) Single-hop direct-pool swaps via the V2 product formula \`x × y = k\`. | \`DexId\` | Protocol | Notes | | ------------------ | ------------------------ | -------------------------------------------- | | \`UNIV2\` | Uniswap V2 | Multi-hop fallback also uses this kind. | | \`AERODROME\_V2LIKE\` | Aerodrome volatile pools | The V2-style side of Aerodrome (non-stable). | | \`PANCAKE\_V2\` | PancakeSwap V2 | | ## Concentrated liquidity (V3-style) Tick-aware pool math. | \`DexId\` | Protocol | Notes | | --------------------- | ------------------------------------------- | ---------------------------------------------------------------- | | \`UNIV3\` | Uniswap V3 | Direct-pool dispatch for single hop, path-encoded for multi-hop. | | \`PANCAKE\_V3\` | PancakeSwap V3 | | | \`PANCAKE\_INFINITY\_CL\` | PancakeSwap Infinity Concentrated Liquidity | | | \`ALIEN\_BASE\_V3\` | AlienBase V3 | | | \`HYDREX\` | Hydrex | Algebra Integral family. | | \`QUICKSWAP\_V4\` | QuickSwap V4 | Algebra Integral family. | ## Universal router (V4-style) Uniswap V4 is dispatched through the universal-router commands ABI. | \`DexId\` | Protocol | Notes | | ------- | ---------- | -------------------------------------------------------------- | | \`UNIV4\` | Uniswap V4 | Carries an opaque \`commands\` byte string and \`inputs\[\]\` array. | ## Stable and curve-style | \`DexId\` | Protocol | Notes | | -------------- | ------------------------------------ | -------------------------- | | \`AERODROME\_CL\` | Aerodrome Concentrated Liquidity | Stable side of Aerodrome. | | \`CURVE\` | Curve TwoCrypto-NG (and compatibles) | Pool-indexed by \`i\` / \`j\`. | ## Proprietary on-chain AMMs These are direct integrations with project-specific AMMs on Base. All dispatch through a router contract per protocol. | \`DexId\` | Protocol | | ----------- | --------- | | \`PROPSWAP\` | PropSwap | | \`TESSERA\` | Tessera | | \`ELFOMOFI\` | Elfomofi | | \`LUNARBASE\` | LunarBase | | \`FELTIR\` | Feltir | ## Other on-chain venues | \`DexId\` | Protocol | Notes | | ---------------- | -------------- | --------------------------------------------- | | \`DODO\_V2\` | DODO V2 | Carries \`pool\` and \`baseToken\` for direction. | | \`WOOFI\` | WooFi | Routed through the WooFi router contract. | | \`GYROSCOPE\_ECLP\` | Gyroscope ECLP | Elliptic concentrated liquidity. | | \`MAVERICK\_V2\` | Maverick V2 | | ## Restricting routing If you want to limit which venues the optimizer considers (e.g. for a benchmarking experiment, or to avoid a specific protocol), pass \`allowedDexes\` on \`/quote\` or \`/execute\`: \`\`\`json theme={null} theme={null} { "chainId": 8453, "tokenIn": "0x...", "tokenOut": "0x...", "amountIn": "1000000000", "slippageBps": 100, "allowedDexes": \["UNIV3", "AERODROME\_CL", "PANCAKE\_V3"\] } \`\`\` Restricting \`allowedDexes\` reduces routing flexibility. Expect worse \`expectedAmountOut\` than an unrestricted quote. Use only when you have a clear reason. \## What's NOT supported Off-chain professional market makers (PMMs) used by some upstream aggregators are \*\*not\*\* in this list. Bridges, cross-chain venues, and limit-order books are also out of scope; this aggregator is same-chain spot routing on Base. # Trading API Source: https://docs.o1.exchange/api/trading Execute trades programmatically with MEV protection, Permit2 support, and automatic slippage handling ## Overview The o1.exchange Trading API enables programmatic trading with enterprise-grade features including built-in MEV protection, Permit2 support for gasless approvals, and automatic slippage handling. \* \*\*MEV Protection\*\*: Private mempool routing to prevent sandwich attacks \* \*\*Gasless Approvals\*\*: One-time Permit2 signatures for unlimited trading \* \*\*Automatic Slippage\*\*: Built-in slippage protection with customizable limits \## Prerequisites Ethereum wallet with private key ETH for transaction costs Node.js environment \## Quick Start ### 1. Generate API Key Visit \[https://o1.exchange/api-trading\](https://o1.exchange/api-trading) Generate your secure API token for authentication \### 2. Create Transaction Batch \*\*Endpoint:\*\* \`POST https://api.o1.exchange/api/v2/order\` \*\*Headers:\*\* \`\`\`json theme={null} { "Authorization": "Bearer ", "Content-Type": "application/json" } \`\`\` \*\*Body:\*\* \`\`\`json theme={null} { "networkId": 8453, // Network ID (8453 = Base, 56 = BSC, 1399811149 = Solana) "signerAddress": "0x...", // Your wallet address "tokenAddress": "0x...", // Token contract address "uiAmount": "1.0", // Amount in human-readable format "direction": "buy", // "buy" or "sell" "slippageBps": 300, // Slippage in basis points (300 = 3%) "mevProtection": true, // Enable MEV protection "quoteTokenAddress": "0x...", // (Optional) Quote token for stablecoin trades (Base only) "poolAddress": "0x..." // (Optional) Specific liquidity pool (Base, BSC) } \`\`\` \`\`\`json theme={null} { "success": true, "id": "batch\_123...", "transactions": \[ { "id": "tx\_456...", "unsigned": { "to": "0x...", "data": "0x...", "value": "0x...", "gasLimit": "0x...", "chainId": 1 }, "permit2": { "eip712": { "domain": {...}, "types": {...}, "values": {...} } } } \] } \`\`\` \### 3. Sign Transaction and Permit2 For each transaction in the response: 1. \*\*Sign Permit2 (if present):\*\* \* Extract the EIP-712 typed data from \`permit2.eip712\` \* Sign using wallet's \`signTypedData\` method \* Replace the signature placeholder in transaction data 2. \*\*Sign the transaction:\*\* \* Create transaction object from the unsigned data \* Sign using wallet's \`signTransaction\` method \`\`\`javascript theme={null} // Fixed signature placeholder - don't change const SIGNATURE\_PLACEHOLDER = "42f68902113a2a579bcc207c91254c8516d921250e748c18a082d91d74908f8e9a05f27b72a030c6a42d77d0e0aab6fb09219b01a01e7b5b24e4f322ee1762ff1b"; for (const ctx of data.transactions) { const unsignedTx = Transaction.from(ctx.unsigned); // Handle Permit2 signature if present if (ctx?.permit2?.eip712) { const { domain, types, values } = ctx.permit2.eip712; const signature = await wallet.signTypedData(domain, types, values); // Replace placeholder with actual signature let txData = unsignedTx.data; txData = txData.replace(SIGNATURE\_PLACEHOLDER, signature.slice(2)); unsignedTx.data = txData; } // Sign the transaction const signedTx = await wallet.signTransaction(unsignedTx); } \`\`\` \### 4. Submit Transaction \*\*Endpoint:\*\* \`POST https://api.o1.exchange/api/v2/order/complete\` \*\*Headers:\*\* \`\`\`json theme={null} { "Authorization": "Bearer ", "Content-Type": "application/json" } \`\`\` \*\*Body:\*\* \`\`\`json theme={null} { "id": "batch\_123...", // Batch ID from create response "transactions": \[ { "id": "tx\_456...", // Transaction ID "signed": "0x...", // Signed transaction hex "permit2": { "eip712": { "signature": "0x..." // Permit2 signature } } } \] } \`\`\` \`\`\`json theme={null} { "success": true, "transactions": \[ { "hash": "0x...", // Transaction hash "status": "pending", // Transaction status "tokenDelta": "1000000" // Token balance change } \] } \`\`\` \## Sample Scripts & Examples \*\*GitHub Repository:\*\* \[https://github.com/CohumanSpace/o1-api\](https://github.com/CohumanSpace/o1-api) This repository contains complete sample scripts for using the o1.exchange API, including: \* Interactive CLI trading application \* Complete integration examples \* Proper error handling patterns \* Environment setup guides \## Interactive Example See \`execute-trade-interactive.js\` in the \[sample repository\](https://github.com/CohumanSpace/o1-api) for a fully functional CLI trading application that demonstrates all integration steps with proper error handling and user interaction. \### Setup Environment Create a \`.env.local\` file: \`\`\`env theme={null} EXECUTE\_TRADE\_PRIVATE\_KEY= EXECUTE\_TRADE\_API\_TOKEN= EXECUTE\_TRADE\_BASE\_URL= EXECUTE\_TRADE\_RPC\_URL= \`\`\` ### Run Interactive CLI \`\`\`bash theme={null} node execute-trade-interactive.js \`\`\` Enter token contract address (e.g., \`0x06ca615ac72a18e76b63bd4b5c320b6c8e291f8b\`) Choose \`buy\` or \`sell\` Enter amount in ETH (for buy) or tokens (for sell) Review trade details and execute View balance changes after execution \## Advanced Features \*\*Gasless token approvals\*\* using EIP-712 signatures * Automatic signature placeholder replacement * One-time approval for unlimited trading * Reduced gas costs for frequent traders \*\*Protection against sandwich attacks\*\* * Private mempool routing * Reduced slippage from MEV bots * Enable with \`mevProtection: true\` \### Slippage Control Specify \`slippageBps\` in basis points where \*\*100 bps = 1%\*\* \*\*Recommendations:\*\* \* \*\*Normal conditions:\*\* 300 bps (3%) \* \*\*Volatile tokens:\*\* 500-1000 bps (5-10%) \* \*\*Large trades:\*\* Increase as needed \## Error Handling Always implement proper error handling for: \* Network connectivity issues \* Insufficient balance or gas \* Transaction reverts \* API rate limiting The interactive example includes comprehensive error handling patterns you can reference for your own implementation. \# Bug Bounty Program Source: https://docs.o1.exchange/community/bug-bounty Help secure o1.exchange and earn rewards for finding vulnerabilities ## Protecting Our Community At o1.exchange, security is our top priority. We've established a comprehensive bug bounty program to incentivize security researchers and developers to help identify vulnerabilities in our platform. Your contributions help us maintain the highest security standards for our users. Discover and report security issues to earn rewards Get paid for valid security findings based on severity \## Reward Structure Rewards are determined based on the severity and impact of the vulnerability: | Severity | Description | Reward Range | | ---------- | -------------------------------------------- | --------------- | | \*\*High\*\* | loss of funds, significant impact | $1,000 - $5,000 | | \*\*Medium\*\* | Limited impact, requires specific conditions | $500 - $1,000 | | \*\*Low\*\* | Minimal impact, informational issues | $100 - $500 | \### In Scope \* Smart contract vulnerabilities \* Trading engine exploits \* Authentication bypass \* Fund manipulation \* Oracle manipulation \* Cross-site scripting (XSS) \* SQL injection \* Remote code execution ### Out of Scope \* Known issues or already reported vulnerabilities \* Social engineering attacks \* Physical attacks \* Denial of service attacks \* Issues in third-party services \* Generic product bugs, including but not limited to UI/UX, application clients, product stability, etc. \* Attempting to exploit vulnerabilities on the mainnet or causing actual harm to users is strictly prohibited and may result in legal action. \* No one should break nor exploit the mainnet (production o1.exchange site) without the admin/team's approval; otherwise it would lead to a smaller final payout. \## How to Participate Review our smart contracts, trading platform, and infrastructure for potential vulnerabilities Create a detailed report including: \* Clear description of the vulnerability \* Steps to reproduce \* Impact assessment \* Suggested fix (if applicable) \* Payments would be sent when attack and solution documentations are shared, given no follow-up attack within the next 1 month Send your report to our X account @o1\\\_exchange via DM Our security team will review your submission within 48 hours Upon validation, receive your bounty payment in USDC or ETH \## Recognition Top contributors to our bug bounty program will be featured in our Security Hall of Fame and receive exclusive NFT badges recognizing their contributions to platform security. \## Legal Safe Harbor We commit to not pursuing legal action against security researchers who: \* Comply with this bug bounty policy \* Act in good faith \* Make a reasonable effort to avoid privacy violations \* Do not exploit vulnerabilities beyond what's necessary for verification Join our security-focused Discord channel to discuss potential findings with our team and other security researchers. Remember: collaboration makes our platform stronger! \## Contact For questions about the bug bounty program or to submit a vulnerability report: \*\*Twitter\*\*: Send your report to our X account @o1\\\_exchange via DM.\\ \*\*Response Time\*\*: Within 48 hours. \# Platform Metrics Source: https://docs.o1.exchange/community/metrics View comprehensive platform metrics including trading volumes, active users, fee generation, and network distribution Bookmark the Dune dashboard to stay updated on platform performance and trading trends. The data is particularly useful for understanding market dynamics and making informed trading decisions. \# Community & Socials Source: https://docs.o1.exchange/community/socials Connect with thousands of traders, developers, and DeFi enthusiasts in the o1.exchange community. Get real-time updates, trading insights, and direct support from our team. Our community is global and active 24/7. Whether you're a beginner or experienced trader, you'll find valuable insights and supportive community members ready to help you succeed. \# Explore Tokens Source: https://docs.o1.exchange/features/explore-tokens o1.exchange provides comprehensive token exploration tools to help you discover new opportunities, research projects, and make informed trading decisions across multiple blockchain networks. ### Token Discovery Features Discover the most popular and trending tokens based on trading volume and community interest Stay updated with newly listed tokens and early-stage opportunities Track the best and worst performing tokens over various time periods Find tokens with exceptional trading volume and liquidity #### Explore Tokens in Pulse Use the **Pulse** page to discover new trading pairs that have been recently launched. This section highlights tokens that are gaining traction, allowing you to spot emerging opportunities early. #### Filter Tokens by Your Criteria Apply advanced filters to narrow down tokens based on your selection criteria—such as trading volume, price change, liquidity, or launch time. This helps you focus on tokens that best match your investment or trading strategy. \# Onramp Fiat to Crypto Source: https://docs.o1.exchange/features/onramp o1.exchange provides integrated fiat onramp solutions powered by Coinbase, allowing you to convert traditional currencies (USD, EUR, etc.) directly into cryptocurrency without leaving the platform. ### Supported Payment Methods Instant purchases with major credit and debit cards Lower fees with ACH and wire transfer options Support for Apple Pay, Google Pay, and other digital wallets #### 1\. Input the amount of chain native token to purchase #### 2\. Complete the purchase \# Portfolio Source: https://docs.o1.exchange/features/portfolio Comprehensive portfolio tracking and analytics ## Portfolio Overview Easily track your entire crypto portfolio in one place. The portfolio dashboard provides a comprehensive summary of your assets, including real-time balances, performance stats, and detailed analytics. \### Multi-Wallet Analytics You can view your portfolio analytics for: \* \*\*All wallets combined\*\* for a complete overview \* \*\*Main wallet\*\* or any \*\*active wallet\*\* \* \*\*Custom wallet combinations\*\*—select any set of wallets to analyze their aggregated balances, performance, and token distribution #### 1\. Select Wallets to Analyze Choose your main, active, or any combination of wallets to customize your analytics view. #### 2\. View Aggregated Analytics Instantly see aggregated stats, token allocations, and performance metrics across your selected wallets. The portfolio dashboard gives you full flexibility to analyze your holdings across any wallet or group of wallets, helping you make informed decisions with complete visibility. \# Referrals & Rewards Source: https://docs.o1.exchange/features/referrals-rewards Earn rewards through referrals and trading activities ## Rewards & Referral Dashboard Manage and track all your rewards and referral activities in one place. The dashboard provides a comprehensive overview of your trading and referral performance, including: \* \*\*Trading Tier\*\*: View your current trading tier and the benefits it unlocks. \* \*\*Cashback Rate\*\*: See your current cashback percentage based on your trading activity. \* \*\*Cashback Rewards\*\*: Track the total cashback you've earned. \* \*\*Total Trading Volume (per chain)\*\*: Monitor your trading volume across different supported blockchains. \* \*\*Referral Rewards\*\*: View the total rewards earned from referring others. \* \*\*Total Referred Users\*\*: See how many users have signed up using your referral code. \* \*\*Referred Volume\*\*: Track the trading volume generated by your referred users. \* \*\*Cashback History\*\*: Review a detailed history of your cashback rewards. \* \*\*Reward History\*\*: Access a log of all rewards earned through trading and referrals. \* \*\*Multi-Tier Referrals\*\*: Analyze your referred users across multiple tiers and their corresponding trading volumes. \*\*\* ## Set Your Referral Code Personalize your referral code to make it easy to share with friends and track your referrals. Setting your code is simple: 1\. Choose a unique referral code. 2. Save your code to activate it. 3. Share your code with friends to start earning rewards. \*\*\* ## Share and Earn Together Invite friends to o1.exchange using your referral code. When they trade, you both benefit—your friends receive a portion of their trading commission back as cashback, and you earn referral rewards based on their activity. \* Share your code via social media, messaging apps, or directly. \* Track the rewards and cashback earned by you and your referred users in real time. \* Multi-tier referrals let you benefit from the activity of users referred by your direct referrals as well. Set your referral code, share it, and start earning rewards together! All referral and cashback rewards are transparently tracked in your dashboard. \# Trading Source: https://docs.o1.exchange/features/trading Advanced trading features and order types ## Trading Features Unlock powerful trading tools designed for both beginners and advanced users. Our platform supports a variety of order types to help you execute your strategies with precision. ### 1. Spot Order A spot order allows you to buy or sell tokens instantly at the current market price. ### 2. Limit Order Set your desired price and let the system execute your trade when the market reaches your target. ### 3. Sniper Order Sniper orders are designed for high-speed execution, letting you target specific liquidity events or new token launches. ### 4. TWAP (Time-Weighted Average Price) TWAP orders help you minimize market impact by splitting your trade into smaller orders executed over a set period. \*\*\* ## How to Trade Follow these simple steps to place a trade: ### 1. Review Token Details Check the token's information, including price, liquidity, and recent activity, to make informed decisions. ### 2. Configure Your Wallet Select your active wallet for multi-wallet trading. ### 3. Place Your Trade Choose your order type (Spot, Limit, Sniper, or TWAP), enter the trade details, and confirm your transaction. \*\*\* Advanced trading features are continuously being improved. Stay tuned for updates and new order types! \# Wallets Source: https://docs.o1.exchange/features/wallets Secure wallet integration and management ## Wallet Management Features Manage your wallets seamlessly within o1.exchange. Our platform provides a robust set of tools for creating, importing, exporting, and organizing your wallets—all under your single o1.exchange account. ### 1. Create New Wallets Easily generate new wallets directly from your o1.exchange dashboard. Each wallet is securely managed and linked to your account, allowing you to organize multiple wallets for different purposes or strategies. ### 2. Import Existing Wallets Bring your existing wallets into o1.exchange by importing them using your secret key. All imported wallets are managed in a non-custodial manner, ensuring you retain full control and ownership. ### 3. Export Wallets with Recovery Phrase Export all your wallets at once using a single 12-word recovery phrase. This allows you to back up and restore up to 100 wallets simultaneously, making wallet management and migration simple and efficient. ### 4. Individual Wallet Actions For each wallet, you can: \* \*\*Archive\*\*: Move wallets you no longer use to an archived state. \* \*\*Set as Main Wallet\*\*: Designate any wallet as your primary wallet for transactions. \* \*\*Export Private Key\*\*: Access and export the private key for any wallet when needed. \* \*\*Set Active/Inactive\*\*: Toggle wallets between active and inactive status to keep your dashboard organized. Generate new wallets or import existing ones using your secret key. All wallets are managed securely and non-custodially. Export up to 100 wallets at once with a single 12-word recovery phrase. Archive, set main, or export private keys for any wallet. \## Split & Consolidate Tokens Easily manage your assets by splitting or consolidating tokens directly from the wallets page. This feature allows you to move tokens between your wallets for better organization or strategy execution. #### 1\. View and Select Wallets Access all your wallets in one place. Select the wallet you want to split tokens from or consolidate tokens into. #### 2\. Initiate Token Transfer Choose the "Transfer" option to move tokens between your wallets. Specify the amount and the destination wallet to split or consolidate your holdings. #### 3\. Confirm and Complete Review the details and confirm the transfer. Your tokens will be moved instantly, allowing you to efficiently manage your portfolio across multiple wallets. Wallets on o1.exchange are managed in a non-custodial way, giving you full control and flexibility. You can organize, back up, and manage multiple wallets with ease. \# Trading Fees Source: https://docs.o1.exchange/getting-started/fees The more you trade, the more you earn back! ## Fees ### Cashback Program Our universal cashback program applies across all markets - spot, prediction markets, and future markets. You level up as you trade more, earning greater cashbacks that reduce your effective trading fees. #### Tier 1 \* Cashback: 0.2% \* Net Fee Reduction: 0.20% #### Tier 2 \* Cashback: 0.25% \* Net Fee Reduction: 0.25% #### Tier 3 \* Cashback: 0.30% \* Net Fee Reduction: 0.30% #### Tier 4 \* Cashback: 0.35% \* Net Fee Reduction: 0.35% #### Tier 5 \* Cashback: 0.40% \* Net Fee Reduction: 0.40% The cashback is applied to your base trading fee, regardless of the market type you're trading in. ### Spot Market \*\*Base Fee:\*\* 1.00% With our cashback program, your effective trading fees for spot markets are: \* \*\*Tier 1:\*\* 0.80% (1.00% - 0.20% cashback) \* \*\*Tier 2:\*\* 0.75% (1.00% - 0.25% cashback) \* \*\*Tier 3:\*\* 0.70% (1.00% - 0.30% cashback) \* \*\*Tier 4:\*\* 0.65% (1.00% - 0.35% cashback) \* \*\*Tier 5:\*\* 0.60% (1.00% - 0.40% cashback) ### Prediction Market For prediction market trades, we use a dynamic fee structure based on market conditions: \*\*Base Fee Formula:\*\* \`Fee = round\_up(0.07 × C × P × (1 - P))\` Where: \* \*\*C\*\* is the amount of shares being traded \* \*\*P\*\* is the current probability (price) of the outcome, expressed as a decimal between 0 and 1 \* The result is rounded up to the nearest unit \*\*Note:\*\* Cashback from our tier program applies to the calculated fee, reducing your effective trading costs. #### How it Works The fee calculation automatically adjusts based on: 1. \*\*Trade Size (C):\*\* Larger trades incur proportionally higher fees 2. \*\*Market Probability (P):\*\* The fee changes based on how certain the market is about an outcome 3. \*\*Volatility Factor (P × (1 - P)):\*\* This reaches maximum when P = 0.5 (50% probability), meaning the market is most uncertain #### Base Fee Examples (Before Cashback) \* When \*\*P = 0.5\*\* (50% probability): Maximum fee = \`0.07 × C × 0.25 = 0.0175 × C\` \* When \*\*P = 0.1\*\* (10% probability): Fee = \`0.07 × C × 0.09 = 0.0063 × C\` \* When \*\*P = 0.9\*\* (90% probability): Fee = \`0.07 × C × 0.09 = 0.0063 × C\` \* When \*\*P = 0.01 or 0.99\*\* (extreme probabilities): Minimum fee = \`0.07 × C × 0.0099 ≈ 0.000693 × C\` This dynamic fee structure ensures: \* \*\*Fair pricing\*\* based on market uncertainty \* \*\*Lower fees\*\* when outcomes are more certain (very high or very low probabilities) \* \*\*Balanced liquidity provision\*\* across all probability levels \* \*\*Additional savings\*\* through our universal cashback program ### Perpetuals (Perps) We integrate with Hyperliquid Build Code to provide perpetual futures trading. Our platform charges the industry's lowest builder fee of \*\*0.010%\*\* for perpetual trades. \*\*Builder Fee:\*\* 0.010% This ultra-low builder fee provides exceptional value for perpetual futures traders. # Points System Season 1.1 Source: https://docs.o1.exchange/getting-started/points-system-season1 Points system rewards active traders and contributors to the o1.exchange community \*\*Points System Season 1.1\*\* - Active since August 19, 2025, until January 19, 2026, 00:00:00 UTC (Monday). See \[Points System Season 2\](/getting-started/points-system-season2) for the new competitive weekly leaderboard system. \## Points Overview o1.exchange features a comprehensive rewards system that recognizes and incentivizes various trading activities and community contributions. Earn points through trading, referrals, and early adoption across multiple trading seasons. Earn points based on your trading volume across all supported networks Gain points from the trading activity of users in your referral network Special bonus points and badges available during trading seasons \## Trading Seasons Explore the different trading seasons and their unique reward structures: Early beta rewards program with exclusive OG Trader badges and bonus points for early participants (May - September 2025) Foundation season with enhanced trading rewards and expanded network support (Details coming soon) \## Trading Volume Points Earn points for every trade you execute on the platform. \* \*\*Multi-Network Support\*\*: Points aggregate across Solana, Base, and all supported networks \* \*\*Token-Specific Rates\*\*: Different tokens may have different point multipliers \* \*\*Default Rate\*\*: 50 points per 1 SOL traded (or equivalent) \* \*\*Formula\*\*: \`trade\_volume × points\_rate\` If you trade 10 SOL worth of tokens: \* Base points: 10 × 50 = \*\*500 points\*\* \* Additional multipliers may apply based on specific token configurations \## Multi-Level Referral Points Earn points from the trading activity of users in your referral network, up to 4 levels deep. \[Learn more about rewards & point structure →\](/features/referral-system) ### Referral Points Structure \* Each level has different point rates \* Rates are configurable per network and token \* Points accumulate from all levels simultaneously ## Additional Point Sources \*\*200 points\*\* for each direct invite who joins the platform Bonus points during promotional periods and campaigns **Update (Aug 27, 2025):** Transaction Points are **no longer awarded** for each transaction. Points are now earned **only based on trading volume** to prevent abuse and ensure fair rewards. Please focus on increasing your trading volume to maximize your points. \## Total Points Calculation Your total points are calculated by aggregating: 1. \*\*OG Trader Bonus\*\* (if eligible) 2. \*\*Trading Volume Points\*\* across all networks 3. \*\*Referral Points\*\* from all 4 levels 4. \*\*Invite Points\*\* for direct referrals 5. \*\*Transaction Points\*\* for activity All calculations use high-precision decimal arithmetic to ensure accuracy in point distribution. \# Points System Season 1.2 Source: https://docs.o1.exchange/getting-started/points-system-season2 Competitive weekly leaderboard mechanism distributing predetermined point pools based on trading volume ## Overview The Points System Season 1.2 is a competitive weekly leaderboard mechanism that distributes a predetermined pool of points to users based on their proportional trading volume. Unlike traditional transaction-based point systems, Season 1.2 allocates a fixed amount of points each week that users compete for based on their share of the total weekly trading volume. ## System Architecture ### Phase-Based Point Allocation Points System Season 1.2 launches with Phase 1, offering the highest weekly point rewards: | Phase | Weeks | Points Per Week | Total Points | | ------- | ----- | --------------- | ------------ | | Phase 1 | 1-20 | 2,000,000 | 40,000,000 | | Phase 2 | 21 | 2,000,000 | 2,000,000 | \*\*Phase 1:\*\* Distributes 40,000,000 points over weeks 1–20.\\ \*\*Phase 2:\*\* Distributes 2,000,000 points over the week 21. ### Epoch System \* \*\*Start Date:\*\* January 19, 2026, 00:00:00 UTC (Monday) \* \*\*End Date:\*\* June 15, 2026, 00:00:00 UTC (Monday) \* \*\*Duration:\*\* Exactly 7 days per epoch \* \*\*Reset:\*\* Weekly at the same time \* \*\*Current Implementation:\*\* Week-based epochs with precise timestamp boundaries ## Point Distribution Mechanism ### Volume Share Calculation Points are distributed to all users each week in proportion to their trading volume. The weekly point pool is shared among all users who have trading volume, with each user receiving points based on their percentage of the total weekly volume. \*\*All users are rewarded:\*\* Every user with trading volume receives points proportional to their share of the week's total volume. The leaderboard shows the top 30 users for the current week, but all participating users earn points. \### Trading Volume Calculation \*\*Supported Fee Currencies:\*\* \* \*\*Native Tokens:\*\* SOL, ETH (converted from smallest units) \* \*\*USDC:\*\* Direct USD value (handles both atomic units and human-readable format) \* \*\*Quote tokens\*\*: ZORA, etc. ### Price Conversion For non-USD transactions, the system uses cached major token prices to convert to USD equivalent: \* Real-time price feeds from majorTokenV2 table \* Network-specific price mappings \* Fallback handling for price discovery failures \*\*Leaderboard Table:\*\* \* Top 30 users by trading volume \* Rank badges for top 3 positions (Gold/Silver/Bronze) - these are visual recognition only and do not provide additional points \* Wallet addresses (truncated for privacy) \* USD trading volume \* Points allocated ### Real-Time Features \* \*\*Live Updates:\*\* Query-based real-time data refresh \* \*\*Countdown Timer:\*\* Precise remaining time until epoch reset \* \*\*Progress Tracking:\*\* Personal performance metrics \* \*\*Competition Status:\*\* Clear ranking and reward information This system creates a competitive yet fair environment where users compete weekly for their share of predetermined point pools, with rewards directly proportional to their trading activity and contribution to platform volume. # Referral System Source: https://docs.o1.exchange/getting-started/referral-system Earn rewards through our 4-tier referral program ## Multi-Tier Referral Program o1.exchange offers a powerful 4-tier referral system that rewards you for bringing new traders to the platform. Earn a percentage of trading fees from not only your direct referrals but also from their referrals up to 4 levels deep. Create your unique referral link from your account dashboard Share your link with friends, on social media, or in trading communities \## Referral Reward Structure \*\*April 10, 2026 Update:\*\* o1.exchange revamped its cashback and referral system to discourage self-referral and encourage the use of official o1.exchange KOL/partner referral links. \### Cashback Rules (from April 10, 2026) Users who sign up with an o1.exchange \*\*KOL/partner referral link\*\* receive \*\*45% cashback\*\* ready to go from day one. Users who sign up with a \*\*regular referral link\*\* receive \*\*20% cashback\*\*, with the ability to upgrade to higher cashback tiers as their trading volume grows. \### Reward Tiers (before April 10, 2026) Our industry-leading 4-tier referral system offered some of the most competitive rates in DeFi: | Tier | Relationship | Reward (% of Trading Fees) | | ---- | ------------------------- | -------------------------- | | 1 | Direct referrals | \*\*35%\*\* | | 2 | Your referrals' referrals | \*\*3%\*\* | | 3 | Third-level referrals | \*\*2%\*\* | | 4 | Fourth-level referrals | \*\*1%\*\* | If your network generated \\$10,000 in trading fees: \* \*\*Tier 1 (35%)\*\*: \\$3,500 from direct referrals \* \*\*Tier 2 (3%)\*\*: \\$300 from second-level referrals \* \*\*Tier 3-4\*\*: Additional earnings from your extended network All referral rewards are automatically credited to your account in real-time as your network trades on the platform. \## Maximizing Your Referral Income Focus on referring active traders who trade frequently and in high volumes to maximize your tier 1 rewards. Help your direct referrals understand the benefits of referring others, which can increase your tier 2-4 rewards. Share your referral link in trading communities, Discord servers, and social media groups where potential traders gather. The power of compound networking means that even a small network of active traders can generate significant passive income through our 4-tier system. \## Getting Started Access your o1.exchange dashboard using your credentials Find the "Referrals" section in your user dashboard Create your unique referral link with one click Distribute your link and watch your rewards grow in real-time \# Trading Season 1: Early Beta Source: https://docs.o1.exchange/getting-started/rewards/season-1 OG Trader rewards during early Beta period ## OG Trader Program Trading Season 1 recognizes early adopters who participated in the o1.exchange beta period. This exclusive program rewards traders who helped shape the platform during its initial launch. ### Eligibility Period \*\*May 17, 2025\*\* - First day of eligibility \*\*September 5, 2025\*\* - Last day to qualify \### OG Trader Badge Requirements To earn the exclusive OG Trader Badge: \* Trade during the eligibility period (May 17 - September 5, 2025) \* Reach \*\*Level Tier 2 (Silver tier)\*\* through trading activity \* Maintain active participation throughout the season ### Points Calculation The OG Trader program rewards early participation with higher points for earlier trading dates: | Trading Start Date | Points Earned | Bonus Type | | ------------------ | ---------------- | ------------------ | | Day 1 (May 17) | \*\*5,000 points\*\* | Maximum Early Bird | | Week 1 | \\~4,500 points | High Early Bird | | Month 1 | \\~3,500 points | Early Bird | | Mid-period | \\~2,550 points | Standard | | Month 3 | \\~1,000 points | Late Entry | | Last day (Sep 5) | \*\*100 points\*\* | Minimum | | After Sep 5 | 0 points | Ineligible | \* Points decrease linearly from the maximum to minimum over the eligibility period \* Earlier traders receive significantly more rewards \* No points are awarded for trading after the season ends \* Points are awarded once per trader based on their first trade date \## Benefits & Recognition Permanent OG Trader status displayed on your profile Up to 5,000 additional points for early participation Special recognition in the o1.exchange community The OG Trader program was a one-time opportunity for early beta participants. Future seasons will have different reward structures and requirements. \## Maximizing Season 1 Rewards Start trading as close to May 17, 2025 as possible for maximum points Focus on achieving Level Tier 2 through consistent trading activity Maintain regular trading throughout the season to build your profile Use the referral system to compound your rewards beyond the OG bonus \# Trading Season 2: Base Source: https://docs.o1.exchange/getting-started/rewards/season-2 Base Season rewards and point structure ## Base Season Overview Trading Season 2 represents the foundation of o1.exchange's ongoing rewards program, focusing on Base chain trading with a comprehensive tier system based on ETH trading volume. ### Season Timeline \*\*September 5, 2025\*\* - Season 2 begins immediately after Season 1 ends \## Base Wizard Badge 🧙‍♂️ Earn the exclusive Base Wizard Badge by completing one of the following requirements: \*\*Trade 100 ETH\*\* in total volume on Base chain \*\*Refer 300 ETH\*\* in total volume through your referral network The Base Wizard Badge is a special achievement that recognizes both active traders and successful community builders. You only need to complete ONE of the two paths to earn this badge. \## Tier Benefits Each Base Chain tier unlocks exclusive benefits and recognition: Enter trading contest with generous bounty Higher tiers earn increased points per trade Special recognition and leaderboard placement Season 2 focuses exclusively on Base chain ETH trading volume. Other networks and tokens may be included in future seasons. \# Zora Trading Contest Source: https://docs.o1.exchange/getting-started/rewards/zora-trading-contest Eight-week trading contest for Zora Creator and Content Coins ## Contest Overview The first Zora Trading Contest is an eight-week competitive campaign with a total reward pool of 2,500,000 \\$ZORA tokens. ### Campaign Duration \*\*November 3, 2025 - December 27, 2025\*\* 8 consecutive weekly periods, resetting every Monday at 00:00 SGT \## Rewards Pool \*\*2,500,000 \\$ZORA\*\* Allocated as 312,500 \\$ZORA per weekly window across 8 weeks \## Eligibility Requirements Only trades executed directly through o1.exchange count toward eligibility. External trades (including after wallet export) are not eligible. \## Eligible Trading Activity The contest tracks bona fide trades of: \* \*\*Zora Creator Coins\*\* \* \*\*Zora Content Coins\*\* All trades must be executed via the o1.exchange platform to qualify for leaderboard rankings. ## Weekly Leaderboards & Rewards Each week features a volume-based leaderboard with the following reward structure: ### Volume Leaderboard (312,500 \\$ZORA per week) For users with Base Wizard Badge, we will apply a multiplier of 2X to count your trading volume. Top 100 accounts by aggregate trading volume across all wallets linked to the same o1 account: | Rank | Reward per Account (\\$ZORA) | | ------ | --------------------------- | | 1 | 29,738.75 | | 2 | 26,523.75 | | 3 | 24,916.25 | | 4 | 21,701.25 | | 5 | 20,093.75 | | 6 | 19,290.00 | | 7 | 16,878.75 | | 8 | 15,271.25 | | 9 | 12,860.00 | | 10 | 12,056.25 | | 11–15 | 4,822.50 | | 16–20 | 3,536.50 | | 21–25 | 2,411.25 | | 26–50 | 1,607.50 | | 51–100 | 382.625 | \## Reward Claims Rewards will be distributed within 7 days of the weekly volume window. Winners must claim rewards within 14 days after each Weekly Campaign Period ends. Unclaimed rewards are forfeited and revert to Zora's control. \# Zora Trading Contest Season 2 Source: https://docs.o1.exchange/getting-started/rewards/zora-trading-contest-season2 Season 2 for Zora Creator and Content Coins ## Contest Overview The second Zora Trading Contest is a competitive campaign with a total reward pool of 1,250,000 \\$ZORA tokens for traders. ### Campaign Duration \*\*January 5, 2026 - January 12, 2026\*\* Contest ends at 12:00 AM PDT (7:00 AM UTC) on January 12, 2026 \## Rewards Pool \*\*1,250,000 \\$ZORA\*\* Allocated to top 100 winners during the contest week \## Eligibility Requirements Only trades executed directly through o1.exchange count toward eligibility. External trades (including after wallet export) are not eligible. \## Eligible Trading Activity The contest tracks bona fide trades of: \* \*\*Zora Creator Coins\*\* \* \*\*Zora Content Coins\*\* All trades must be executed via the o1.exchange platform to qualify for leaderboard rankings. ## Weekly Leaderboards & Rewards Each week features a volume-based leaderboard with the following reward structure: ### Volume Leaderboard (1,250,000 \\$ZORA total) For users with Base Wizard Badge, we will apply a multiplier of 2X to count your trading volume. Top 100 accounts by aggregate trading volume across all wallets linked to the same o1 account: | Rank | Reward per Account (\\$ZORA) | | ------ | --------------------------- | | 1 | 119,047.50 | | 2 | 106,095.00 | | 3 | 99,665.00 | | 4 | 86,805.00 | | 5 | 80,375.00 | | 6 | 77,160.00 | | 7 | 67,515.00 | | 8 | 61,085.00 | | 9 | 51,440.00 | | 10 | 48,225.00 | | 11–15 | 19,290.00 | | 16–20 | 14,146.00 | | 21–25 | 9,645.00 | | 26–50 | 6,430.00 | | 51–100 | 1,530.50 | \## Reward Claims Rewards will be distributed within 7 days of the contest end. Winners must claim rewards within 14 days after the Contest Period ends. Unclaimed rewards are forfeited and revert to Zora's control. \# Sign Up for o1.exchange Source: https://docs.o1.exchange/getting-started/signup Quick onboarding ## Create Your Account ### Account Creation Go to \[o1.exchange\](https://o1.exchange) and click the "Enter App" button There are 3 signup options: 1. Gmail account 2. One time password for any email you choose 3. Wallet logins including Phantom, Backpack, MetaMask, Rabby, Coinbase, and over 120 wallet options. Set up your trading profile and preferences \## Next Steps After creating your account: 1. \*\*Fund Your Wallet\*\*: Ensure you have sufficient balance on supported networks 2. \*\*Explore the Platform\*\*: Familiarize yourself with the trading interface 3. \*\*Join the Community\*\*: Connect with other traders on Discord 4. \*\*Start Trading\*\*: Begin with small positions to get comfortable with the platform \[Start Trading Now\](https://o1.exchange) - Create your account and join thousands of traders on o1.exchange \# o1.exchange - Democratizing Alpha for Traders Source: https://docs.o1.exchange/introduction The Ultimate Trading Terminal for DeFi o1.exchange represents the pinnacle of high-frequency trading infrastructure on-chain — architected for unparalleled execution speed, engineered for quantitative edge, and optimized for full-range traders, from beginners to the pro. o1.exchange is the next-generation trading platform built for the DeFi ecosystem, combining institutional-grade infrastructure with an intuitive user experience for traders of all levels. ## Unmatched Trading Performance Achieve microsecond-level transaction finality for optimal trade execution Leverage proprietary algorithms designed for maximum market advantage Intuitive interface that scales from beginners to professional traders \## Powered by Advanced Intelligence Our platform identifies profitable trading opportunities before they appear in market prices, giving you the edge to act first. Comprehensive analysis of on-chain metrics, social sentiment, and liquidity patterns delivered in real-time to inform your trading decisions. Access exclusive market insights typically reserved for institutional traders, now available on our platform. \## Full-spectrum Trading Ecosystem Trade memecoins with confidence using our advanced predictive analytics that help identify trends before the market. Access a wide range of tokenized equities and synthetic assets all from one unified platform. Seamlessly trade across multiple blockchains with our unified liquidity pools and cross-chain infrastructure. Experience the future of trading with o1.exchange - where speed, intelligence, and accessibility converge. \# Smart contract architecture Source: https://docs.o1.exchange/launchpad/architecture/contracts How the factory, launch hook, fee escrow, vesting vault, announcement registry, and launch tokens work together. The production system uses separate contracts for token creation, permanent liquidity, fee balances, vesting, and announcements. Each contract has a narrow responsibility, which makes its authority and custody easier to verify. The creator signs one factory transaction. It creates and distributes the token, opens the Uniswap v4 pool, and places the remaining supply into the permanent liquidity position. The trader signs a swap through Uniswap. The launch hook applies the fee, the user receives the trade output, and the fee escrow records claimable balances. \## Contract responsibilities | Contract | Responsibility | Custody or authority | | --------------------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------- | | Base factory | \`B20LaunchpadFactory\` creates B20 tokens and coordinates their launch | Controls settings for future launches only | | Robinhood factory | \`ERC20LaunchpadFactory\` creates ERC-20 tokens and coordinates their launch | Controls settings for future launches only | | Token deployer | \`LaunchTokenDeployer\` creates the fixed-supply Robinhood token for the launch factory | Callable only by the factory; holds no user funds | | Launch hook | \`LaunchHook\` opens approved pools, owns permanent positions, and applies swap fees | Owns and permanently locks launch liquidity positions | | Fee escrow | \`FeeEscrow\` records and pays each recipient's swap-fee balance | Can pay only balances credited by the hook | | Vesting vault | \`VestingVault\` stores and releases vested allocations | Has no administrator; schedules are set once | | Announcement registry | \`AnnouncementRegistry\` publishes creator-authenticated announcements | Has no token authority and holds no funds | | Robinhood token | \`LaunchToken\` is the fixed-supply ERC-20 implementation | Has no owner or administrative control | ## Factory: launch coordination \`createLaunch\` coordinates the complete launch. The Base factory creates a native B20 token, while the Robinhood factory creates a fixed-supply ERC-20. Both then follow the same distribution and market-opening process. | Stage | Factory behavior | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | Validate | Confirms the selected quote, creation fee, deadline, supply distribution, vesting schedules, profile-editing choice, and launch limits | | Create token | Creates the fixed supply and verifies the expected immutable token properties | | Distribute | Sends immediate allocations to recipients and vested allocations to \`VestingVault\` | | Configure market | Records the creator, platform fee receiver, fee split, anti-snipe schedule, currencies, and exact pool identity with \`LaunchHook\` | | Open pool | Initializes the Uniswap v4 pool at the configured opening price | | Seed liquidity | Sends the remaining token supply to the permanent position owned by the hook | | Publish result | Emits the token address, creator, pool ID, quote, supply, and spacing in \`Launched\` | The factory owner may update quote currencies, supply, opening prices, liquidity ranges, fees, the platform fee receiver, and announcement support for future launches. Those changes cannot rewrite a completed token or pool. ## LaunchHook: market enforcement Each pool receives a frozen configuration when it is created. The hook then enforces the launch market throughout its lifetime. | Responsibility | Behavior | | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | Pool gate | Accepts initialization only for a factory-registered launch | | Liquidity seed | Creates the token-only position and verifies that no quote currency is required | | Permanent lock | Rejects every removal and every external liquidity addition | | Anti-snipe | Calculates the timestamp-based opening surcharge in quote currency | | Fee accounting | Splits the base fee between creator, platform, and valid referrer | | Trade record | Publishes the executor, referrer, fee currency, fee amount, and optional comment in the \`Trade\` event; swap direction comes from the matching Uniswap event | During the opening anti-snipe period, \`LaunchHook\` keeps o1's input-amount buy and sell flow open while applying the temporary surcharge. It rejects exact-output requests until the total fee reaches the normal 1% rate. The detailed callback and function surface is available in \[Functions and events\](/launchpad/reference/events-functions). ## Escrow, vesting, and announcements \`FeeEscrow\` tracks claimable balances. Anyone can trigger payment to the recorded recipient, while a recipient can also redirect their own claim. Only the launch hook can add new fee credits. \`VestingVault\` shows each schedule and the amount available now. Anyone can trigger a claim, but payment always goes to the recorded beneficiary. Only the factory can create a schedule, and no administrator can change or recover it later. \`AnnouncementRegistry\` records the creator at launch. That creator can later post announcements with a unique ID, description, and URI without receiving any token administration role. ## Trust boundaries \* The factory owner can change defaults for launches that have not happened yet. \* The factory owner cannot change an existing pool or token. \* The hook can credit fees only according to frozen pool configuration. \* The escrow can pay only swap fees already credited to it. \* The vesting vault can send tokens only to the recorded beneficiary. \* Transaction signing stays in the user's wallet; o1 services never hold signing keys. # Configuration and governance Source: https://docs.o1.exchange/launchpad/architecture/deployment-governance What o1 governance can change for future launches and which properties remain permanent after a token launches. o1 Launchpad uses one current production contract set for new tokens on each supported chain. Base creates native B20 tokens, while Robinhood creates fixed-supply ERC-20 tokens. Both use the same launch model, fee system, vesting rules, announcements, and permanent Uniswap v4 liquidity. ## Who controls what | Area | Current authority | Boundary | | ------------------------------- | ------------------------------------ | ---------------------------------------------------------------- | | Future launch settings | Launchpad governance owner | Changes apply only to launches created afterward | | Creation and platform swap fees | Platform fee receiver | Receives fees but cannot control tokens or pools | | Token profile editing | Creator, only when enabled at launch | Limited to supported profile information | | Announcements | Recorded launch creator | Can publish updates but receives no token or liquidity control | | Vested allocations | Vesting contract | Releases tokens only to the beneficiary on the original schedule | | Permanent liquidity | Launch hook | Cannot be removed, transferred, or redirected | The current governance owner and platform fee receiver are listed in \[Production contracts\](/launchpad/reference/production-contracts#governance-and-fee-recipient). ## Settings for future launches Governance can update these defaults: \* supported quote currencies and their creation fees; \* the opening price used for each quote; \* fixed token supply within the contract caps; \* liquidity range settings; \* the base fee, anti-snipe fee, recipient split, and platform fee receiver; \* announcement support. The interface refreshes the current settings before a creator signs. If the settings change while a prepared transaction is pending, the transaction stops instead of silently using different economics. ## What becomes permanent When a launch succeeds, the following properties are fixed for that launch: \* token address and total supply; \* creator and selected quote currency; \* opening pool and liquidity range; \* creator, platform, and referral fee settings; \* anti-snipe start time and duration; \* immediate allocations and vesting schedules; \* permanent liquidity position. Future governance changes cannot mint more tokens, modify an existing vesting schedule, change an existing pool's fee recipients, or remove its liquidity. ## Token authority Tokens launch without an owner who can mint, pause, upgrade, or take balances. Creators can optionally keep a limited permission to edit token profile information. Announcements are handled separately and do not grant control over token transfers or liquidity. ## Current configuration The human-readable values are listed in \[Live configuration\](/launchpad/reference/live-configuration). Developers can use the \[machine-readable production snapshot\](/launchpad/reference/production-deployments.json) and should refresh changeable values from the active factory before preparing a transaction. # Interface and data flow Source: https://docs.o1.exchange/launchpad/architecture/frontend-indexer How the o1 Launchpad home, create, token, and profile pages connect wallet actions with live and indexed chain data. The o1 Launchpad interface combines wallet-signed actions, live contract reads, Uniswap v4 market data, public token profiles, and confirmed chain events. The blockchain remains authoritative for tokens, pools, balances, vesting, fees, and ownership. ## Main pages | Page | What users can do | | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Home | Discover launches, view \*\*Trending now\*\*, sort the feed by market cap, trending, newest, or 24-hour volume, and filter by quote currency | | Create | Configure token identity, quote currency, optional allocations and vesting, preview the result, and sign the launch transaction | | Token | Review the token and creator, view the chart and market statistics, trade, inspect holders and vesting schedules, read announcements, add comments, and copy a token referral link | | Profile | View a creator's launches and public identity; connected owners can edit their o1 profile, claim fees and vested tokens, review referrals, and manage supported token profile or announcement features | \*\*Trending now\*\* is a discovery view based on indexed market activity. Ranked views also require adequate pool coverage and current market data, and placement is dynamic. They are not recommendations or guarantees of future performance. Global search accepts a token name, symbol, creator address, or token address and provides trending, new, recent, and quote-filtered views. A creator's signed o1 profile, including its display name, bio, avatar, and socials, is separate from the optional onchain token profile permission chosen for each launch. ## Token creation flow The creator enters the token identity, socials, quote currency, optional distributions, vesting, and profile-editing preference. The page previews the fixed supply, opening value, creation fee, and permanent pool. The o1 confirmation screen shows the quote, supply, creation fee, allocation and vesting totals, projected pool share, profile permission, and the predicted Base address when applicable. After the creator confirms the review, the interface stores the public token profile on IPFS, refreshes the selected quote, launch settings, and chain time, and requests a stablecoin fee approval when needed. The creator then confirms the launch transaction in their wallet. After confirmation, the token page presents the new token, live Uniswap market, allocation disclosures, vesting status, trades, holders, and public announcements. The wallet is the only signing surface. o1's interface and data services never hold the user's private key. ## Trading flow The token page asks Uniswap v4 for a quote based on how much the trader wants to spend or sell. The interface applies the selected slippage limit and a 10-minute deadline, then asks the wallet to submit the swap through Uniswap's Universal Router. The wallet includes ETH in the swap transaction. No token approval is needed for the ETH input. When needed, the wallet first approves Uniswap's Permit2 contract and signs a time-limited Universal Router authorization. The submitted swap still uses only the amount shown for that trade. The same flow carries an optional referral and public trade comment. o1 always submits input-amount swaps, so its normal buy and sell flow remains available during the opening anti-snipe period. ### Trade safeguards | Setting | Current interface behavior | | ---------------------- | ---------------------------------------------------- | | Automatic slippage | 1% | | Quick choices | 0.5%, 2%, or 3% | | High-slippage handling | Warns at 5% or higher and prevents submission at 50% | | Price impact | Warns at 25% or higher | | Swap deadline | 10 minutes from submission | ## Referral journey \* A profile's \*\*Referral\*\* action copies a global referral link. \* A token page's \*\*Referral link\*\* action copies a link for that token and chain. \* A public \*\*Profile\*\* link is separate and does not set attribution by itself. \* Token-specific attribution takes priority for that token. A previously saved global attribution is the fallback. \* The interface may request one gasless signature to associate a browser-saved global referral with a connected wallet. See \[Fees, anti-snipe, and referrals\](/launchpad/trading/fees-referrals) for the full precedence and validation rules. ## Live and indexed information | Source | Used for | | ------------------------ | ----------------------------------------------------------------------------- | | Launch contracts | Current launch settings, fee balances, vesting state, and creator permissions | | Uniswap v4 | Pool price, swap quotes, liquidity state, and transaction simulation | | Confirmed chain events | Launches, trades, claims, distributions, announcements, and profile updates | | IPFS | Public token image and profile document | | Indexed application data | Search, feeds, charts, holder views, histories, and wallet dashboards | After a transaction confirms, a page may briefly show that it is syncing while the indexed view updates. Live contract state and confirmed chain events remain the source of truth. # Allocations and vesting Source: https://docs.o1.exchange/launchpad/create/allocations-vesting Distribute tokens at launch through immediate allocations or fixed staircase vesting without adding control to the token. Allocations are optional and are deducted from the supply placed into the pool. They must be fully specified before the launch transaction is signed. ## Allocation types The recipient receives the specified token amount in the launch transaction and can transfer it immediately. The vesting contract receives the amount at launch and releases it to the beneficiary at the chosen milestones. No administrator can change the recipient or schedule later. \## Current caps | Constraint | Limit | | -------------------------------- | ------------------------------------- | | Immediate plus vested recipients | 128 total | | Vested beneficiaries | 64 | | Steps per beneficiary | 24 | | Vesting steps across the launch | 128 | | First unlock | At least 1 day after launch | | Final unlocked percentage | Exactly 100% | | Total allocated amount | Strictly less than total token supply | Recipient addresses must be valid and unique across both allocation types. Launch system contracts cannot be used as recipients. ## Pool coverage and discovery Immediate and vested allocations reduce the number of tokens placed into permanent liquidity. o1 recommends leaving at least \*\*25% of the fixed supply\*\* in the pool for healthier market depth. This is a market-quality recommendation, not the contract minimum. The create form and final review show the projected pool share before signing. Larger allocations can increase price impact and volatility, and very low pool coverage can make a launch ineligible for ranked discovery views such as Trending, Market Cap, or 24-hour Volume. New, search, the token page, and trading remain available. Ranked placement is never guaranteed. ## Staircase schedules Each step contains: \* the number of days after launch; \* the percentage released at that step. The interface accepts whole days and percentages with up to two decimal places. Step percentages must add up to 100%, and the preview shows both the newly released share and the cumulative amount available by each date. For a 1,000,000 token allocation: | Day | Newly unlocked | Total unlocked | Total tokens available | | --: | -------------: | -------------: | ---------------------: | | 30 | 20% | 20% | 200,000 | | 90 | 30% | 50% | 500,000 | | 180 | 50% | 100% | 1,000,000 | Nothing streams between steps. At day 89, only the first 200,000 tokens are vested. At day 90, the cumulative vested amount becomes 500,000. ## Validation rules For every schedule: 1. unlock dates must strictly increase; 2. every step must release a positive percentage; 3. step percentages must add up to exactly 100%; 4. rounded cumulative token amounts must strictly increase; 5. the first point must be at least one day after launch. For very small allocations, each milestone must unlock at least some additional token amount. A step that rounds to the same amount as the previous step is rejected. ## Claims and guarantees The vesting contract has no administrator. Nobody can withdraw locked tokens early, change a schedule, replace a beneficiary, or redirect a claim. Anyone may trigger a claim, but the tokens always go to the beneficiary chosen at launch. The app shows the total allocation, amount already claimed, schedule, and amount available now. For a larger claim campaign, an immediate allocation can fund a separately deployed and audited Merkle claim contract. See \[Plan your launch\](/launchpad/launch-planning#optional-airdrop-claim-tool). \# Token creation Source: https://docs.o1.exchange/launchpad/create/token-creation Create a fixed-supply Base B20 or Robinhood ERC-20 token, publish its profile, distribute allocations, and open permanent liquidity. Every launch creates a new fixed-supply token and opens its Uniswap v4 market in the same transaction. The creator does not deposit quote currency and cannot create more tokens later. ## Form fields | Field | Requirement | | ----------------------- | ----------------------------------------------------------------------------- | | Name | Required, maximum 50 characters | | Symbol | Required, maximum 11 characters, no spaces; the UI normalizes it to uppercase | | Image | Required, maximum 2 MB; PNG, JPG, WEBP, or GIF | | Quote | Required; ETH or USDC on Base, ETH or USDG on Robinhood | | Description | Optional, included in the token's public IPFS profile | | Website | Optional valid website URL | | X | Optional X profile URL | | Telegram | Optional Telegram link | | Extra information | Optional public key/value entries; keys cannot be empty | | Profile editing | Optional; grants permission to edit token information only | | Allocations and vesting | Optional launch distributions subject to the contract limits | ## Base address preview For Base launches, the create page previews the B20 token address before signing and searches for an address ending in \`01\`. The creator can refresh the preview before launch. This visual suffix does not change the token's permissions, supply, price, or market. ## Supply and distribution Current launches create a fixed supply of \*\*1 billion (1,000,000,000) tokens\*\*. The supply cannot increase after launch. \`\`\`text theme={null} pool supply = total supply - immediate allocations - vested allocations \`\`\` The supply is divided only once: \* immediate allocations go directly to recipient wallets; \* vested allocations go to the vesting contract and unlock on the chosen schedule; \* every remaining token goes into the permanent Uniswap liquidity position. Allocations and vesting must leave some tokens for the market, so no launch can allocate the entire supply away from liquidity. ## Token implementation The protocol creates a native B20 token with no administrator. Its 1 billion supply is created once. The creator may optionally retain permission to edit profile information, but cannot mint more tokens or control transfers. Base's B20 protocol contracts are listed in \[Production contracts\](/launchpad/reference/production-contracts). o1 creates a standard fixed-supply ERC-20 with no owner. Its 1 billion supply is created once, and the contract cannot mint more tokens, pause transfers, or be upgraded. The token supports normal ERC-20 transfers and approvals. Optional profile editing does not grant control over balances or the market. \## Profile editing The default is no ongoing authority. If the creator opts in, they may update token profile information after launch. The creator can update: \* token name; \* token symbol; \* public profile information, including the image, description, website, X, and Telegram; \* extra profile information. This permission cannot create more tokens, change balances, pause transfers, upgrade the token, or remove liquidity. ## Transaction safety The factory rejects a launch if: \* the quote is no longer registered; \* the unique launch identifier was already used; \* the launch settings changed after the app prepared the transaction; \* the deadline has passed; \* the creation fee is wrong or cannot be transferred exactly; \* allocation, vesting, profile, or liquidity requirements fail; \* the token cannot be created exactly as shown; \* opening the pool would require the creator to supply quote currency. The frontend refreshes the launch settings and chain time immediately before submission. If launch economics change while the transaction is pending, the call stops instead of silently launching with different settings. ## Creation result After confirmation, the app shows the token address and live pool. It also records the final distribution, vesting schedules, creation fee, and market settings from the confirmed transaction. Developers can find exact function and event names in \[Functions and events\](/launchpad/reference/events-functions). # How it works Source: https://docs.o1.exchange/launchpad/how-it-works The complete o1 Launchpad lifecycle from setup and token creation to trading, fee claims, announcements, and vesting claims. Creators use the o1 interface to configure a token and approve the launch transaction in their wallet. A stablecoin creation fee may require a token approval first. The launch contracts then create the token and its Uniswap market together. The blockchain is the source of truth, while o1 organizes confirmed public data so launches, trades, fees, and vesting are easy to view. ## End-to-end lifecycle The creator supplies a name, symbol, image, quote currency, optional links and description, immediate allocations, vesting schedules, and a profile-editing preference. The o1 confirmation screen presents the quote, fixed supply, creation fee, allocation and vesting totals, projected pool share, profile permission, and the predicted Base address when applicable. After the creator confirms the review, the app stores the token image and public profile on IPFS, includes that metadata link in the launch request, and refreshes the selected quote, creation fee, supply, liquidity settings, and current chain time. For an ETH launch, the wallet includes the creation fee in the launch transaction. A stablecoin launch may first ask for token approval. The creation fee goes directly to the platform fee receiver. On Base, the protocol creates a native B20 token with no administrator. On Robinhood, o1 creates a fixed-supply ERC-20 with no owner or additional minting function. The fixed 1 billion supply is created once and divided between permanent pool liquidity, immediate recipient wallets, and any vesting schedules. The launch contracts open the Uniswap v4 pool at the configured starting price. The part of the supply not allocated to recipients or vesting is placed into permanent liquidity. After confirmation, the launch page shows the token profile, live market, trading interface, allocation disclosures, vesting status, trades, holders, and announcements. \## Where each asset lives | Asset | Location | Who can move it | | --------------------- | ------------------------------------------------------- | --------------------------------------------------------------- | | Tradable token supply | The permanent Uniswap liquidity position | The launch contracts prevent its removal | | Immediate allocations | Recipient wallets | Each recipient | | Vested allocations | The vesting contract | Claims always go to the beneficiary chosen at launch | | Creation fee | Platform fee receiver wallet | That wallet | | Accrued swap fees | A dedicated claimable balance for each recipient | Creator, platform, or valid referrer according to the fee split | | User trade funds | The user's wallet and the Uniswap pool during the trade | The transaction approved by the user | ## Swap lifecycle The interface shows the input amount, estimated output, minimum received, price impact, current fee, slippage limit, and estimated network fee. It automatically applies a 10-minute transaction deadline. The wallet submits a trade for the amount the user chose to spend or sell. Uniswap calculates the result, and the launch contract applies the swap fee in the pool's quote currency. The user receives the purchased or sold asset. Creator, platform, and valid referrer fee balances become claimable independently. Trading begins immediately. o1 uses input-amount swaps for both buys and sells: the trader chooses how much to spend or sell, and the interface protects the minimum amount received with a slippage limit. These swaps remain available while the anti-snipe fee decreases during the first 16 seconds. ## Chain-specific token creation The protocol creates a native B20 token with a fixed supply and no administrator. If the creator opts in, they may retain permission to update profile information only. o1 creates a standard ERC-20 with a fixed supply. It has no owner and no function to mint more tokens, pause transfers, upgrade the contract, or recover tokens. \## Profile information, comments, and announcements | Feature | How it appears | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | Token profile | The image, description, website, X, Telegram, and other public fields are loaded from the IPFS metadata referenced by the token | | Profile updates | When profile editing is enabled, the creator wallet can update the supported token identity and public information | | Trade comments | A trader may attach a short comment of up to 32 UTF-8 bytes; it becomes public onchain data | | Creator announcements | The creator recorded at launch can publish updates through the separate announcement contract | Comments and announcements are public onchain records. Announcements use a separate contract, so the creator does not gain permission to create tokens, control transfers, or remove liquidity. ## What can change later o1 governance can update supported quote currencies, opening prices, creation fees, supply, liquidity settings, swap fees, and the announcement contract for \*\*future\*\* launches. Each completed launch keeps its token, creator, fee settings, opening price, liquidity range, and permanent position. Later configuration changes apply only to new launches. # Data and AI access Source: https://docs.o1.exchange/launchpad/integration/data-ai Public documentation, machine-readable launchpad configuration, onchain data, and safe wallet-based agent workflows. o1 Launchpad documentation and production configuration are available in formats that work for people, search tools, coding agents, and other AI clients. ## Documentation resources | Resource | Access | Use | | ------------------- | -------------------------------------------------------- | ----------------------------------------------------------------- | | Documentation index | \[Open \`llms.txt\`\](https://docs.o1.exchange/llms.txt) | Discover available documentation pages | | Full documentation | \[Open full text\](https://docs.o1.exchange/llms-full.txt) | Retrieve the public documentation as one text corpus | | Page Markdown | Add \`.md\` to a documentation page URL | Retrieve clean context for one page | | Skill description | \[Open \`skill.md\`\](https://docs.o1.exchange/skill.md) | Read the documentation's agent-facing capability summary | | Documentation MCP | \`https://docs.o1.exchange/mcp\` | Connect an MCP client to search and retrieve public documentation | The MCP URL is a client endpoint, not a web page. Opening it directly in a browser may return a method-not-allowed response. \## Machine-readable production configuration \[\`production-deployments.json\`\](/launchpad/reference/production-deployments.json) provides the current Base and Robinhood contract addresses, Uniswap dependencies, quote currencies, fees, opening settings, governance addresses, and contract caps. The file is a dated public snapshot. Applications that prepare transactions should also read the current factory configuration before asking a wallet to sign. ## Public market and launch data The o1 interface presents: \* launch discovery, search, newest tokens, market-cap ranking, trending, and 24-hour volume; \* token profiles, creators, socials, and explorer links; \* pool price, FDV, liquidity, charts, recent trades, and holders; \* immediate allocations and vesting schedules; \* creator announcements and token profile updates; \* creator, referral, platform, and vesting claim information. Contract state and chain events are the authoritative sources for tokens, pools, trades, fees, claims, and vesting. The interface adds searchable and historical views around that public data. ## Safe agent workflow Retrieve the relevant documentation, production addresses, and live contract configuration. Build the launch, trade, or claim request with the selected chain, current fees, recipients, slippage, and deadline. Present the contract, assets, amounts, recipients, and expected outcome before requesting approval. The user reviews and signs in their wallet. Documentation and data tools never need the private key. Agents and integrations should never store a private key, auto-sign transactions, or reuse a stale factory configuration. # Direct contract integration Source: https://docs.o1.exchange/launchpad/integration/direct Read current launch configuration, build safe launch transactions, trade through Uniswap v4, and consume canonical launch events. This page intentionally uses exact contract fields for developers. For a plain-language product flow, start with \[How it works\](/launchpad/how-it-works). Direct integrations should discover the active chain, read current factory state, build an unsigned transaction, and let the user's wallet sign it. Never hardcode a mutable configuration version or creation fee. ## Integration sequence Use only the current Base or Robinhood factory from \[Production contracts\](/launchpad/reference/production-contracts). Read \`configVersion\`, \`launchSupply\`, \`tickSpacing\`, \`feeDefaults\`, \`bands\`, and \`quotes(selectedQuote)\` at one recent block. Apply the hard limits in \[Limits and validation\](/launchpad/reference/limits), confirm the quote remains registered, and calculate the pool supply after allocations. For native quote, set transaction value to the exact creation fee. For ERC-20 quote, ensure the factory allowance covers the exact creation fee. Set \`expectedConfigVersion\` to the fresh read and choose a short chain-time deadline. The o1 Launchpad interface uses the latest block timestamp plus 30 minutes. Simulate \`createLaunch\`, present all recipients and economics to the user, then request a wallet signature and wait for a successful receipt. Read \`Launched\` for token and pool ID, then index the other factory, hook, PoolManager, escrow, vesting, and announcement events from the same transaction. \## Read the current snapshot with viem The example below reads Base. For Robinhood, use a Robinhood Chain client and the current Robinhood factory and quote addresses from \[Production contracts\](/launchpad/reference/production-contracts). \`\`\`ts theme={null} theme={null} import { createPublicClient, http, parseAbi, zeroAddress } from "viem"; import { base } from "viem/chains"; const FACTORY = "0xa52ad458cE0282a971ecC71C051A32f28946bb9F"; const factoryReads = parseAbi(\[ "function configVersion() view returns (uint64)", "function launchSupply() view returns (uint256)", "function tickSpacing() view returns (int24)", "function quotes(address) view returns (bool registered,uint8 decimals,int24 startTickToken0Frame,uint256 creationFee)", "function feeDefaults() view returns (uint16 baseFeeBps,uint16 creatorBps,uint16 platformBps,uint16 referrerBps,uint16 antiSnipeStartTotalBps,uint32 antiSnipeWindowSeconds,address platformTreasury)", \]); const client = createPublicClient({ chain: base, transport: http() }); const \[version, supply, spacing, nativeQuote, fees\] = await Promise.all(\[ client.readContract({ address: FACTORY, abi: factoryReads, functionName: "configVersion" }), client.readContract({ address: FACTORY, abi: factoryReads, functionName: "launchSupply" }), client.readContract({ address: FACTORY, abi: factoryReads, functionName: "tickSpacing" }), client.readContract({ address: FACTORY, abi: factoryReads, functionName: "quotes", args: \[zeroAddress\] }), client.readContract({ address: FACTORY, abi: factoryReads, functionName: "feeDefaults" }), \]); \`\`\` For a transaction integration, obtain the complete verified factory ABI from the chain explorer. \`LaunchParams\` contains nested vesting arrays, so a partial handwritten write ABI is easy to get wrong. \`startTickToken0Frame\` is the factory's internal opening-price encoding for a registered quote. The factory handles token ordering and tick spacing when it creates the pool; a launch transaction selects the quote and does not submit a starting tick. ## \`LaunchParams\` | Field | Meaning | | ------------------------------------------- | ------------------------------------------------------- | | \`name\`, \`symbol\` | Token identity | | \`contractURI\` | Pinned token metadata URI | | \`salt\` | User salt, scoped by factory to the caller | | \`quote\` | Registered quote address; zero address means native ETH | | \`allocationRecipients\`, \`allocationAmounts\` | Parallel immediate allocation arrays | | \`vestedAllocations\` | Beneficiary, amount, and cumulative staircase steps | | \`expectedConfigVersion\` | Exact fresh factory version | | \`deadline\` | Latest allowed chain timestamp | | \`roleMode\` | \`0\` for immutable metadata, \`1\` for metadata authority | | \`metadataKeys\`, \`metadataValues\` | Parallel on-chain metadata arrays | ## Trading integration Launch pools are ordinary Uniswap v4 pools with a required hook. Use the listed v4 Quoter for price discovery and the Universal Router plus Permit2 for execution. Preserve the exact pool key: sorted currencies, LP fee \`0\`, launch tick spacing, and the active hook address. \`tickSpacing\` is part of the exact Uniswap pool identifier and controls valid liquidity range boundaries. The current value \`200\` represents about 2.02% between allowed boundaries; it does not make swap prices move in fixed 2.02% increments. Use exact-input during the anti-snipe window. Encode optional hook data as the referrer address followed by a \`bytes32\` comment. Simulate at current timestamp and include slippage and deadline protection. ## Failure handling Treat \`StaleConfig\` and \`LaunchExpired\` as refresh-and-rebuild errors. Treat quote removal, fee mismatch, allocation validation, salt reuse, immutability, and single-sided failures as blocking errors that require changed inputs or configuration. Do not silently fall back to another factory or quote. # Introduction Source: https://docs.o1.exchange/launchpad/introduction Create a fixed-supply token with a live Uniswap v4 market, permanent liquidity, flexible allocations, vesting, and built-in fee sharing. o1 Launchpad turns a token concept into a live onchain market. Creators configure the token, choose a quote currency, define any allocations or vesting, and launch with permanently locked Uniswap v4 liquidity. Current launches create exactly 1 billion tokens with 18 decimals. Current launches target an opening fully diluted valuation close to USD 4,000. The Uniswap v4 market opens at launch, and its liquidity is permanently locked by the launch contracts. Creators can send tokens to selected wallets immediately or place them in fixed vesting schedules. \## Current production model | Property | Current value | | ------------------ | ---------------------------------------------------------------------------------------------- | | Production chains | Base mainnet (\`8453\`) and Robinhood Chain (\`4663\`) | | Token type | Native B20 token on Base; fixed-supply ERC-20 on Robinhood | | Supply | 1,000,000,000 tokens, 18 decimals | | Opening FDV | Close to USD 4,000 at the configured opening price | | Pool | A real Uniswap v4 market between the launch token and its selected quote currency | | Liquidity | Every token left after allocations and vesting, added without a creator quote deposit | | Lock | Permanent and enforced by the launch contracts | | Base swap fee | 1% in the quote currency | | Fee split | 50% creator, 30% platform, 20% referrer of the base fee | | Anti-snipe | Trading stays open while the total fee decreases from 99% to 1% over the first 16 seconds | | Creation fee | 0.001 ETH or 2 USDC on Base; 0.001 ETH or 2 USDG on Robinhood | | Optional at launch | Immediate allocations, staircase vesting, editable profile information, socials, announcements | These settings were verified on \*\*July 13, 2026\*\*. They may change for future launches, so developers should read the current values before building a transaction. See \[Live configuration\](/launchpad/reference/live-configuration). ## From token setup to live market Choose the token identity, quote currency, profile-editing preference, allocations, and vesting. The launch contracts create 1 billion tokens and distribute any immediate or vested allocations. The remaining supply is placed into the token's Uniswap v4 pool, permanently locked, and available for trading immediately. Trading fees, referrals, vesting claims, token profile tools, and creator announcements become available through the token and profile pages. The Uniswap v4 pool is the token's market from launch. Buyers exchange quote currency for tokens from the locked position. As trading continues, quote currency accumulates inside the same position and remains part of its permanent liquidity. ## Choose a path Identity, metadata, quote selection, allocations, vesting, and the wallet transaction. Opening-price assumptions, changing pool inventory, and the permanent liquidity lock. Creation fees, the anti-snipe clock, swap fees, referrals, and comments. Choose allocations, vesting, profile control, announcements, and optional airdrop claim tools. \# Plan your launch Source: https://docs.o1.exchange/launchpad/launch-planning Choose the token setup, distribution, vesting, profile control, announcements, and optional airdrop claim tools that fit your launch. o1 Launchpad provides the core pieces needed to create a token and open its permanent onchain market. Supply distribution, vesting, and the profile-editing choice are committed at launch, so creators and communities can understand the setup before trading begins. ## Built-in launch options | Option | How it works | Best for | | --------------------- | ---------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | | Quote currency | Choose ETH or the supported stablecoin for the selected chain | Defining the market pair and creation-fee currency | | Immediate allocations | Send tokens directly to unique recipients at launch | Treasury, community, contributor, or partner allocations | | Staircase vesting | Lock allocations with dated milestones that no administrator can change | Team and contributor distributions | | Profile editing | Optionally let the creator wallet update the token name, symbol, profile link, and extra information | Projects that expect their public profile to evolve | | Fixed profile | Launch without profile editing permission | Projects that want token information fixed from launch | | Social links | Publish website, X, Telegram, description, image, and extra metadata | Token discovery and profile context | | Creator announcements | Post updates through the separate announcement contract | Public milestones and launch communications | | Referral attribution | Attach a valid referrer to a trade | Community and partner growth programs | ## A practical launch flow Select the chain and quote currency. The quote determines the market pair, opening-price configuration, creation fee, and currency used for swap-fee claims. Decide how much supply enters the pool and whether any recipients receive immediate or vested allocations. All allocations are deducted from the fixed 1 billion token supply. o1 recommends leaving at least 25% in permanent liquidity. Keep profile information fixed or allow the creator wallet to edit it. This choice never allows new tokens to be created, transfers to be paused, the token to be upgraded, or liquidity to be removed. Confirm the opening-price assumption, approximate FDV, creation fee, base swap fee, fee recipients, and 16-second anti-snipe schedule shown by the application. Sign from the creator wallet, wait for confirmation, then use the token page and announcement registry to share updates with the community. \## Distribution examples Place most or all of the supply into permanent liquidity. Add a small set of immediate community or partner allocations only when needed. Send a treasury allocation directly to its destination and place contributor allocations into staircase vesting. Recipients and schedules are public from launch. Keep the pool as the primary distribution path, enable creator announcements, and use referrals to attribute community-driven trading activity. \## Optional airdrop claim tool A team can fund a compatible Merkle claim contract through an immediate allocation, then publish its eligibility list and claim instructions. Review the claim contract, eligibility process, expiry, and unclaimed-token rules before launch. These rules control the airdrop only; the launch market remains open to everyone. ## Before you launch \* review every allocation recipient and amount; \* review the projected pool share and any low-coverage warning; \* confirm that each vesting schedule ends at 100%; \* enable profile editing only when ongoing updates are needed; \* check the selected quote, opening-price assumption, approximate FDV, creation fee, and fee split; \* confirm the creator and referral addresses; \* open the final transaction details in the wallet before signing; \* publish the token address, pool, allocations, and vesting terms after confirmation. # Functions and events Source: https://docs.o1.exchange/launchpad/reference/events-functions Public functions, important reads, and events for the current o1 Launchpad contracts. This developer reference summarizes the public contract surface. Use the verified explorer ABI for exact transaction encoding. ## Launch factories Base uses \`B20LaunchpadFactory\`; Robinhood uses \`ERC20LaunchpadFactory\`. Both expose the same launch flow. | Surface | Important members | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | | Create | \`createLaunch(LaunchParams)\` creates the token, distributes allocations, registers vesting, opens the pool, and seeds permanent liquidity | | Configuration reads | \`quotes\`, \`feeDefaults\`, \`launchSupply\`, \`tickSpacing\`, \`bands\`, \`announcementRegistry\`, and \`vestingVault\` | | Transaction-safety reads | \`configVersion\` and \`usedLaunchSalts\` | | Contract limits | \`MIN\_SUPPLY\`, \`MAX\_SUPPLY\`, \`MAX\_ALLOCATIONS\`, \`MAX\_VESTED\_ALLOCATIONS\`, \`MIN\_VESTING\_DURATION\`, \`MAX\_VEST\_STEPS\`, and \`MAX\_TOTAL\_VEST\_STEPS\` | | Future-launch governance | Quote, opening setting, creation fee, supply, liquidity, fee, treasury, announcement, and ownership updates | ### Launch events | Event | Meaning | | --------------------------------------------------- | ------------------------------------------------------------- | | \`Launched\` | Token, pool ID, creator, quote, supply, and liquidity spacing | | \`LaunchFeePaid\` | Creation-fee payer, quote, fee receiver, and amount | | \`QuoteRegistered\` / \`QuoteUnregistered\` | Supported quote changes | | \`QuoteCreationFeeUpdated\` | Creation-fee change for a quote | | \`BandTemplateUpdated\` | Future liquidity-range change | | \`FeeDefaultsUpdated\` | Future fee split, anti-snipe, or treasury change | | \`LaunchSupplyUpdated\` / \`TickSpacingUpdated\` | Future supply or range-alignment change | | \`OwnershipTransferStarted\` / \`OwnershipTransferred\` | Governance ownership change | ## LaunchHook The hook exposes \`poolConfig\` for each launch pool. The factory registers and seeds a pool; ordinary trading then occurs through Uniswap v4. | Event | Meaning | | ---------------- | ------------------------------------------------------------------------------------------------------------------------ | | \`PoolRegistered\` | The pool's frozen creator, platform fee receiver, and fee settings | | \`Seeded\` | Token amount placed into the permanent position | | \`Trade\` | Executor, referrer, fee currency, fee amount, and optional comment; swap direction comes from the matching Uniswap event | ## FeeEscrow | Function | Who can call | Result | | ---------------------------- | ------------- | ----------------------------------------------- | | \`owed(recipient, currency)\` | Anyone | Returns the raw claimable fee balance | | \`claim(recipient, currency)\` | Anyone | Pays the full balance to the recorded recipient | | \`claimTo(currency, to)\` | Balance owner | Pays the caller's balance to a chosen address | Events: \`Credited\` and \`Claimed\`. ## VestingVault | Function | Who can call | Result | | --------------------------------- | ------------ | -------------------------------------------------------- | | \`claimable(token, beneficiary)\` | Anyone | Returns tokens currently available to claim | | \`getSchedule(token, beneficiary)\` | Anyone | Returns the allocation, claimed amount, and unlock steps | | \`claim(token, beneficiary)\` | Anyone | Sends available tokens to the recorded beneficiary | Events: \`Registered\` and \`Claimed\`. ## AnnouncementRegistry | Function | Who can call | Result | | ----------------------------------- | ---------------- | ----------------------------------------------------- | | \`creatorOf(token)\` | Anyone | Returns the creator allowed to announce for the token | | \`usedId(token, id)\` | Anyone | Checks whether an announcement ID was used | | \`post(token, id, description, uri)\` | Recorded creator | Publishes a unique announcement | Events: \`CreatorRegistered\` and \`Announcement\`. ## Robinhood launch tokens Robinhood tokens expose standard ERC-20 reads and transfers. When profile editing was enabled at launch, the metadata authority can call \`updateName\`, \`updateSymbol\`, \`updateContractURI\`, and \`updateExtraMetadata\`. No mint, burn, pause, owner, upgrade, or recovery function exists. ## Common launch errors | Error | Meaning | | ------------------------------------ | ------------------------------------------------------------------- | | \`StaleConfig\` | Refresh the current factory settings and rebuild the transaction | | \`LaunchExpired\` | Use a fresh deadline | | \`QuoteNotRegistered\` | The selected quote is unavailable | | \`LaunchSaltUsed\` | Use a new launch identifier | | \`InvalidLaunchFeePayment\` | The creation-fee payment was not exact | | \`OutOfBounds\` / \`InvalidConfig\` | A hard limit or related-field rule failed | | \`NotImmutable\` | The created token failed its fixed-authority checks | | \`NotSingleSided\` | Opening liquidity would require quote currency | | \`LiquidityLocked\` | The requested liquidity change is not allowed | | \`ExactOutputDisabledDuringAntiSnipe\` | Use an input-amount trade or wait until the normal fee begins | | \`PartialFillUnsupported\` | The requested quote-specified amount could not be filled completely | # Limits and validation Source: https://docs.o1.exchange/launchpad/reference/limits Current launch defaults, contract hard caps, form limits, allocation rules, vesting rules, fee limits, and quote requirements. The interface checks launch inputs before the wallet asks for a signature. The contracts enforce the hard caps again onchain. ## Current defaults | Setting | Current value | | ------------------ | ----------------------------------------: | | Supply | 1 billion (1,000,000,000) tokens | | Liquidity ranges | 1 | | Base swap fee | 1% | | Starting total fee | 99% | | Anti-snipe period | 16 seconds | | Base-fee split | 50% creator / 30% platform / 20% referrer | ## Contract hard caps | Constraint | Hard limit | | -------------------------------- | --------------------------------: | | Token supply | 1 million to 1 trillion tokens | | Immediate plus vested recipients | 128 total | | Vested beneficiaries | 64 | | Vesting steps per beneficiary | 24 | | Vesting steps across one launch | 128 | | First vesting unlock | At least 1 day after launch | | Liquidity ranges | 1 to 10 | | Base swap fee | At most 10% | | Starting total fee | At most 99% | | Profile authority choice | Fixed profile or editable profile | The supply caps assume the launch token's standard 18 decimals. ## Token fields | Field | Interface limit | | ----------------- | --------------------------------- | | Name | 50 characters | | Symbol | 11 characters with no spaces | | Image | 2 MB; PNG, JPG, WEBP, or GIF | | Website | Valid website URL | | X | Valid X profile URL | | Telegram | Valid Telegram link | | Extra information | Non-empty keys with public values | | Trade comment | 32 UTF-8 bytes | ## Creator profile fields | Field | Interface limit | | ------------ | ---------------------------- | | Display name | 40 characters | | Bio | 180 characters | | Avatar | 2 MB; PNG, JPG, WEBP, or GIF | | Website | Valid website URL | | X | Valid X profile URL | | Telegram | Valid Telegram link | Creator-profile changes use a wallet signature and affect the public o1 profile only. They do not change token permissions, balances, or liquidity. ## Allocation and vesting rules \* every amount must be greater than zero; \* a recipient can appear only once across immediate and vested allocations; \* allocations must leave at least some supply for the market; \* vesting dates must strictly increase; \* each step must release a positive percentage; \* all step percentages must add up to exactly 100%; \* the first unlock must be at least one day after launch; \* each step must release an additional token amount after rounding; \* locked tokens always pay the beneficiary recorded at launch. ## Fee and referral rules \* creator, platform, and referrer shares must add up to 100% of the base fee; \* the starting total fee cannot be lower than the normal base fee; \* the anti-snipe period must be longer than zero; \* the platform fee receiver must be a valid address; \* the trader, creator, platform fee receiver, empty address, and swap router or execution contract cannot receive referral credit for that trade; \* the unused referral share goes to the platform. ## Quote requirements Only quote currencies registered by o1 governance can be selected. Quote tokens must behave like standard ERC-20 tokens. Transfer-tax, rebasing, and other non-standard balance behavior is not supported because it can break pool and fee accounting. ## Transaction checks A launch stops when the selected quote is unavailable, the payment is wrong, the transaction has expired, current settings differ from the values the creator reviewed, recipients or vesting are invalid, or the pool cannot open with token-only liquidity. Developers who need the exact encoded caps and field names can use \[Functions and events\](/launchpad/reference/events-functions) and the \[machine-readable production snapshot\](/launchpad/reference/production-deployments.json). # Live configuration Source: https://docs.o1.exchange/launchpad/reference/live-configuration Current Base and Robinhood launch settings for supply, opening value, liquidity, creation fees, swap fees, and fee recipients. These are the current onchain settings for new launches, checked on \*\*July 13, 2026\*\*. ## Current launch settings Both production chains currently use the same core settings: | Setting | Current value | | --------------------- | ---------------------------------------------------------------------- | | Token supply | 1 billion (1,000,000,000) tokens with 18 decimals | | Opening value | FDV close to USD 4,000 under the quote assumptions below | | Liquidity | One permanent token-side range using all supply left after allocations | | Base swap fee | 1% of the quote amount | | Base-fee distribution | 50% creator, 30% platform, 20% valid referrer | | Anti-snipe fee | Starts at 99% total and decays to 1% over 16 seconds | | Fee currency | The pool's selected quote currency | Creation fees and the platform share of swap fees go to \`0x1cAa...1C90\`. The full address is listed in \[Production contracts\](/launchpad/reference/production-contracts#governance-and-fee-recipient). ## Quotes and creation fees | Chain | Quote | Creation fee | Opening assumption | | --------- | ----- | -----------: | ------------------ | | Base | ETH | 0.001 ETH | ETH at USD 1,800 | | Base | USDC | 2 USDC | USDC at USD 1 | | Robinhood | ETH | 0.001 ETH | ETH at USD 1,800 | | Robinhood | USDG | 2 USDG | USDG at USD 1 | Under these assumptions, each quote is configured to open at an FDV close to USD 4,000. The actual USD value of an ETH-quoted launch changes with the live ETH price. ## Opening value FDV means token price multiplied by the complete fixed supply: \`\`\`text theme={null} opening FDV = opening token price x 1,000,000,000 \`\`\` It is a valuation reference. It is not money raised, quote currency deposited by the creator, or a guaranteed future price. ## Liquidity range The current configuration places all pool supply into one token-side liquidity range beginning at the opening price. \*\*Pool supply\*\* means the fixed token supply minus any immediate and vested allocations. The range boundaries use Uniswap's spacing value of \`200\`, which is about 2.02% between places where a range boundary may be set. This does not make trades or prices move in 2.02% jumps; trading moves continuously through the active liquidity. ## Values that can change Governance may update supply, supported quotes, opening settings, creation fees, liquidity settings, swap fees, the platform fee receiver, and announcement support for future launches. Integrations should read these values from the current factory before preparing a transaction. Once a pool opens, its token supply, creator, quote, opening range, fee settings, anti-snipe timing, allocations, vesting, and permanent liquidity are fixed for that launch. Use \[\`production-deployments.json\`\](/launchpad/reference/production-deployments.json) for exact machine-readable values and \[Production contracts\](/launchpad/reference/production-contracts) for explorer-linked addresses. # Production contracts Source: https://docs.o1.exchange/launchpad/reference/production-contracts Current active o1 Launchpad, Uniswap v4, quote token, and Base B20 addresses for Base mainnet and Robinhood Chain. These are the current production contracts used for new o1 Launchpad tokens on Base and Robinhood Chain. These addresses and connections were verified onchain on \*\*July 13, 2026\*\*. Always confirm the chain ID and active factory before signing. The same-looking address on another chain is not interchangeable. \## Base mainnet Chain ID \`8453\`. View the network on \[Basescan\](https://basescan.org). ### o1 Launchpad contracts | Contract | Address | | --------------------- | ----------------------------------------------------------------------------------------------------------------------- | | B20 Launchpad Factory | \[\`0xa52ad458cE0282a971ecC71C051A32f28946bb9F\`\](https://basescan.org/address/0xa52ad458cE0282a971ecC71C051A32f28946bb9F) | | Launch Hook | \[\`0x985C14BAa2a18316ffdA0aeFB3a632fAdfcA2AcC\`\](https://basescan.org/address/0x985C14BAa2a18316ffdA0aeFB3a632fAdfcA2AcC) | | Fee Escrow | \[\`0xa2cBD9065cec93c443CAFb0837A62800EE7C4A84\`\](https://basescan.org/address/0xa2cBD9065cec93c443CAFb0837A62800EE7C4A84) | | Vesting Vault | \[\`0x3beeA54dB87A632A5FAF20dB6765D3af94c81b31\`\](https://basescan.org/address/0x3beeA54dB87A632A5FAF20dB6765D3af94c81b31) | | Announcement Registry | \[\`0xABDcBE060724b9BEf5A2daad017d9eA3Ed72DE28\`\](https://basescan.org/address/0xABDcBE060724b9BEf5A2daad017d9eA3Ed72DE28) | ### Base B20 protocol contracts | Contract | Address | | ------------------- | ----------------------------------------------------------------------------------------------------------------------- | | B20 Factory | \[\`0xB20f000000000000000000000000000000000000\`\](https://basescan.org/address/0xB20f000000000000000000000000000000000000) | | Activation Registry | \[\`0x8453000000000000000000000000000000000001\`\](https://basescan.org/address/0x8453000000000000000000000000000000000001) | | Policy Registry | \[\`0x8453000000000000000000000000000000000002\`\](https://basescan.org/address/0x8453000000000000000000000000000000000002) | The factory checks activation of \`keccak256("base.b20\_asset")\` before every B20 launch. ### Uniswap and quotes | Contract | Address | | ---------------- | ----------------------------------------------------------------------------------------------------------------------- | | v4 PoolManager | \[\`0x498581fF718922c3f8e6A244956aF099B2652b2b\`\](https://basescan.org/address/0x498581fF718922c3f8e6A244956aF099B2652b2b) | | v4 Quoter | \[\`0x0d5e0F971ED27FBfF6c2837bf31316121532048D\`\](https://basescan.org/address/0x0d5e0F971ED27FBfF6c2837bf31316121532048D) | | v4 StateView | \[\`0xA3c0c9b65baD0b08107Aa264b0f3dB444b867A71\`\](https://basescan.org/address/0xA3c0c9b65baD0b08107Aa264b0f3dB444b867A71) | | Universal Router | \[\`0x6fF5693b99212Da76ad316178A184AB56D299b43\`\](https://basescan.org/address/0x6fF5693b99212Da76ad316178A184AB56D299b43) | | Permit2 | \[\`0x000000000022D473030F116dDEE9F6B43aC78BA3\`\](https://basescan.org/address/0x000000000022D473030F116dDEE9F6B43aC78BA3) | | Native ETH | \`0x0000000000000000000000000000000000000000\` | | USDC | \[\`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\`\](https://basescan.org/address/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913) | ## Robinhood Chain Chain ID \`4663\`. View the network on \[Robinhood Chain Blockscout\](https://robinhoodchain.blockscout.com). ### o1 Launchpad contracts | Contract | Address | | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | | ERC-20 Launchpad Factory | \[\`0x411F21283D3E492BC395027329e08f9F4F560Ba5\`\](https://robinhoodchain.blockscout.com/address/0x411F21283D3E492BC395027329e08f9F4F560Ba5) | | Launch Hook | \[\`0x441F773B3bb1Ed4c6457D0528624112e43C02acc\`\](https://robinhoodchain.blockscout.com/address/0x441F773B3bb1Ed4c6457D0528624112e43C02acc) | | Fee Escrow | \[\`0x32f7a9A05bD62487D085Ad494e14Ec42543e19d2\`\](https://robinhoodchain.blockscout.com/address/0x32f7a9A05bD62487D085Ad494e14Ec42543e19d2) | | Launch Token Deployer | \[\`0x7dA2f15e0bbc564fbde55a4E23147f490061BbAb\`\](https://robinhoodchain.blockscout.com/address/0x7dA2f15e0bbc564fbde55a4E23147f490061BbAb) | | Vesting Vault | \[\`0x6bdAAe32F36da5896533fdAD5b7A72a2541063BE\`\](https://robinhoodchain.blockscout.com/address/0x6bdAAe32F36da5896533fdAD5b7A72a2541063BE) | | Announcement Registry | \[\`0x163f3A09278918bDdaf74cF2a4178F6369a9a3c1\`\](https://robinhoodchain.blockscout.com/address/0x163f3A09278918bDdaf74cF2a4178F6369a9a3c1) | ### Uniswap and quotes | Contract | Address | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | v4 PoolManager | \[\`0x8366a39CC670B4001A1121B8F6A443A643e40951\`\](https://robinhoodchain.blockscout.com/address/0x8366a39CC670B4001A1121B8F6A443A643e40951) | | v4 Quoter | \[\`0x8dc178efb8111bb0973dd9d722ebeff267c98f94\`\](https://robinhoodchain.blockscout.com/address/0x8dc178efb8111bb0973dd9d722ebeff267c98f94) | | v4 StateView | \[\`0xf3334192d15450cdd385c8b70e03f9a6bd9e673b\`\](https://robinhoodchain.blockscout.com/address/0xf3334192d15450cdd385c8b70e03f9a6bd9e673b) | | Universal Router | \[\`0x8876789976decbfcbbbe364623c63652db8c0904\`\](https://robinhoodchain.blockscout.com/address/0x8876789976decbfcbbbe364623c63652db8c0904) | | Permit2 | \[\`0x000000000022D473030F116dDEE9F6B43aC78BA3\`\](https://robinhoodchain.blockscout.com/address/0x000000000022D473030F116dDEE9F6B43aC78BA3) | | Native ETH | \`0x0000000000000000000000000000000000000000\` | | USDG | \[\`0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168\`\](https://robinhoodchain.blockscout.com/address/0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168) | ## Governance and fee recipient These addresses are the same on both production chains. \`0x5519a8Cc7211F483e19ff8d50A3B0c892701044D\` \[Base explorer\](https://basescan.org/address/0x5519a8Cc7211F483e19ff8d50A3B0c892701044D) · \[Robinhood explorer\](https://robinhoodchain.blockscout.com/address/0x5519a8Cc7211F483e19ff8d50A3B0c892701044D) \`0x1cAa1962428382106Eb3f29B9719bdF797621C90\` \[Base explorer\](https://basescan.org/address/0x1cAa1962428382106Eb3f29B9719bdF797621C90) · \[Robinhood explorer\](https://robinhoodchain.blockscout.com/address/0x1cAa1962428382106Eb3f29B9719bdF797621C90) The current owner controls configuration for future launches. The platform fee receiver receives creation fees and the platform share of swap fees. Neither address can modify a completed token or remove its liquidity. ## Verification links Each address links to its chain explorer. Base's native B20 addresses are also defined in the \[Base B20 specification\](https://docs.base.org/base-chain/specs/upgrades/beryl/b20), and the Uniswap addresses match the \[official Uniswap v4 deployment list\](https://developers.uniswap.org/docs/protocols/v4/deployments). See the \[machine-readable deployment snapshot\](/launchpad/reference/production-deployments.json) for normalized addresses and current configuration values. # Security and audit Source: https://docs.o1.exchange/launchpad/security Launchpad audit report, reviewed security areas, production safety properties, governance boundaries, and verification guidance. o1 Launchpad is designed around fixed token supply, token-only opening liquidity, permanent Uniswap v4 liquidity, transparent fee accounting, and vesting schedules that cannot be changed after launch. Independent o1 Launchpad report dated June 29, 2026. Inspect the current Base and Robinhood addresses on their chain explorers. \## Audit result XORS completed an independent o1 Launchpad contract review dated June 29, 2026. The report records seven Low findings and no Critical, High, or Medium findings, with the status of each finding documented in the report. Reviewed areas include launch initialization, governance and fee-recipient trust, referral protection, configuration changes, optional profile authority, opening-price bounds, and opening-window trading behavior. ## Core safety properties \* launch tokens have fixed supply and no mint, pause, upgrade, or balance-seizure authority; \* opening liquidity uses launch tokens only, requires no creator quote deposit, and stays in a hook-owned position that cannot be removed; \* swap-fee balances are backed by Uniswap v4 claims until withdrawn, and all recipient credits add up to the charged fee; \* optional creator authority is limited to supported token profile information; \* a pending launch stops if the settings change before it confirms; \* vesting schedules and beneficiaries cannot be changed; \* private keys and transaction signing remain in the user's wallet. ## Governance boundary Governance can update defaults for future launches only. A completed launch keeps its token supply, pool, fee settings, allocations, vesting schedules, and permanent liquidity. See \[Configuration and governance\](/launchpad/architecture/deployment-governance) for the complete boundary. The current governance owner and platform fee receiver are listed in \[Production contracts\](/launchpad/reference/production-contracts#governance-and-fee-recipient). ## What users and integrators should verify \* use the current factory and contract addresses for the selected chain; \* confirm the wallet is connected to the intended chain; \* review current supply, quote, opening value, creation fee, swap fee, and recipients; \* review the chain, contract, amounts, and wallet transaction details before signing. To report a potential issue, follow the \[o1 Exchange bug bounty guidance\](/community/bug-bounty). # Fee and vesting claims Source: https://docs.o1.exchange/launchpad/trading/claims View and claim creator, platform, referral, and vested token balances. Swap fees and vested allocations remain available until they are claimed. One inactive recipient cannot block swaps, launches, or anyone else's claim. ## Fee claims The connected wallet's Profile page shows its available balances separately for ETH, USDC, or USDG. Its \*\*Claim\*\* action always pays the recorded recipient. | Contract option | Who may start it | Destination | | --------------- | ------------------------------------------------------- | ------------------------------- | | \`claim\` | Anyone | Always the recorded recipient | | \`claimTo\` | The balance owner through a direct contract interaction | An address chosen by that owner | Claims pay the same quote currency used by the launch market. A Base USDC market pays USDC fees, a Robinhood USDG market pays USDG fees, and an ETH market pays ETH fees. ## Vesting claims The Profile page shows how many vested tokens are available now, how many have already been claimed, and the remaining milestones. The contract also allows anyone to trigger a claim, but the tokens always go to the beneficiary selected at launch. This permits automation without giving the caller custody. ## Profile overview The connected Profile page groups: \* claimable hook-fee balances by asset; \* referral activity and attributed trades; \* beneficiary vesting schedules and claimable amounts; \* the wallet's launches and supported management tools. Creator and referral earnings are claimed from \*\*Profile > Fees\*\*. \*\*Profile > Referrals\*\* shows attributed trade counts, hook-fee volume, and recent referral activity; it is not the claimable-balance view. Wallet Activity shows indexed claim transactions. Profile views may briefly sync after confirmation; the contracts remain authoritative. ## Currency handling The app claims native ETH directly to the destination. The app claims the stablecoin used by that launch pool. Developers should use the exact quote address listed in \[Production contracts\](/launchpad/reference/production-contracts). Developers can find the exact read and claim functions in \[Functions and events\](/launchpad/reference/events-functions). # Fees, anti-snipe, and referrals Source: https://docs.o1.exchange/launchpad/trading/fees-referrals Current creation fees, swap fees, the 16-second anti-snipe period, referral links, attribution rules, and trade comments. o1 Launchpad charges a one-time token creation fee and a fee on every swap. Swap fees are collected in the pool's quote currency and become claimable by the creator, platform, and valid referrer. ## Creation fees | Chain | Quote | Current fee | | --------- | ----- | ----------: | | Base | ETH | 0.001 ETH | | Base | USDC | 2 USDC | | Robinhood | ETH | 0.001 ETH | | Robinhood | USDG | 2 USDG | For ETH, the wallet includes the creation fee in the launch transaction. For USDC or USDG, the wallet may first request token approval. The fee goes directly to the platform fee receiver. ## Normal swap fee The normal swap fee is \*\*1% of the quote amount\*\*. With a valid referrer, that 1% is divided as follows: | Recipient | Share of the 1% fee | Equivalent share of the trade | | --------- | ------------------: | ----------------------------: | | Creator | 50% | 0.5% | | Platform | 30% | 0.3% | | Referrer | 20% | 0.2% | If a trade has no valid referrer, the unused 0.2% referral share goes to the platform. Fees are always denominated in the selected quote, such as ETH, USDC, or USDG. ## First 16 seconds Trading remains open when the pool launches. The total fee starts at 99% and decreases linearly to the normal 1% fee over 16 seconds. This timestamp-based schedule makes immediate sniping intentionally uneconomic. | Time since launch | Approximate total fee | | -------------------: | --------------------: | | At launch | 99% | | 4 seconds | 74.5% | | 8 seconds | 50% | | 12 seconds | 25.5% | | 16 seconds and later | 1% | The creator and referrer shares are calculated from the normal 1% fee. The temporary amount above 1% is the anti-snipe surcharge and goes to the platform. o1 uses input-amount swaps: traders enter how much they want to spend or sell, and those swaps remain available throughout the 16-second period. Direct integrations that request an exact output are rejected until the fee reaches 1%. \## Get a referral link o1 provides two types of referral links: | Link | Where to copy it | When it applies | | --------------- | -------------------------------------------------------------------- | ------------------------------------------------- | | Global referral | Open your profile and select \*\*Referral\*\* | Used as your general referral across o1 Launchpad | | Token referral | Open a token page, connect your wallet, and select \*\*Referral link\*\* | Applies first to that token on that chain | The \*\*Profile\*\* link on a profile page is only a public profile link. It does not set referral attribution unless it also contains a referral parameter. ## Which referral is used For each token, the interface checks referral attribution in this order: 1. a token-specific referral for that exact chain and token; 2. the connected wallet's previously saved global referral; 3. a global referral saved in the current browser. If the first candidate is invalid, the interface tries the next valid candidate. Opening a token-specific referral link also becomes the global fallback when the visitor does not already have one. Once a wallet has saved a global referral, later global links do not replace it; a token-specific link can still take priority for its exact chain and token. When a connected wallet first uses a browser-saved global referral, the interface may request a gasless signature to save that attribution to the wallet profile. This is not a token approval or an onchain transaction. When the trader submits a swap, the interface includes the selected referral address with that trade. \`LaunchHook\` validates it again onchain before crediting the referrer's share. An invalid referral never blocks the swap: the hook ignores it and sends the unused referral share to the platform. ## Referral protections A referral is ignored when it points to: \* the trader's connected wallet; \* the launch creator; \* the platform fee receiver; \* an empty or malformed address; \* the swap router or execution contract. These checks prevent self-referral and protected-recipient referral. If no candidate is valid, the trade still works and the referral share goes to the platform. ## Trade comments A trader may attach an optional comment of up to 32 UTF-8 bytes. The comment is included with the public onchain trade record, together with the direction, quote currency, referrer, and fee. ## Claiming fees Creator, platform, and referral balances accumulate until claimed. Creators and referrers can open their connected Profile page and use \*\*Fee claims\*\*, where balances are grouped by asset. See \[Claims\](/launchpad/trading/claims) for the complete interface flow and \[Functions and events\](/launchpad/reference/events-functions) for direct contract integration. # Single-sided liquidity Source: https://docs.o1.exchange/launchpad/trading/liquidity How the opening value, token-only liquidity, changing pool inventory, and permanent Uniswap v4 market work. Every launch opens a real Uniswap v4 pool. All tokens available to the market begin on the token side of the opening price, so the creator does not need to deposit ETH, USDC, or USDG as liquidity. ## Current market setup | Setting | Current value | | -------------- | -------------------------------------------------------------- | | Pair | Launch token and the creator's selected quote | | Opening value | FDV close to USD 4,000 under the current quote assumptions | | Pool supply | Fixed supply minus immediate and vested allocations | | Liquidity | One continuous token-side range beginning at the opening price | | Range share | 100% of the pool supply | | Position owner | \`LaunchHook\` | | Removal | Permanently disabled | The liquidity range uses Uniswap's spacing value of \`200\`. This controls where the range can begin and end; it does not force prices or trades to move in fixed steps. ## Opening FDV Current launches have a fixed supply of \*\*1 billion (1,000,000,000) tokens\*\*. The opening FDV is the opening token price multiplied by that complete supply. | Quote assumption | Current opening target | | ---------------- | ---------------------- | | ETH at USD 1,800 | FDV close to USD 4,000 | | USDC at USD 1 | FDV close to USD 4,000 | | USDG at USD 1 | FDV close to USD 4,000 | FDV is a valuation reference, not money raised or deposited. For ETH markets, its USD value changes with the live ETH price. Trading then moves the token price according to Uniswap v4 market activity. ## How inventory changes The permanent position starts with the pool supply in launch tokens and no quote deposit from the creator. Buyers send ETH, USDC, or USDG and receive tokens. Token inventory decreases while quote inventory increases. Sellers send tokens back to the pool and receive quote currency at the live Uniswap v4 price. Remaining tokens and accumulated quote currency continue supporting the market inside the same permanent position. Because the position starts with tokens and no quote inventory, early sell quotes depend on quote currency added by earlier buys. A sell may be limited or unavailable until the pool has enough ETH, USDC, or USDG to return. \`\`\`text theme={null} pool supply = 1,000,000,000 - immediate allocations - vested allocations \`\`\` ## Token-only launch check Before the launch completes, the contracts verify that opening the position requires tokens only. If a configuration would require ETH or a stablecoin from the creator, the transaction stops. ## Why liquidity is permanent \* \`LaunchHook\` owns the position; \* its liquidity cannot be decreased or removed; \* outside accounts cannot modify the locked position; \* there is no transferable LP token or position NFT; \* there is no administrator withdrawal or recovery path. The assets remain inside Uniswap. o1 can adjust settings for later launches but cannot remove or rewrite an existing position. # Token Contract Audits Source: https://docs.o1.exchange/token/audits Security audit reports for the $O token smart contracts Third-party security audits have been conducted on the \\$O token contract and related smart contracts to ensure the integrity and safety of the protocol. ## Audit Reports View the first token contract audit report. View the second token contract audit report. \# Community Source: https://docs.o1.exchange/token/community How o1.exchange rewards authentic traders through the Season 1 airdrop ## Season 1 Airdrop The community allocation rewards authentic o1.exchange traders through a carefully designed airdrop mechanism. While the exact algorithm is not open-sourced or publicly disclosed, it was built to ensure that genuine users are well rewarded for their contributions to the platform. The airdrop allocation for each user is determined by a sophisticated, nonlinear function that factors in: \* \*\*S1.1 and S1.2 Points\*\* — Core trading points earned across both phases of Season 1. \* \*\*Net Fees Paid\*\* — The actual fees paid to o1.exchange after accounting for each user's individual cashback rate, ensuring that users who contribute more to platform revenue are proportionally rewarded. \* \*\*Referrals\*\* — The number of users referred to o1.exchange, rewarding those who helped grow the community. \* \*\*Trading Patterns\*\* — Variety of token mints traded, token holding periods, user retention on the platform, and other behavioral signals used to differentiate real traders from farmers. \* \*\*Social Impact\*\* — Contributions and engagement on X (Twitter) and Discord, including Discord Maxi roles and community participation. These inputs are combined in a way that disproportionately rewards consistent, organic platform usage over gameable single-dimension metrics. The goal is to distribute \\$O to the users who genuinely contributed to o1.exchange's growth during Season 1. # Disclosure Source: https://docs.o1.exchange/token/disclosure o1.exchange / $O Token – Disclosure Writing as of June 2, 2026 The following disclosure is intended to provide an overview of o1.exchange and the \\$O token. It does not purport to be complete or to contain all information that a recipient may consider relevant in making a decision regarding the token. Nothing in this disclosure should be viewed as a statement about the future of o1.exchange or the financial performance of the \\$O token. ## 1. Project Information o1.exchange is the Onchain Everything Exchange — a non-custodial, lightning-fast trading platform that delivers institutional-grade execution for spot trading, perpetual futures, and prediction markets across Base, Solana, and BNB Chain. The platform aggregates liquidity from 100+ sources, offers sub-block latency execution, advanced order types (limit, TWAP, stops, sniping), real-time analytics, TradingView integration, and quantitative/algorithmic trading tools. o1.exchange has achieved \\$180M+ in spot trading volume, 3M+ transactions, and 400,000+ user signups within 7 months of beta, reaching top-3 revenue protocols on Base. ### Executive Officers and Key Personnel \*\*Company:\*\* MoonX Foundation PO Box 144, 3119 9 Forum Lane, Camana Bay, George Town, Grand Cayman, KY1-9006, Cayman Islands \*\*Founders and Executive Officers:\*\* \* Claudio Romildo Pezzia, Director \* Jerry Pan, Founder ### Backers and Third-Party Contributors o1.exchange raised a \\$4.8M seed round from the following institutional investors: \* Coinbase Ventures \* a16z (Andreessen Horowitz) \* AllianceDAO \* The House Fund \* Amber Group \* 30+ other select angels and institutional investors No third-party development shops or external contractors materially contributed to the development of the protocol or the token. ## 2. Token Sale Information o1.exchange has not conducted and does not plan to conduct a public token sale. \\$O token distribution is driven entirely by usage (trading points program) and ecosystem growth. There is no public offering, presale, or crowdsale of \\$O tokens. ## 3. Token and Token Distribution Information ### Token Overview \\$O is the native utility token of the o1.exchange platform. It is an ERC-20 token deployed on the Base blockchain (L2 on Ethereum). \\$O provides the following utility to holders: \* \*\*Tiered Trading Fee Discounts:\*\* Holding or staking \\$O reduces trading fees in real time across all markets on o1.exchange and swap.o1.exchange DEX Aggregator; discounts scale with amount held/staked. \* \*\*Early Access to Alpha Features:\*\* Priority access to quantitative trading tools, strategy automation, advanced order types, and upcoming AI/alpha-generation features before public release. \* \*\*Limited Badge Claims & Revenue Sharing Eligibility:\*\* Users who stake at least a required amount of \\$O for a required period may become eligible to claim limited ecosystem badges. Badge holders qualify to apply for a portion of o1.exchange platform revenue sharing. The minimum staking amount and staking duration are still TBD. \\$O does not represent equity, debt, or profit-sharing in any legal entity. Token holders are not entitled to dividends, interest, revenue share, or any other financial consideration. The platform may conduct discretionary ecosystem initiatives (grants, liquidity support) at the sole discretion of the project team; such actions do not confer enforceable rights on token holders. ### Token Supply and Dynamics \* \*\*Token Standard:\*\* ERC-20 \* \*\*Blockchain:\*\* Base (Ethereum L2) \* \*\*Total Supply:\*\* 1,000,000,000 \\$O (fixed; no inflation or minting after TGE) \* \*\*Circulating Supply at TGE:\*\* 16% (160,000,000 \\$O) \* Community Airdrop / Trading Points: 3% (claimable at TGE) \* Ecosystem / Trading Competition: 3% \* Liquidity Fund (CEX/DEX): 6% (unlocked at TGE) \* Treasury: 4% (unlocked at TGE) \* No inflationary mechanics; token supply is fixed at genesis. \* Future token issuances: None planned. Any changes will be publicly disclosed at least one week before taking effect. ### Token Allocation and Vesting The total supply of 1,000,000,000 \\$O is allocated as follows: | Category | Allocation | Tokens | TGE Unlock | | :-------- | :--------: | :---------: | :--------: | | Community | 25% | 250,000,000 | 3% | | Ecosystem | 25% | 250,000,000 | 3% | | Investors | 18% | 180,000,000 | 0% | | Team | 10% | 100,000,000 | 0% | | Treasury | 16% | 160,000,000 | 4% | | Liquidity | 6% | 60,000,000 | 6% | \*\*Vesting Details:\*\* \* \*\*Community (25%)\*\* — Trading points airdrop and rewards. Season 1: 3% at TGE; Season 2: 5%; Season 3+: TBD. \* \*\*Ecosystem (25%)\*\* — Liquidity incentives and trading competitions. 1-year cliff followed by 36-month linear vesting. Only used for long-term development of the ecosystem and does not benefit insiders. \* \*\*Investors (18%)\*\* — Private venture round investors. 1-year cliff followed by 36-month linear vesting. \* \*\*Team (10%)\*\* — Project team. 1-year cliff followed by 36-month linear vesting. \* \*\*Treasury (16%)\*\* — Platform development, operations, and ecosystem initiatives. 4% unlocked at TGE; remainder held under multi-sig control. Only used for long-term development of the platform and does not benefit insiders. \* \*\*Liquidity (6%)\*\* — Initial DEX/CEX liquidity provisioning. Fully unlocked at TGE. ### Prior Funding Rounds o1.exchange has completed one funding round: \* \*\*Round:\*\* Seed \* \*\*Year:\*\* 2025 \* \*\*Amount Raised:\*\* \\$4.8M \* \*\*Investors:\*\* Coinbase Ventures, a16z, AllianceDAO, The House Fund, Amber Group, and 30+ other select angels and institutional investors. \* \*\*Vesting:\*\* Investor token allocation (18% of total supply) is subject to a 1-year cliff lock starting at TGE, followed by 36-month linear vesting. \* Locked tokens cannot be staked. The staking program provides only non-financial utility benefits (fee discounts, feature access) and does not involve unvested token allocations. ## 4. Airdrop Information o1.exchange plans to distribute \\$O tokens to the community via a trading points conversion program at TGE. \* \*\*Total Airdrop Allocation:\*\* 25% of total supply (250,000,000 \\$O). 12% of them, i.e. 3%, will be distributed at TGE (Season 1). \* \*\*Eligible Recipients:\*\* Users who accumulated trading points on o1.exchange during the points program period (approximately 400,000 registered users). \* \*\*Eligibility Requirements:\*\* Active trading on o1.exchange platform, completion of identity verification, and passing of sanctions screening. \* \*\*Geographic Restrictions:\*\* Users in jurisdictions subject to OFAC and other applicable sanctions are excluded from claiming. \* \*\*Claim Process:\*\* Eligible users will be able to claim \\$O tokens through an on-chain distribution contract beginning at TGE. Wallet authentication and applicable compliance checks are required. Tokens are not automatically pushed to wallets. \* \*\*Unclaimed Tokens Policy:\*\* Undeliverable tokens will be returned to the project treasury wallet and held for 90 days, during which affected users may contact the team. After 90 days, any undeliverable tokens will be permanently returned to the community treasury for future distribution programs as decided by the Project Team. ## 5. Conflicts of Interest Information No related-party transactions involving the token other than the token allocations described in this disclosure have occurred. ## 6. Market Makers & Liquidity Information o1.exchange will deploy liquidity for \\$O via the Liquidity allocation (6% of total supply, 60,000,000 \\$O) at TGE. This allocation is designated for initial DEX and CEX liquidity provisioning. No exchange listing fees have been paid to date. Market maker arrangements, if any, will be disclosed prior to TGE. Any contracted market maker identities, token allocations, and durations will be provided no later than one week before the Day 1 listing event. Specific market maker details are pending finalization as of the date of this disclosure and will be updated accordingly. No tokens have been allocated or granted to any market maker as of the date of this document. ## 7. Security Information \* \*\*Token Contract:\*\* The \\$O token contract (ERC-20) is deployed on Base. \* \*\*Smart Contract Audits:\*\* Third-party security audits of the \\$O token contract and all vesting contracts have been audited: \[https://xors.xyz/audits/o1-exchange-2026-05-02.pdf\](https://xors.xyz/audits/o1-exchange-2026-05-02.pdf). \* \*\*Vesting Enforcement:\*\* Token vesting for team and investor allocations is enforced through time-bound smart contracts on the Base blockchain. These contracts programmatically release tokens according to the vesting schedule. Contract code will be publicly verifiable on Basescan. \* \*\*Platform Security:\*\* o1.exchange is non-custodial. Users retain full control of assets. The platform supports multi-wallet authentication and on-chain verifiable transaction history. ### Public Resources \* Website: \[o1.exchange\](https://o1.exchange) \* Twitter/X: \[x.com/o1\\\_exchange\](https://x.com/o1\_exchange) \* Discord: \[discord.gg/o1exchange\](https://discord.gg/o1exchange) \* Dune Analytics: \[dune.com/stambouli\\\_o1/o1exchange\](https://dune.com/stambouli\_o1/o1exchange) \* DefiLlama: \[defillama.com/protocol/o1.exchange\](https://defillama.com/protocol/o1.exchange) ## 8. Risks The following risks are material to holders and prospective holders of \\$O: 1. \*\*Utility Token Only:\*\* \\$O is a utility token providing platform benefits only. It does not represent equity, or debt in any legal entity. Token holders are not entitled to receive any payments, dividends, interest, revenue share, or other financial consideration by virtue of holding \\$O. 2. \*\*Market and Price Risk:\*\* Token value is determined by market dynamics and utility. Cryptocurrencies are highly volatile and may lose substantial value. Past performance of other digital assets is not indicative of future results. 3. \*\*No Guaranteed Revenue or Buybacks:\*\* No guarantees are made regarding future revenue, token buybacks, or fee discounts. Any treasury ecosystem initiatives are discretionary and do not confer enforceable rights on token holders. 4. \*\*Staking Cooldown:\*\* Staking involves a 30-day cooldown period. Tokens are non-transferable during this period. The cooldown resets if additional unstaking occurs during an active cooldown. 5. \*\*Regulatory Risk:\*\* Regulatory treatment of digital assets and utility tokens varies by jurisdiction and may change. The platform applies geo-restrictions in sanctioned jurisdictions (OFAC-listed countries). Certain features, such as prediction market routing, may not be available in specific jurisdictions including the United States. 6. \*\*Platform Development Risk:\*\* Future platform features, governance mechanisms, and roadmap milestones are subject to change. Governance exploration (\\$O-based voting) and synthetic assets are under consideration but not guaranteed. 7. \*\*Concentration Risk:\*\* The founding team and seed investors collectively control significant token allocations. While vesting schedules reduce short-term concentration risk, these parties may have significant influence after vesting periods. 8. \*\*Liquidity Risk:\*\* There is no guarantee of ongoing liquidity for \\$O on any exchange. Market conditions may make it difficult to buy or sell \\$O at desired prices. 9. \*\*This Disclosure:\*\* This disclosure is for informational purposes only and does not constitute investment advice, a solicitation to purchase \\$O, or a prospectus. Recipients should conduct their own due diligence. # MiCA Whitepaper Source: https://docs.o1.exchange/token/mica-whitepaper Markets in Crypto-Assets (MiCA) Whitepaper for $O Token ## MiCA Whitepaper The Markets in Crypto-Assets (MiCA) whitepaper for the \\$O token is available for download below. View or download the full MiCA whitepaper (PDF) \# Whitepaper Source: https://docs.o1.exchange/token/whitepaper $O – The Utility Token of the Onchain Everything Exchange \*\*\\$O – The Utility Token of the Onchain Everything Exchange\*\* Writing as of June 2, 2026 Version 1.0 | April 2026 TGE: June 2026 17 | Deployed on Base (ERC-20) ## Executive Summary o1.exchange is the Onchain Everything Exchange — a lightning-fast, non-custodial trading platform that delivers institutional-grade execution for spot, perpetuals, prediction markets, and future synthetic/tokenized assets across Base, Solana, and BNB Chain. Built for retail traders, quant funds, and AI agents alike, o1.exchange aggregates liquidity from 100+ sources, offers sub-block latency execution, advanced order types (limit, TWAP, stops, sniping), real-time analytics, TradingView integration, and quantitative/algorithmic trading tools previously reserved for CeFi. The utility token \\$O powers the ecosystem. Holders and stakers receive tiered trading fee discounts, early access to alpha features (quant automation, advanced order types, strategy builders). A trading points program further rewards active traders with \\$O allocations, driving long-term platform loyalty. Backed by Coinbase Ventures, a16z, AllianceDAO, The House Fund, Amber Group, and 30+ other select angels and institutional investors in a \\$4.8M seed round, o1.exchange has already achieved \\$220M+ spot volume, 3M+ transactions, and 400k+ user signups in just 7 months of beta, reaching top-3 revenue protocols on Base while expanding to perps (Hyperliquid) and prediction markets (Kalshi). ## 1. The Problem: Fragmented, Expensive, and Underpowered Onchain Trading DeFi trading today suffers from: \* Fragmented liquidity and poor price discovery across chains and venues. \* High slippage, MEV exposure, and gas costs. \* Lack of advanced execution tools (no native TWAP, limits, or algo strategies on most DEXs). \* Slow, clunky UX compared to centralized exchanges. \* No seamless support for perps, prediction markets, or emerging asset classes (synthetics, tokenized equities) in one unified interface. \* High fees that erode retail and institutional profitability. Traders are forced to juggle multiple apps, bridges, and wallets, losing edge and paying premium prices. ## 2. The Solution: o1.exchange – Onchain Everything Exchange o1.exchange is a fully non-custodial trading terminal that brings CeFi-grade performance to DeFi rails. Key features include: \* \*\*Low-latency execution\*\* (≤1 block or microsecond-level on supported chains). \* \*\*Aggregated liquidity\*\* across 100+ DEXs, on-chain venues, and off-chain PMMs for best-in-class fills. \* \*\*Advanced order types\*\* (limit, TWAP, stops/take-profit, sniping) with algorithmic automation. \* \*\*Quantitative & AI-powered tools\*\* — strategy builders, backtesting, real-time analytics, PnL tracking, and multi-chain portfolio views. \* \*\*Multi-asset coverage\*\* — spot, perpetual futures (via Hyperliquid), prediction markets (via Kalshi), and roadmap for tokenized equities/synthetics. \* \*\*Multi-chain & gas abstraction\*\* — trade on Base (primary), Solana, BNB Chain without managing gas or bridges. \* \*\*Self-custodial security\*\* — multi-wallet support, on-chain verifiable history, no custody. \* \*\*Institutional-ready\*\* — sub-accounts, role-based access, post-trade reporting, order-flow masking. The result: traders get more tokens on every trade, lower costs, and professional-grade tools in one seamless platform. ## 3. \\$O Token Utility \\$O is the core utility token that aligns user incentives with platform growth. Primary benefits for \\$O holders and stakers: ### Tiered Trading Fee Discounts Hold or stake \\$O to unlock meaningful reductions in trading fees. Discounts are tiered by amount held/staked and apply in real time across all markets. ### Early Access to Alpha Features \\$O holders gain priority access to quantitative trading tools, strategy automation, advanced order types, and upcoming AI/alpha-generation features before public release. ### Limited Badge Claim & Revenue Sharing Eligibility Users who stake at least a required amount of \\$O for a required period may become eligible to claim limited ecosystem badges. Badge holders qualify to apply for a portion of o1.exchange platform revenue sharing, creating a direct link between long-term staking commitment and platform economic participation. ### Trading Points Program Active traders earn points convertible to \\$O allocations. This incentivizes volume and loyalty from day one. ### Staking Mechanics \* Navigate to the staking page on o1.exchange, connect wallet, and stake \\$O. \* 30-day cooldown on unstaking (resets if additional unstaking occurs during cooldown). \* Staked tokens remain in your wallet; no lock-up beyond the cooldown. ## 4. Tokenomics \* \*\*Token Standard:\*\* ERC-20 on Base \* \*\*Total Supply:\*\* 1,000,000,000 \\$O (fixed, no inflation) \*\*Allocation Breakdown\*\* (approximate, subject to final TGE parameters): | Category | Allocation | Description | | :-------- | :--------: | :--------------------------------------------------------------------------------------------------- | | Community | 25% | Trading points airdrop (3% at TGE for Season 1), rewards. Season 1: 3%; Season 2: 5%; Season 3+: TBD | | Ecosystem | 25% | Liquidity incentives and trading competitions | | Investors | 18% | Seed round backers | | Team | 10% | Vested with 12-month cliff + linear release | | Treasury | 16% | Platform development, operations, future initiatives | | Liquidity | 6% | Initial DEX/CEX liquidity provisioning | \* \*\*Circulating Supply at TGE:\*\* 16% \* \*\*Vesting:\*\* Investor and team tokens follow standard 1-year cliff + linear vesting to ensure long-term alignment. \* \*\*No public sale\*\* — distribution driven by usage (points program) and ecosystem growth. ## 5. Platform Growth & Treasury Higher trading volume drives platform growth and operational sustainability. As the platform matures, the treasury may allocate resources toward ecosystem initiatives — including discretionary market operations such as liquidity support, grants, and ecosystem incentives — at the sole discretion of the project team. These actions, if implemented, are not guaranteed and do not confer any enforceable rights or financial entitlements to token holders. Staking \\$O provides access to tiered fee discounts and early feature access, directly reducing trading costs and improving the user experience. Staking does not entitle holders to any payments, dividends, interest, revenue share, or other financial consideration. ## 6. Roadmap & Future Governance \* \*\*Q2–Q3 2026:\*\* Expanded quant/AI tools, additional chain integrations, and discretionary treasury ecosystem initiatives. \* \*\*2026+:\*\* Onchain governance exploration (potential \\$O voting on select parameters), synthetic assets, deeper institutional tooling. Current governance is team-led with community feedback via Discord/Telegram. Future \\$O-based governance is under active consideration. ## 7. Team & Backers \* \*\*Founder:\*\* Jerry Pan \* \*\*Director:\*\* Claudio Romildo Pezzia \* \*\*Company:\*\* MoonX Foundation, incorporated in Cayman Islands \* \*\*Backers:\*\* Coinbase Ventures, a16z, AllianceDAO, The House Fund, Amber Group, and 30+ other select angels and institutional investors. ## 8. Risks & Disclaimers \* \\$O is a utility token providing platform benefits only. It does not represent equity, debt, or profit-sharing rights in any legal entity. \* Token value is determined by market dynamics and utility. Cryptocurrencies are volatile and may lose value. \* Staking involves a 30-day cooldown; tokens are non-transferable during this period. \* Token holders are not entitled to receive any payments, dividends, interest, revenue share, or other financial consideration by virtue of holding \\$O. No guarantees are made regarding future revenue, buybacks, or fee discounts. \* o1.exchange is non-custodial; users retain full control of assets. \* The platform applies geo-restrictions to users in sanctioned jurisdictions (e.g., OFAC-listed countries). Certain third-party features, such as prediction market routing, may not be available in specific jurisdictions including the United States. Core platform functionality and \\$O token utility remain available where legally permitted. \* This whitepaper is for informational purposes only and does not constitute investment advice, a solicitation to purchase \\$O, or a prospectus. For the latest updates, visit \[o1.exchange\](https://o1.exchange), follow official channels, and review the token contract upon deployment. \*o1.exchange – Onchain Everything Exchange.\* --- # Unknown \--- name: O1exchange description: Use when building DEX aggregator integrations, executing programmatic trades, launching tokens, or implementing swap UIs. Reach for this skill when agents need to quote prices, execute swaps on Base, handle quote expiry, manage slippage, or integrate the Trading API for MEV-protected trades. metadata: mintlify-proj: o1exchange version: "1.0" --- # o1.exchange Skill ## Product summary o1.exchange is a DeFi trading platform and DEX aggregator on Base (chainId 8453) that routes swaps across 20+ on-chain venues (Uniswap V2/V3/V4, Aerodrome, PancakeSwap, Curve, DODO, WooFi, and others). The DEX Aggregator API provides institutional-grade swap pricing via REST endpoints; the Trading API enables programmatic execution with MEV protection and Permit2 support. The platform also includes a Launchpad for creating fixed-supply tokens with permanent Uniswap v4 liquidity. Key endpoints: \`POST /quote\`, \`POST /submit\`, \`POST /execute\` for aggregator swaps; \`POST /api/v2/order\` and \`POST /api/v2/order/complete\` for trading. The canonical router contract is \`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3\` on Base. All API calls require \`x-api-key\` header authentication. Default rate limit: 120 requests/minute per key. ## When to use Reach for this skill when: - \*\*Building a swap UI\*\*: Quote prices, display routes, handle quote expiry, submit transactions. - \*\*Integrating programmatic trading\*\*: Use the Trading API for MEV-protected swaps with Permit2 signatures. - \*\*Launching a token\*\*: Create a fixed-supply token with permanent Uniswap v4 liquidity via the Launchpad. - \*\*Implementing bots or market makers\*\*: Use \`/execute\` for one-step quote-and-swap flows. - \*\*Handling multi-route optimization\*\*: The aggregator splits trades across venues when it improves output. - \*\*Managing slippage and MEV\*\*: Implement slippage tolerance, quote freshness loops, and MEV protection flags. ## Quick reference ### DEX Aggregator API endpoints | Endpoint | Method | Purpose | Auth | Rate limit | |---|---|---|---|---| | \`/quote\` | POST | Price a swap, get \`quoteId\` and \`routePlan\` | \`x-api-key\` | 120/min | | \`/submit\` | POST | Build transaction from \`quoteId\` | \`x-api-key\` | 120/min | | \`/execute\` | POST | Quote + submit in one call | \`x-api-key\` | 120/min | | \`/health\` | GET | Health check | None | Unlimited | ### Trading API endpoints | Endpoint | Method | Purpose | Auth | |---|---|---|---| | \`POST /api/v2/order\` | POST | Create transaction batch with MEV protection | Bearer token | | \`POST /api/v2/order/complete\` | POST | Submit signed transactions | Bearer token | ### Essential request fields \*\*POST /quote:\*\* - \`chainId\`: 8453 (Base only) - \`tokenIn\`: Token address or \`0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\` for native ETH - \`tokenOut\`: Token address or native sentinel - \`amountIn\`: Amount in wei as string - \`slippageBps\`: Slippage in basis points (100 = 1%) - Optional: \`feeBps\`, \`maxHops\`, \`splitEnabled\`, \`allowedDexes\` \*\*POST /submit:\*\* - \`quoteId\`: From \`/quote\` response - \`user\`: Wallet address - Optional: \`unwrapNativeOut\` (receive native ETH instead of WETH) \*\*POST /execute:\*\* - Same as \`/quote\` + \`user\` field ### Slippage recommendations | Pair type | Recommended \`slippageBps\` | |---|---| | Stablecoin to stablecoin | 10–30 (0.1%–0.3%) | | Blue-chip to blue-chip | 30–100 (0.3%–1%) | | Blue-chip to mid-cap | 100–300 (1%–3%) | | Long tail / memecoins | 300–1000 (3%–10%) | ### Router contract - \*\*Address:\*\* \`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3\` - \*\*Chain:\*\* Base (8453) - \*\*WETH:\*\* \`0x4200000000000000000000000000000000000006\` - \*\*Always verify this address\*\* before approving or sending transactions. ### Supported DEX venues V2-style: \`UNIV2\`, \`AERODROME\_V2LIKE\`, \`PANCAKE\_V2\` V3-style: \`UNIV3\`, \`PANCAKE\_V3\`, \`HYDREX\`, \`QUICKSWAP\_V4\`, \`ALIEN\_BASE\_V3\` V4: \`UNIV4\` Stable: \`AERODROME\_CL\`, \`CURVE\` Other: \`DODO\_V2\`, \`WOOFI\`, \`GYROSCOPE\_ECLP\`, \`MAVERICK\_V2\`, plus proprietary AMMs ## Decision guidance ### When to use \`/quote\` + \`/submit\` vs \`/execute\` | Scenario | Pattern | Reason | |---|---|---| | Swap UI with price preview | Two-step (\`/quote\` + \`/submit\`) | User confirms price before signing; cleaner error handling for expired quotes | | One-click swap button | One-step (\`/execute\`) | Single round trip; no quote expiry to manage | | Server-side bot / market maker | One-step (\`/execute\`) | Fewer round trips; no preview needed | | Live price display in modal | Two-step with polling | Re-quote every 5–8 seconds to keep price fresh | | Mobile with poor connectivity | One-step (\`/execute\`) | Fewer network round trips | ### When to use Trading API vs DEX Aggregator API | Need | API | Reason | |---|---|---| | Best price across venues | DEX Aggregator | Multi-venue routing, split optimization | | MEV protection + Permit2 | Trading API | Built-in private mempool, gasless approvals | | Simple quote + swap | Either | DEX Aggregator is simpler; Trading API adds protection | | Programmatic trading with signatures | Trading API | Handles EIP-712 Permit2 signing | ## Workflow ### Standard two-step swap (recommended for UIs) 1. \*\*Get API key\*\*: Contact the o1 team; keys are issued directly. Store securely server-side. 2. \*\*Quote the swap\*\*: \`POST /quote\` with \`chainId: 8453\`, \`tokenIn\`, \`tokenOut\`, \`amountIn\`, \`slippageBps\`. Store the \`quoteId\` and \`expiresAt\`. 3. \*\*Display to user\*\*: Show \`routePlan.expectedAmountOut\`, \`minAmountOut\`, and the route (e.g., "UNIV3 → AERODROME\_CL"). 4. \*\*Poll for freshness\*\* (optional): Re-fetch \`/quote\` every 5–8 seconds while the modal is open. Update the displayed price if \`expectedAmountOut\` changes. 5. \*\*Approve router\*\* (first swap only): Check allowance for \`tokenIn\` on the router (\`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3\`). If insufficient, call \`approve(router, amountIn)\`. 6. \*\*Build transaction\*\*: \`POST /submit\` with the \`quoteId\` and user address. Receive \`{ to, data, value }\`. 7. \*\*Sign and send\*\*: Use your wallet client to send the transaction to the \`to\` address with the \`data\` payload. 8. \*\*Wait for receipt\*\*: Poll \`waitForTransactionReceipt\` to confirm the swap landed on-chain. ### One-step swap (instant execution) 1. \*\*Quote and build in one call\*\*: \`POST /execute\` with all quote parameters plus \`user\` address. 2. \*\*Sign and send\*\*: Use the returned \`{ to, data, value }\` immediately. 3. \*\*Confirm on-chain\*\*: Wait for receipt. ### Programmatic trading with MEV protection 1. \*\*Generate API key\*\*: Visit \`https://o1.exchange/api-trading\` and create a Trading API token. 2. \*\*Create transaction batch\*\*: \`POST /api/v2/order\` with \`signerAddress\`, \`tokenAddress\`, \`uiAmount\`, \`direction\` ("buy" or "sell"), \`slippageBps\`, \`mevProtection: true\`. 3. \*\*Sign Permit2\*\* (if present): Extract \`permit2.eip712\` from the response, sign with \`signTypedData\`, replace the signature placeholder in the transaction data. 4. \*\*Sign transaction\*\*: Sign the unsigned transaction with your wallet. 5. \*\*Submit\*\*: \`POST /api/v2/order/complete\` with the batch ID and signed transactions. 6. \*\*Verify\*\*: Check the returned transaction hash and balance delta. ## Common gotchas - \*\*Quote expiry\*\*: Quotes expire ~10 seconds after \`/quote\` returns. If \`/submit\` gets a \`404\`, re-quote and retry. Don't surface this as a user error unless it happens twice. - \*\*Router address mismatch\*\*: Always hardcode \`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3\` and reject any \`/submit\` response with a different \`to\` address. - \*\*Slippage reverts are intentional\*\*: If a swap reverts with "Slippage", the safety net worked. Tell the user to increase \`slippageBps\` or re-quote. - \*\*Never expose API keys in client code\*\*: Proxy all API calls through your own server. If a key leaks, revoke it immediately. - \*\*Rate limit is per key, not per IP\*\*: Spreading requests across IPs with one key doesn't bypass the limit. Back off for ≥1 second on \`429\`. - \*\*Native ETH handling\*\*: Use \`0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\` or the zero address for native ETH. The router handles wrapping/unwrapping automatically. - \*\*Permit2 signature placeholder\*\*: The fixed placeholder is \`42f68902113a2a579bcc207c91254c8516d921250e748c18a082d91d74908f8e9a05f27b72a030c6a42d77d0e0aab6fb09219b01a01e7b5b24e4f322ee1762ff1b\`. Replace it with the actual signature, not the other way around. - \*\*Don't retry 400 errors\*\*: \`400\` means the request is malformed or unroutable (e.g., "no routes for pair"). Fix the request; retrying won't help. - \*\*Allowance before first swap\*\*: If \`tokenIn\` is not native ETH, approve the router for at least \`amountIn\` before submitting. Use Permit2 to avoid a separate approval transaction. - \*\*Block-dependent pricing\*\*: Quotes are valid for a specific block. If your transaction lands several blocks later, slippage may increase. Use \`slippageBps\` as the safety margin. ## Verification checklist Before submitting work: - \[ \] API key is stored server-side, never in client code or version control. - \[ \] Router address is hardcoded as \`0x8Dc736C6BA12e1Df1c73DB6BED8d7573F0aD90B3\`; any mismatch in \`/submit\` response is treated as fatal. - \[ \] Quote expiry is handled: if \`/submit\` returns \`404\`, re-quote and retry (not a user-facing error on first occurrence). - \[ \] Slippage tolerance is set appropriately for the pair type (see Quick reference table). - \[ \] Allowance is checked before the first swap; subsequent swaps reuse the approval. - \[ \] Rate limit backoff is implemented: on \`429\`, wait ≥1 second before retrying. - \[ \] Native ETH is handled correctly: use the sentinel address, not WETH, for native swaps. - \[ \] Transaction receipt is awaited and checked for success (\`status === "success"\`). - \[ \] Error messages are user-friendly (not raw API strings like "no routes for pair"). - \[ \] Permit2 signatures (if used) replace the fixed placeholder, not the other way around. ## Resources - \*\*Comprehensive page listing\*\*: \[https://docs.o1.exchange/llms.txt\](https://docs.o1.exchange/llms.txt) - \*\*DEX Aggregator Quickstart\*\*: \[https://docs.o1.exchange/api/dex-aggregator/quickstart\](https://docs.o1.exchange/api/dex-aggregator/quickstart) — Full TypeScript example with quote, approval, submit, and broadcast. - \*\*Error handling guide\*\*: \[https://docs.o1.exchange/api/dex-aggregator/guides/error-handling\](https://docs.o1.exchange/api/dex-aggregator/guides/error-handling) — Status codes, retry strategies, on-chain revert reasons. - \*\*Quote freshness\*\*: \[https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness\](https://docs.o1.exchange/api/dex-aggregator/guides/quote-freshness) — Live price polling pattern and expiry handling. --- > For additional documentation and navigation, see: https://docs.o1.exchange/llms.txt ---