<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: San Clemente</title>
    <description>The latest articles on DEV Community by San Clemente (@san-npm).</description>
    <link>https://dev.to/san-npm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F139356%2F341f75a8-c06f-4136-9a2d-5be884ca5853.png</url>
      <title>DEV Community: San Clemente</title>
      <link>https://dev.to/san-npm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/san-npm"/>
    <language>en</language>
    <item>
      <title>Ophis: an intent-based DEX aggregator for humans and AI agents</title>
      <dc:creator>San Clemente</dc:creator>
      <pubDate>Thu, 09 Jul 2026 20:38:05 +0000</pubDate>
      <link>https://dev.to/san-npm/ophis-an-intent-based-dex-aggregator-for-humans-and-ai-agents-4bda</link>
      <guid>https://dev.to/san-npm/ophis-an-intent-based-dex-aggregator-for-humans-and-ai-agents-4bda</guid>
      <description>&lt;p&gt;Most on-chain swap flows still ask you to think like a router: pick a pool, choose a route, set a slippage number, and hope a bot does not sandwich you on the way in. &lt;a href="https://ophis.fi/" rel="noopener noreferrer"&gt;Ophis&lt;/a&gt; replaces all of that with one line of intent, &lt;code&gt;swap 100 USDC for ETH on Base&lt;/code&gt;. The twist for developers: that same line is callable by software, so an AI agent can trade the exact same way you do.&lt;/p&gt;

&lt;p&gt;I build products for a living, and I built Ophis to collapse that friction into a single intent, then make that intent something an autonomous agent can call safely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In one paragraph:&lt;/strong&gt; Ophis is an intent-based DEX (decentralized exchange) aggregator with a natural-language layer. You describe a trade, it resolves the tokens, chain, and amount, then fills the order through a competitive solver auction that settles on-chain. Every trade is gasless, MEV-protected, and non-custodial, and any price improvement is returned to you in full. It ships with a keyless MCP (Model Context Protocol) server and a TypeScript SDK, it is open source, and it is live on about a dozen EVM chains with its own self-hosted stack on Optimism.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Ophis?
&lt;/h2&gt;

&lt;p&gt;Ophis is an &lt;strong&gt;intent-based DEX aggregator&lt;/strong&gt;. A DEX is a decentralized exchange: you trade tokens on-chain without handing custody to a company. "Intent-based" means you state the outcome you want instead of hand-coding the path to get there. An intent is a signed statement ("I want ETH for my 100 USDC on Base"), not a transaction that pins down every hop. Solvers then compete to fill that intent at the best price they can find.&lt;/p&gt;

&lt;p&gt;Under the hood, Ophis is a fork of &lt;a href="https://cow.fi" rel="noopener noreferrer"&gt;CoW Protocol&lt;/a&gt; (its orderbook, autopilot, driver, and baseline solver) with a natural-language intent layer added on top of a rebranded CoW Swap UI. That lineage is deliberate. CoW's &lt;a href="https://docs.cow.fi" rel="noopener noreferrer"&gt;batch-auction settlement&lt;/a&gt; is what makes the MEV protection structural rather than a best-effort filter, and forking it let me spend my time on the parts that are new: the language layer, the agent tooling, and a self-hosted deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  What do you get on every Ophis trade?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gasless.&lt;/strong&gt; You sign an order in your wallet instead of broadcasting a transaction, so you do not pay gas up front in the chain's native token. A solver executes the trade and settlement covers the gas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MEV-protected.&lt;/strong&gt; Orders settle in a batch auction where every trade in the batch clears at one uniform price. Sandwich attacks and front-running are structurally absent, not filtered after the fact. (MEV is maximal extractable value: the profit bots skim by reordering your transaction. A uniform clearing price removes the opening.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surplus stays with you.&lt;/strong&gt; Solvers compete to beat the price you signed. Any improvement, the surplus, is returned to you in full. Ophis takes zero share of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-custodial and keyless.&lt;/strong&gt; Every order is signed in your own wallet (&lt;a href="https://eips.ethereum.org/EIPS/eip-712" rel="noopener noreferrer"&gt;EIP-712&lt;/a&gt; for regular accounts, ERC-1271 for smart accounts). Ophis never holds keys or funds and cannot move, freeze, or recover them. The signature is the only trust boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A flat, transparent fee.&lt;/strong&gt; 0.10% (10 bps) on volume, dropping to 0.01% (1 bp) on same-chain stablecoin pairs. Part of the fee comes back as monthly WETH rebates, and integrators earn 8% of the net fee on the volume their referrals route.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trade type&lt;/th&gt;
&lt;th&gt;Fee&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Any swap (on volume)&lt;/td&gt;
&lt;td&gt;0.10% (10 bps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same-chain stablecoin pair&lt;/td&gt;
&lt;td&gt;0.01% (1 bp)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surplus / price improvement&lt;/td&gt;
&lt;td&gt;0% (returned to you)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Ophis vs. a typical aggregator
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Ophis&lt;/th&gt;
&lt;th&gt;A typical aggregator&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MEV protection&lt;/td&gt;
&lt;td&gt;Structural: uniform-price batch auction&lt;/td&gt;
&lt;td&gt;Best-effort: private relay or slippage guard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price improvement&lt;/td&gt;
&lt;td&gt;Surplus returned to you in full&lt;/td&gt;
&lt;td&gt;Often kept by the solver or skimmed by a bot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gas&lt;/td&gt;
&lt;td&gt;Gasless: you sign an off-chain order&lt;/td&gt;
&lt;td&gt;You broadcast the transaction and pay gas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custody&lt;/td&gt;
&lt;td&gt;Non-custodial, keyless&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI-agent access&lt;/td&gt;
&lt;td&gt;Hosted MCP server + TypeScript SDK&lt;/td&gt;
&lt;td&gt;Usually none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Intent API: the natural-language layer
&lt;/h2&gt;

&lt;p&gt;The one bespoke API Ophis adds to the CoW stack turns natural language into a structured order. No key, no account, just POST your text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://ophis.fi/api/intent &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text":"swap 100 USDC for ETH on Base"}'&lt;/span&gt;

&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"ok"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
  &lt;span class="s2"&gt;"data"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"intent"&lt;/span&gt;: &lt;span class="s2"&gt;"swap"&lt;/span&gt;,
    &lt;span class="s2"&gt;"entities"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
      &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"amount"&lt;/span&gt;,    &lt;span class="s2"&gt;"value"&lt;/span&gt;: &lt;span class="s2"&gt;"100"&lt;/span&gt;,  &lt;span class="s2"&gt;"raw"&lt;/span&gt;: &lt;span class="s2"&gt;"100"&lt;/span&gt;,  &lt;span class="s2"&gt;"start"&lt;/span&gt;: 5,  &lt;span class="s2"&gt;"end"&lt;/span&gt;: 8 &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"sellToken"&lt;/span&gt;, &lt;span class="s2"&gt;"value"&lt;/span&gt;: &lt;span class="s2"&gt;"USDC"&lt;/span&gt;, &lt;span class="s2"&gt;"raw"&lt;/span&gt;: &lt;span class="s2"&gt;"USDC"&lt;/span&gt;, &lt;span class="s2"&gt;"start"&lt;/span&gt;: 9,  &lt;span class="s2"&gt;"end"&lt;/span&gt;: 13 &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"buyToken"&lt;/span&gt;,  &lt;span class="s2"&gt;"value"&lt;/span&gt;: &lt;span class="s2"&gt;"ETH"&lt;/span&gt;,  &lt;span class="s2"&gt;"raw"&lt;/span&gt;: &lt;span class="s2"&gt;"ETH"&lt;/span&gt;,  &lt;span class="s2"&gt;"start"&lt;/span&gt;: 18, &lt;span class="s2"&gt;"end"&lt;/span&gt;: 21 &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"chain"&lt;/span&gt;,     &lt;span class="s2"&gt;"value"&lt;/span&gt;: &lt;span class="s2"&gt;"base"&lt;/span&gt;, &lt;span class="s2"&gt;"raw"&lt;/span&gt;: &lt;span class="s2"&gt;"Base"&lt;/span&gt;, &lt;span class="s2"&gt;"start"&lt;/span&gt;: 25, &lt;span class="s2"&gt;"end"&lt;/span&gt;: 29 &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The endpoint only normalizes text. It never places, signs, or executes a trade. It is rate-limited to 30 requests per minute per IP, and it accepts non-browser callers (no Origin header), which is the path agents use. Your app maps the chain slug to a chain ID and hands the user a deep link to review and sign.&lt;/p&gt;

&lt;p&gt;How do AI agents trade on Ophis?&lt;/p&gt;

&lt;p&gt;This is where Ophis diverges from a typical aggregator: it was built to be traded by software, not only clicked by people. There are three integration depths, all non-custodial and keyless.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The MCP server (the fast path)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Point any Model Context Protocol (&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;https://modelcontextprotocol.io&lt;/a&gt;) client (Claude, Cursor, Cline, or a custom agent) at the hosted server:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mcp.ophis.fi/mcp" rel="noopener noreferrer"&gt;https://mcp.ophis.fi/mcp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It speaks Streamable-HTTP MCP and exposes about a dozen tools. For a swap, an agent chains just four of them:&lt;/p&gt;

&lt;p&gt;parse_intent  →  get_quote  →  build_order  →  submit_order&lt;/p&gt;

&lt;p&gt;The rest (resolve_token, expected_surplus, list_chains, lookup_tier, get_balances, get_portfolio, get_gas, get_token_chart) are read-only helpers. submit_order is the only state-changing tool. 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, and the agent signs locally with its own key before submitting.&lt;/p&gt;

&lt;p&gt;In Claude Code, it is two commands:&lt;/p&gt;

&lt;p&gt;/plugin marketplace add ophis-fi/skills&lt;br&gt;
/plugin install ophis@ophis-fi&lt;/p&gt;

&lt;p&gt;Then just ask: "swap 100 USDC for ETH on Base." For any other MCP client, add it as a remote HTTP server. Cursor, in ~/.cursor/mcp.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ophis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.ophis.fi/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same endpoint works in VS Code, GitHub Copilot, Codex, Cline, Roo Code, and Goose. For a stdio-only client like Claude Desktop, bridge with npx -y mcp-remote &lt;a href="https://mcp.ophis.fi/mcp" rel="noopener noreferrer"&gt;https://mcp.ophis.fi/mcp&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;@ophis/sdk (build and sign directly)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For agents that construct and sign CoW orders themselves:&lt;/p&gt;

&lt;p&gt;npm install @ophis/sdk&lt;/p&gt;

&lt;p&gt;The SDK is dependency-free and encodes four fork details that fail silently if you guess them: the per-chain orderbook host, the EIP-712 signing domain, the CIP-75 partner-fee appData, and a guard that pins the order receiver. End to end, the shape looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;getOphisOrderbookUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;getOphisOrderDomain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;buildOphisAppDataPartnerFee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;assertReceiverIsOwner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@ophis/sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chainId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8453&lt;/span&gt;              &lt;span class="c1"&gt;// Base&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Quote the parsed intent (getQuote + order typing come from cow-sdk)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getQuote&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sellToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;buyToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sellAmount&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Build the order, pinning the receiver to the signer&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;receiver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;
&lt;span class="nf"&gt;assertReceiverIsOwner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="c1"&gt;// throws if they differ&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;appData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;buildOphisAppDataPartnerFee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="c1"&gt;// CIP-75 volume fee&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Sign the EIP-712 order with the agent's own key&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getOphisOrderDomain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="c1"&gt;// correct verifyingContract&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signTypedData&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nf"&gt;orderTypedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// 4. Submit to the correct per-chain orderbook host&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;getOphisOrderbookUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/orders`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The four Ophis helpers are the fork-specific glue; the quoting and typed-data calls are standard cow-sdk. A runnable version lives in the docs. One helper is worth calling out: assertReceiverIsOwner(owner, receiver) pins the receiver, because an unpinned receiver is the most common drain vector for an automated signer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent discovery&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ophis publishes machine-readable manifests under &lt;a href="https://mcp.ophis.fi/" rel="noopener noreferrer"&gt;https://mcp.ophis.fi/&lt;/a&gt; (mcp.json, ai-plugin.json, agent-skills/, and an RFC 9727 api-catalog) plus a root-served llms.txt and openapi.json, so an agent can discover the tools on its own rather than being hard-wired.&lt;/p&gt;

&lt;p&gt;After you sign: the order lifecycle&lt;/p&gt;

&lt;p&gt;Signing is not broadcasting, so the "what happens next" is worth spelling out. Once you sign, the order goes to the orderbook and competes in the next batch auction. A market order typically fills within a block or two, when a solver includes it in a winning settlement, and you can watch it resolve on the order explorer at &lt;a href="https://explorer.ophis.fi" rel="noopener noreferrer"&gt;https://explorer.ophis.fi&lt;/a&gt;. Every order carries an expiry (validTo); if no solver can fill a limit order at your price before it expires, the order simply lapses with nothing given up. Orders can be cancelled before they settle. Because a pending order is a signed off-chain message rather than a transaction in the public mempool, there is nothing sitting in the open for bots to react to.&lt;/p&gt;

&lt;p&gt;The safety model for autonomous signing&lt;/p&gt;

&lt;p&gt;Letting software sign trades is exactly where things go wrong, so it is worth being precise about what protects you. Ophis makes the safe path the default:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;resolve_token maps a symbol to its canonical address and fails closed, so an agent never swaps into a token that merely spoofs a well-known symbol.&lt;/li&gt;
&lt;li&gt;Every built order pins the receiver to the owner, so proceeds cannot be redirected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But be clear-eyed: these off-chain helpers are guards, not an authorization boundary. A prompt-injected agent can ignore them. For an agent that signs without a human in the loop, the guidance is to enforce policy where the agent cannot reach it: keep funds in a Safe (&lt;a href="https://safe.global" rel="noopener noreferrer"&gt;https://safe.global&lt;/a&gt;) smart account behind a deterministic policy gate (allowlisted tokens, pinned receiver and appData, an oracle-bounded limit price, spend caps), add a guardian key, and re-check the same policy at orderbook ingestion. The full write-up lives at &lt;a href="https://docs.ophis.fi/ai-agents" rel="noopener noreferrer"&gt;https://docs.ophis.fi/ai-agents&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Ophis built on?
&lt;/h3&gt;

&lt;p&gt;For the developers who want to read the source, the monorepo (&lt;a href="https://github.com/ophis-fi/ophis" rel="noopener noreferrer"&gt;https://github.com/ophis-fi/ophis&lt;/a&gt;, GPL-3.0) is mostly Rust and TypeScript with Solidity contracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apps/backend is a fork of cowprotocol/services: the Rust orderbook, autopilot, driver, and baseline solver.&lt;/li&gt;
&lt;li&gt;apps/frontend is a fork of cowprotocol/cowswap: the swap UI, order explorer, and landing site, with Ophis code isolated under src/ophis/.&lt;/li&gt;
&lt;li&gt;apps/mcp-server is the agent-facing MCP server, deployed as a Cloudflare Worker.&lt;/li&gt;
&lt;li&gt;packages/sdk is @ophis/sdk.&lt;/li&gt;
&lt;li&gt;contracts/ holds the GPv2 settlement contracts under an Ophis-controlled solver allowlist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On Optimism (chain 10), Ophis runs the whole stack under its own settlement contracts and keeps the full fee. On the other supported chains, it routes orders through CoW Protocol's hosted solver network. Upstream subtrees are vendored as-is and every divergence is catalogued, so pulling upstream stays tractable, which matters a lot when your backend is a fork you intend to keep in sync.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which chains does Ophis support?
&lt;/h3&gt;

&lt;p&gt;Trading is live on about a dozen EVM chains, including Ethereum, Optimism, Base, Arbitrum, Polygon, and BNB Chain, with Solana and Bitcoin available as cross-chain destinations via NEAR Intents. Because the live set moves, the MCP list_chains tool (and the SDK's chain registry) reports the authoritative list at runtime instead of hard-coding it. Optimism is the flagship self-hosted deployment; a couple of newer chains have their contracts deployed with the stack paused.&lt;/p&gt;

&lt;p&gt;Try it&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App: &lt;a href="https://swap.ophis.fi" rel="noopener noreferrer"&gt;https://swap.ophis.fi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.ophis.fi" rel="noopener noreferrer"&gt;https://docs.ophis.fi&lt;/a&gt; (start with the AI-agents guide)&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/ophis-fi/ophis" rel="noopener noreferrer"&gt;https://github.com/ophis-fi/ophis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SDK: npm install @ophis/sdk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you are a trader who wants a gasless swap or a developer wiring a trading tool into an agent, the same non-custodial path works. Tell it what you want in natural language, sign in your own wallet, keep your surplus.&lt;/p&gt;

&lt;h3&gt;
  
  
  FAQ
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What is an intent-based DEX aggregator?&lt;/strong&gt;&lt;br&gt;
It is a decentralized exchange where you submit the outcome you want (a signed intent, like "buy ETH with 100 USDC on Base") instead of a fully specified transaction. Independent solvers then compete to fill that intent at the best available price across many liquidity sources, and the winning solution settles on-chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Ophis a fork of CoW Protocol?&lt;/strong&gt;&lt;br&gt;
Yes. Ophis forks CoW Protocol's orderbook, autopilot, driver, and baseline solver, and rebrands the CoW Swap UI. What Ophis adds is a natural-language intent layer, an agent-facing MCP server and SDK, and a self-hosted settlement stack on Optimism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Ophis custodial?&lt;/strong&gt;&lt;br&gt;
No. Every order is signed in your own wallet, and Ophis never holds your keys or funds. It cannot move, freeze, or recover them. The signature is the only trust boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does Ophis cost?&lt;/strong&gt;&lt;br&gt;
A flat 0.10% (10 bps) on volume, dropping to 0.01% (1 bp) on same-chain stablecoin pairs. Price-improvement surplus is returned to you in full, and Ophis takes zero share of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an AI agent really place trades safely?&lt;/strong&gt;&lt;br&gt;
It can, if you keep policy outside the agent's reach. Ophis pins the order receiver to the owner and resolves token symbols to canonical addresses that fail closed. For headless signing, put funds in a Safe smart account behind a deterministic policy gate with spend caps and a guardian key, and re-check that policy at ingestion.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>crypto</category>
      <category>web3</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
