Ophis

Ophis

Describe a trade in plain English. Ophis does the rest.
An intent-based DEX aggregator with a natural-language layer, built for humans and agents alike.

CI CodeQL Security audits GPL-3.0 License OP mainnet live

Swap App · Docs · Explorer · Agents · SDK · Security

--- Say `swap 100 USDC for ETH on Base` and Ophis resolves the tokens, chain, and amount, then fills the order through a competitive solver auction that settles on-chain. It is a fork of [CoW Protocol](https://cow.fi) (orderbook, autopilot, driver, and baseline solver) with a natural-language intent layer over a rebranded CoW Swap UI. On Optimism, Ophis runs the whole stack under its own settlement contracts and keeps the full fee; on the other supported chains (Ethereum, Base, Arbitrum, and more) it routes through CoW Protocol's hosted network. What that buys you on every trade: - **Gasless, MEV-protected.** Orders settle in a batch auction where every trade clears at one uniform price, so sandwiches and front-running are structurally absent, not best-effort. - **Solver-aligned pricing.** On every supported chain the base fee is 1 bp and Ophis earns primarily when execution beats its reference quote: 80% of improvement on volatile pairs (99 bps cap), or 50% on stable pairs (20 bps cap). Hosted chains encode that policy in CIP-75 appData and separately pay CoW Protocol's upstream fees. - **Non-custodial, no account, no auth.** Every order is signed in your own wallet (EIP-712 or ERC-1271). Ophis never holds keys or funds and cannot move, freeze, or recover them. The signature is the only trust boundary. - **Transparent, capped fees.** A 0.01% (1 bp) base plus the capped improvement policy above, with a share returned monthly as WETH rebates plus an 8% referral on trades you bring. **Live across 13 EVM chains**, with Ophis-operated settlement on Optimism (chain 10), Unichain (130), and Robinhood Chain (4663), plus CoW-hosted settlement on the other supported chains. ## Quickstart: the Intent API Ophis's one bespoke API turns natural language into a structured order. No key, no account, just POST your request: ```bash curl -sS https://ophis.fi/api/intent \ -H 'content-type: application/json' \ -d '{"text":"swap 100 USDC for ETH on Base"}' ``` ```json { "ok": true, "data": { "intent": "swap", "entities": [ { "type": "amount", "value": "100", "raw": "100", "start": 5, "end": 8 }, { "type": "sellToken", "value": "USDC", "raw": "USDC", "start": 9, "end": 13 }, { "type": "buyToken", "value": "ETH", "raw": "ETH", "start": 18, "end": 21 }, { "type": "chain", "value": "base", "raw": "Base", "start": 25, "end": 29 } ] } } ``` Map the chain slug to a chain ID and hand the user a swap deep link to review and sign. The endpoint only normalizes text, it never places, signs, or executes a trade. It is rate-limited to 30 requests per minute per IP; non-browser callers (no `Origin` header) are allowed, which is the path agents use. Full reference: [docs.ophis.fi/intent-api](https://docs.ophis.fi/intent-api). ## Agents and SDK Ophis is built to be traded by autonomous agents, not just people. Pick your integration depth, all of it non-custodial and keyless: ### MCP server (recommended) Point any MCP client (Claude, Cursor, a custom agent) at the hosted Model Context Protocol server: ``` https://mcp.ophis.fi/mcp ``` It speaks Streamable-HTTP MCP and exposes 14 tools: intent parsing, canonical token resolution, chain discovery, quoting, bounded order build/validation and submission, rebate and integrator lookups, balances, portfolios, gas, charts, and expected-surplus comparison. The server holds no keys and never signs. `build_order` returns a bounded, ready-to-sign EIP-712 order with the receiver pinned to the owner; the agent signs locally with its own key and submits. See the [complete tool reference](apps/mcp-server/README.md#tools). (A bare request without an `Accept: text/event-stream` header returns HTTP 406, that is the transport negotiating, not an outage.) ### @ophis/sdk For agents that build and sign CoW orders directly: ```bash npm install @ophis/sdk ``` The SDK encodes four fork details that fail **silently** if you guess them: - **`getOphisOrderbookUrl(chainId)`** picks the right host. Optimism self-hosts its orderbook (not `api.cow.fi`); the wrong host bypasses the Ophis solver and zeroes the fee. - **`getOphisOrderDomain(chainId)`** gives the EIP-712 domain with the correct `verifyingContract`. The OP settlement is non-canonical, so the cow-sdk default is rejected on-chain. - **`buildOphisAppDataPartnerFee(chainId)`** builds the exact CIP-75 volume-fee fragment `{ volumeBps, recipient }`, not the price-improvement shape. - **`assertReceiverIsOwner(owner, receiver)`** pins the order receiver. An unpinned receiver is the number one drain vector for an automated signer. ### Discovery and the trust boundary Ophis publishes machine-readable manifests for agent discovery under `https://ophis.fi/.well-known/`: `mcp.json`, `ai-plugin.json`, `agent-skills/`, and `api-catalog` (RFC 9727), plus the root-served `auth.md`, `llms.txt`, and `openapi.json`. These off-chain helpers make the safe path the easy path, but they are guards, not an authorization boundary: a prompt-injected agent can ignore them. For an agent that signs **without a human in the loop**, enforce policy where the agent cannot reach it: funds in a Safe smart account, a deterministic policy gate (allowlisted tokens, pinned receiver and appData, an oracle-bounded limit price, spend caps), a guardian key, and the same policy checked again at orderbook ingestion. Full guide: [docs.ophis.fi/ai-agents](https://docs.ophis.fi/ai-agents). ## Status Ophis settles across two kinds of chains. **Ophis-operated** (self-hosted orderbook, solver, and settlement; Ophis keeps the full fee): | Chain | Chain ID | Status | |---|---|---| | Optimism | 10 | **Live**: settlement, solver, partner fee | | Unichain | 130 | **Live**: settlement, solver, partner fee | | Robinhood Chain | 4663 | **Live**: settlement, solver, partner fee | **CoW-hosted** (orders route through CoW Protocol's settlement and solver network, with the partner fee disbursed by CoW): Ethereum, Base, Arbitrum, Polygon, BNB, Gnosis, Avalanche, Linea, and the other CoW-supported chains, all live. On **BNB Smart Chain (BSC, chain ID 56)** Ophis is live: orders placed through Ophis (`SupportedChainId.BNB` in [`cowSdk.ts`](apps/frontend/apps/cowswap-frontend/src/cowSdk.ts), mapped from the `bnb` slug in [`chainMap.ts`](apps/frontend/apps/cowswap-frontend/src/ophis/components/intent/chainMap.ts)) settle on-chain through CoW Protocol's GPv2Settlement at `0x9008D19f58AAbD9eD0D60971565AA8510560ab41` on BSC, giving gasless, MEV-protected swaps with no Ophis-side custody. Ophis does not deploy its own settlement on BSC; BNB trades use CoW Protocol's canonical BSC deployment. The two have different settlement contracts and orderbook hosts, so resolve them per chain via `@ophis/sdk` or the MCP `list_chains` tool rather than assuming. Full live status: [docs.ophis.fi/status](https://docs.ophis.fi/status). Cross-chain destinations (Solana, Bitcoin) are surfaced via NEAR Intents. Canonical contract addresses and the disclosure policy live in [`SECURITY.md`](SECURITY.md). ## Architecture | Path | Origin | Purpose | |---|---|---| | `apps/frontend/` | [`cowprotocol/cowswap`](https://github.com/cowprotocol/cowswap) (subtree) | Vite/Nx monorepo holding several surfaces: `apps/cowswap-frontend` is the swap UI (Ophis code under `src/ophis/` and `src/modules/mevReceipt/`), `apps/explorer` is the order explorer, `apps/ophis-landing` is the ophis.fi landing site. Self-contained pnpm workspace (own lockfile, excluded from the root). | | `apps/backend/` | [`cowprotocol/services`](https://github.com/cowprotocol/services) (subtree) | Rust orderbook, autopilot, driver, baseline solver. Ophis additions live in dedicated crates and `ophis::` module paths. | | `apps/mcp-server/` | New | `@ophis/mcp-server`: agent-facing MCP server (Streamable-HTTP) deployed as a Cloudflare Worker at `mcp.ophis.fi/mcp`. Holds no keys and never signs. | | `apps/rebate-indexer/` | New | `@ophis/rebate-indexer`: off-chain volume-tier and WETH rebate indexer plus Safe batch proposer ([rebates.ophis.fi](https://rebates.ophis.fi)). | | `apps/docs-ophis/` | New | Docusaurus docs portal ([docs.ophis.fi](https://docs.ophis.fi)). Self-contained app (own lockfile, excluded from the root, like `apps/frontend`). | | `packages/sdk/` | New | [`@ophis/sdk`](packages/sdk): dependency-free helpers for the per-chain orderbook host, EIP-712 order domain, CIP-75 partner-fee `appData`, receiver-pinning guards, tier assignment, and the supported-chain registry. | | `contracts/` | [`cowprotocol/contracts`](https://github.com/cowprotocol/contracts) (subtree) | `GPv2Settlement`, `GPv2VaultRelayer`, `GPv2AllowListAuthentication`, deployed under an Ophis-controlled solver allowlist. Per-network artifacts in `contracts/deployments/`. | | `functions/` | New | Cloudflare Pages Functions: `api/intent.ts` (the natural-language parser, shared by swap and landing), `api/bungee` (bridge proxy), `_middleware.ts` (host routing). | | `infra/` | New | Per-chain runtime stacks (`optimism-mainnet/`, `unichain-mainnet/`, `robinhood-mainnet/`, `local/`), plus `rpc/` (eRPC) and `cloudflare/` config. | Upstream subtrees are vendored as-is; Ophis changes are catalogued in `apps/frontend/.ophis-divergences.md` and `apps/backend/.ophis-divergences.md` so `git subtree pull` stays tractable. ## Repo map ``` ophis/ ├── apps/ │ ├── frontend/ cowswap fork: swap UI + explorer + landing site │ ├── backend/ cowprotocol/services fork (Rust) │ ├── rebate-indexer/ tier + WETH rebate API, Safe batch proposer │ ├── docs-ophis/ Docusaurus docs portal │ └── mcp-server/ agent-facing MCP Worker (mcp.ophis.fi) ├── contracts/ GPv2 settlement contracts (+ per-network deployments) ├── packages/sdk/ @ophis/sdk ├── functions/ Cloudflare Pages Functions (intent API, bungee, middleware) ├── infra/ per-chain runtime stacks + rpc + cloudflare config ├── scripts/ repo utility scripts └── docs/ specs, plans, audits, operations runbooks ``` ## Build Root workspace (pnpm 9, Node 20.19+ or 22.12+, turborepo): ```sh pnpm install # all root-workspace deps pnpm build # builds members with a build step (currently @ophis/sdk) pnpm typecheck # typechecks every member pnpm test # runs the unit suites ``` Only `packages/sdk` has a build step today. `apps/rebate-indexer`, `apps/mcp-server`, and `infra/rpc` run directly (no `build` script) and are validated by `pnpm typecheck` and `pnpm test`. The Rust backend (`apps/backend`) is a **Cargo** workspace, not a pnpm package, so build and test it with Cargo: ```sh cd apps/backend && cargo build && cargo test ``` `apps/frontend` and `apps/docs-ophis` are self-contained pnpm workspaces with their own lockfiles, deliberately excluded from the root. Build them from inside their own directory (see each app's README): ```sh cd apps/frontend && pnpm install --frozen-lockfile && pnpm run build:cowswap cd apps/docs-ophis && pnpm install --frozen-lockfile && pnpm run build ``` The contracts use Foundry (`forge build`); `forge-std` is a git submodule, so run `git submodule update --init` first. ## Deploy Every surface deploys independently from `main`: - **Swap app and Explorer** [`cloudflare-deploy.yml`](.github/workflows/cloudflare-deploy.yml): two sequential Cloudflare Pages deploys (swap.ophis.fi / ophis.fi, then explorer.ophis.fi). - **Landing** [`landing-deploy.yml`](.github/workflows/landing-deploy.yml): path-filtered build with a Playwright and Lighthouse budget gate, to Cloudflare Pages. - **Docs** [`docs-deploy.yml`](.github/workflows/docs-deploy.yml): the Docusaurus site to its own Cloudflare Pages project. - **MCP server** [`mcp-deploy.yml`](.github/workflows/mcp-deploy.yml): to Cloudflare Workers (custom domain `mcp.ophis.fi`) with a least-privilege Workers token; [`mcp-registry-release.yml`](.github/workflows/mcp-registry-release.yml) publishes matching versioned metadata to the official MCP Registry from protected `mcp-v*` tags. - **Rebate indexer** [`rebate-indexer-deploy.yml`](.github/workflows/rebate-indexer-deploy.yml): to self-hosted infrastructure over a private network. - **Operated-chain backends**: the Optimism, Unichain, and Robinhood Chain orderbooks, autopilots, drivers, and solver lanes run on Ophis infrastructure from `infra/optimism-mainnet/`, `infra/unichain-mainnet/`, and `infra/robinhood-mainnet/`. They are not deployed by a GitHub workflow. Quality gates: [`ci.yml`](.github/workflows/ci.yml) (lint, typecheck, tests), [`codeql.yml`](.github/workflows/codeql.yml), [`security.yml`](.github/workflows/security.yml) (dependency and supply-chain scans), and [`echidna.yml`](.github/workflows/echidna.yml) (contract fuzzing). [`sdk-release.yml`](.github/workflows/sdk-release.yml) publishes `@ophis/sdk` to npm. All package and MCP publishing controls are documented in the [release runbook](docs/operations/release-publishing.md). ## Fees and rebates On every supported chain, Ophis charges a **0.01% (1 bp)** base plus a capped share of reference-quote improvement: **80% capped at 99 bps** for volatile pairs and **50% capped at 20 bps** for stable pairs. Operated-chain backends apply the improvement policy; hosted orders encode it in CIP-75 appData and separately pay CoW Protocol's upstream fees. Part of the fee flows back to traders: - **Volume-tier rebates.** Each month a share of collected WETH fees is paid back, split across active wallets by 30-day volume and tier (Bronze through Platinum). The [rebate indexer](https://rebates.ophis.fi) computes shares and a Safe batch proposer pays out. - **Referrals.** Mint a code, share `https://swap.ophis.fi/?ref=YOURCODE`, and earn 8% of the verified base fee Ophis keeps on trades your referrals route, paid monthly in WETH. Full numbers and the tier ladder: [docs.ophis.fi/fees](https://docs.ophis.fi/fees) and [docs.ophis.fi/affiliate](https://docs.ophis.fi/affiliate). ## Security See [`SECURITY.md`](SECURITY.md) for the disclosure policy, canonical contract addresses, the partner-fee recipient and governance model, in-scope components, and audit history. ## License [GPL-3.0](LICENSE), inherited from upstream CoW Protocol.