关于 RAVN
RAVN 提供跨链兑换 API 示例,涵盖 EVM 链、原生 Bitcoin 和 Solana,面向集成兑换的开发者与 Agent。示例展示报价、执行和状态查询流程,以及如何使用托管 MCP 服务。
主要功能
- 01覆盖 EVM、Bitcoin 与 Solana
- 02并行比较执行场所报价
- 03支持原生 Bitcoin 兑换
- 04提供 TypeScript SDK 示例
- 05展示执行与状态查询流程
适用场景
- 01将 Base 上的 USDC 兑换为原生 BTC
- 02为 Claude 构建工具调用兑换流程
- 03查询可用场所并运行健康检查
- 04通过 x402 按次付费调用 API
MCP 相关
提供托管 MCP 服务,README 指引 Claude 或 Cursor 连接该服务;服务地址为 `https://app.ravn.exchange/api/mcp`。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://app.ravn.exchange/api/mcpclaude mcp add --transport http ravn https://app.ravn.exchange/api/mcp{"mcpServers":{"ravn":{"type":"http","url":"https://app.ravn.exchange/api/mcp"}}}在 Cursor 中打开{"servers":{"ravn":{"type":"http","url":"https://app.ravn.exchange/api/mcp"}}}在 VS Code 中打开{"mcpServers":{"ravn":{"type":"http","url":"https://app.ravn.exchange/api/mcp"}}}{"mcpServers":{"ravn":{"serverUrl":"https://app.ravn.exchange/api/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
10| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| inputChainId | integer | 是 | 数字链 ID,例如 1=Ethereum、8453=Base、-1=Bitcoin、-2=Solana — 完整列表请参阅 ravn_chains,或参阅 ravn_health 查看实时 venue 状态 |
| outputChainId | integer | 是 | 数字链 ID,例如 1=Ethereum、8453=Base、-1=Bitcoin、-2=Solana — 完整列表请参阅 ravn_chains,或参阅 ravn_health 查看实时 venue 状态 |
| inputToken | string | 是 | 代币合约地址;若为该链的原生币,则使用 0xEeeeeEeeeEeEeeEeEeEeeeEEeeeeEeeeeeeeEEeE |
| outputToken | string | 是 | 代币合约地址;若为该链的原生币,则使用 0xEeeeeEeeeEeEeeEeEeEeeeEEeeeeEeeeeeeeEEeE |
| inputAmount | string | 是 | 正整数字符串,单位为输入代币的最小单位(不含小数) |
| userAddress | string | 是 | 输入资产的发送方地址 |
| destinationAddress | string | 否 | 输出资产的接收地址;若与 userAddress 不同则填写。对于 Relay(Bitcoin 为源链)、THORChain(Bitcoin 任一方向)、Across(涉及 Solana 的路线)或 Eco(跨生态路线),必须在此处、即获取报价时提供,才能获得可执行报价;若在这些情况下省略,则会返回仅含价格、不可执行的预览(请参阅 ravn_quote 的 executable),而不会报错。地址格式错误、属于错误的生态系统,或已知的非钱包地址(RAVN 列出的代币铸造/合约地址、本次兑换涉及的代币地址、原生币哨兵地址、销毁地址、Solana 核心程序,以及通过链上查询发现的 Solana 代币账户或程序——代币账户错误会指出其所属钱包,该钱包地址才是应使用的地址)都会在此处报错——发送到此类地址的资金无法追回。应省略该字段,而不是传入空字符串;空字符串会被视为省略。 |
| refundAddress | string | 否 | 兑换失败时退还输入资产的地址。对于 Bitcoin 为源链的 Relay 或 THORChain 报价,必须在此处、即获取报价时提供——两者都不支持在执行时重新绑定,因此省略后会返回仅含价格、不可执行的预览,而在 ravn_execute 中稍后提供也不会生效。其他以 BTC 为源链的 venue(Garden、Chainflip、Rift)支持在执行时绑定此地址。根据输入链验证(退款会退回源链),并执行与 destinationAddress 相同的非钱包地址检查 |
| slippageBps | integer | 否 | 可接受的最大滑点,单位为基点 |
| rankingMode | enum | 否 | best_output(默认)选择净输出最高的报价;fastest 选择在 slippageBps 范围内结算最快的报价best_output | fastest |
| excludeVenues | array | 否 | 从此次竞价中排除指定 venue,例如因风险顾虑而排除某个 venue,或 ravn_health 显示其性能下降。指定对此交易对从未符合条件的 venue 不会产生任何影响,也不会报错 |
| confidential | boolean | 否 | 通过 NEAR Intents 的 Confidential Intents 私密结算,使存款和付款无法在链上关联。通过此 MCP 服务,只会对 NEAR 报价(若无法报价则返回 NO_LIQUIDITY,绝不会回退到公开方式):RAVN 的第二个私密 venue Houdini Swap 需要最终用户的 IP、user-agent 和国家/地区信息以满足其合规规则,而 MCP 调用不包含这些信息——如需使用,请调用 POST /api/v1/quote。EVM 到 EVM 额外约 0.3 bps;涉及 Bitcoin 或 Solana 时额外约 5-8 bps;结算速度可能慢于公开兑换(Bitcoin 源链:公开方式 13 分钟,私密方式 43 分钟)——执行前请查看 estimatedTimeSeconds |
| apiKey | string | 否 | 你的 RAVN API 密钥(如果有)——可提高速率限制 |
详细介绍
RAVN 示例
RAVN 跨链兑换 API 的可运行代码示例——包括原生 Bitcoin,而非封装版 BTC。
一次集成即可覆盖 EVM 链、原生 Bitcoin 和 Solana。每次报价都会并行竞速所有实时执行场所,并采用净输出最佳的结果。**RAVN 在每条路线上的费用均为 0 bps。**非托管:RAVN 绝不会持有你的资金,也不会自行编写智能合约。
无需注册即可开始。以下每个示例都可以匿名运行。
git clone https://github.com/ravndex/ravn-examples
cd ravn-examples && npm install
npm run health
示例
| 展示内容 | |
|---|---|
src/health.ts | 10 秒冒烟测试——当前正在竞速的场所有哪些。从这里开始。 |
src/btc-out.ts | Base 上的 USDC → 原生 BTC,端到端使用 SDK 的 executeAndTrack,包含费用和状态报告。这是大多数兑换 API 无法实现的功能。无需钱包即可试运行。 |
src/agent-swap.ts | Claude 工具调用循环:由模型选择兑换,密钥仍由你的代码保管。 |
src/x402-client.ts | 通过 x402 按调用付费——无需密钥,无需账户。 |
src/ravn.ts | 共享客户端:官方 @ravnexchange/sdk(零依赖、带类型)以及金额辅助工具。 |
MCP.md | 将 Claude 或 Cursor 指向托管的 MCP 服务。只需三行配置。 |
调用约定
始终按相同顺序调用 4 次。
POST /quote → best route + an opaque quoteToken
POST /execute → an execution payload tagged by executionType, with its own quoteToken
(+ submit-signature, when the type is SIGNATURE)
POST /status → pending → processing → success (or refunded / failed)
使用 /execute 返回的 quoteToken,以及它的 statusRef(否则使用兑换的交易哈希),并将你在兑换旁发送的费用支付哈希作为 txHash 传入 /status 进行轮询;对于双步骤路线(TRANSACTION 中包含 statusRef),则将兑换本身的交易哈希作为 txHash,直到状态最终确定。
使用 POST:quoteToken 可能达到几十 KB,过长的内容放在 GET 查询字符串中会导致请求失败。
一切都由一个字段决定:
switch (execution.executionType) {
case "TRANSACTION": // sign and broadcast it yourself
case "SIGNATURE": // sign typed data; RAVN submits it, no gas
case "DEPOSIT": // send the input asset to an address
}
最容易让人踩坑的一点
ERC-20 兑换实际上需要两笔交易。在任何合约能转移你的代币之前,你必须先签署一笔独立的链上授权——即 approve()。需要授权时,TRANSACTION 和 SIGNATURE 负载中会携带可直接发送的内容,字段为 approval。
if (execution.approval) {
const { to, data, value } = execution.approval; // value is a decimal string
const hash = await wallet.sendTransaction({ to, data, value: BigInt(value) });
await client.waitForTransactionReceipt({ hash }); // MINED, not just broadcast
}
// …now send the swap
在授权上链确认之前广播兑换,会导致 transferFrom 回滚,用户还得承担 Gas 费。在免 Gas 场所(CoW、Bebop),情况更隐蔽,也更糟:订单会被接受,却永远不会成交,并且没有错误提示。原生币卖出和 DEPOSIT 路线都不会携带 approval。
RAVN 会在 /execute 时读取用户链上的授权额度,如果额度已覆盖兑换金额,就不会返回 approval。如果读取失败,则仍会包含 approval,因此你需要自行检查 approval.spender 的授权额度;如果额度已覆盖 approval.amount,则跳过授权(btc-out.ts 会通过 executeAndTrack 的 hasAllowance 完成这项检查)。RAVN 只读取最新区块,因此同一代币和 spender 同一时间只能执行一笔兑换。如果返回 approval.reset(Ethereum 上的 USDT 存在部分授权额度),则需要先发送 approve(spender, 0) 并等待其上链确认;executeAndTrack 会处理这一流程。
0x Gasless 也可能返回 approvalData:用于免 Gas 授权代币的第二个类型化数据签名,并作为 approvalSignature 发送到 /submit-signature。executeAndTrack 会为你完成签名。
收取你的费用
如果你的密钥设置了费用,只有完成以下两件事,兑换才会向你支付费用:
- 按
execution.fee返回的内容准确支付,如果有该字段(Rift、私人兑换、Eco Routes、Layerswap、Mayan 不支付推荐费的路线)。EVM:兑换成功后发送fee.transaction,或将 ERC-20 费用与兑换打包发送。Bitcoin:费用是存款交易自身的第二个输出。Solana:转账包含在存款交易自身中。 - 持续向
/status报告兑换状态,直到交易最终确认,每次轮询都将该笔费用支付的哈希(两步路线中,则使用兑换本身的哈希)作为txHash。对于同链交易平台,RAVN 只能通过你的轮询得知兑换已发生:从未报告,就从未支付。
对于 TRANSACTION,executeAndTrack 会支付费用,并将供你轮询的哈希(statusTxHash)交给你;从 SDK 0.2.0 起,它自身的轮询也会持续到 expired 和 not_found,并在状态调用失败时重试。DEPOSIT 则由你处理:btc-out.ts 会发送存款和费用,然后在一个循环中轮询所有交易。完整检查清单:https://docs.ravn.exchange/collecting-your-fee
unlimitedRecommended: true(CoW)表示交易平台更倾向于让你一次性批准较大金额,而不是每次兑换都支付批准手续费。data 仍会编码准确金额;是否调高由你决定。
金额
始终使用字符串,始终使用代币的最小单位——wei、lamports、satoshis。绝不使用浮点数。
src/ravn.ts 中的 toBaseUnits() / fromBaseUnits() 可安全转换。
跨生态系统兑换
在 EVM 上卖出并接收 BTC 或 SOL 时,需要提供 destinationAddress——收款链不知道你的 EVM 地址。
速率限制
| 无密钥 | 每个 IP 每分钟 30 次请求,另加每分钟 120 次 /status 轮询 |
| 免费密钥,即时获取,无需审核 | 每分钟 120 次请求,另加每分钟 480 次 /status 轮询 |
状态轮询有独立的额度(为你的限制的 4 倍)。每个受速率限制的响应都包含 X-RateLimit-Limit、X-RateLimit-Remaining 和 X-RateLimit-Reset(Unix 时间戳秒数);429 响应还会添加 Retry-After。
将密钥作为 x-api-key 传入。每个端点都已启用 CORS,因此浏览器端的 dapp 和钱包小组件可以直接调用 API,无需服务端代理。
错误
根据稳定的 code 进行分支处理,切勿依赖错误消息。
INVALID_REQUEST(不支持的链也属于此类) · UNSUPPORTED_TOKEN · NO_LIQUIDITY ·
QUOTE_EXPIRED · QUOTE_INVALID · QUOTE_NOT_EXECUTABLE · BUILD_FAILED · ORDER_REJECTED ·
VENUE_RATE_LIMITED · RATE_LIMITED · UNAUTHORIZED · UNAVAILABLE · NOT_FOUND · NOT_CONFIGURED ·
INTERNAL。若完全没有收到响应,SDK 会添加 NETWORK_ERROR。完整列表:https://docs.ravn.exchange/errors
每个响应都包含 x-request-id。如果要报告有问题的报价,请附上该 ID——我们会据此查找记录。
链接
- 文档 — https://docs.ravn.exchange
- 应用 — https://app.ravn.exchange
- MCP 服务 —
https://app.ravn.exchange/api/mcp - OpenAPI 规范(导入到 Postman / Insomnia)—
https://app.ravn.exchange/openapi.json - 合作事宜 — [email protected] · @ravnexchange
采用 MIT 许可。欢迎提交问题和 PR。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。