RAVN
Server Details
Cross-chain swap API for native Bitcoin, Solana and EVM chains. No API key, no custody.
- Status
- Healthy
- Uptime
- 100.0% over 61 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- ravndex/ravn-examples
- GitHub Stars
- 0
TDQS
Scored across 10 tools
Tools map cleanly to distinct stages of the swap lifecycle: discovery, quote, execute, signature submission, status, and health. The only mild overlap is among the metadata-oriented tools (ravn_chains, ravn_tokens, ravn_tokens_resolve, ravn_btc_coverage), but their descriptions delineate registry lookup vs. arbitrary token resolution vs. BTC venue ranking.
All tool names use the same ravn_ prefix and snake_case, making them predictable and easy to scan. The set mixes noun-resource names (ravn_status, ravn_chains, ravn_tokens) with verb-first operations (ravn_quote, ravn_execute, ravn_submit_signature), so it is not a pure verb_noun convention.
Ten tools is well within the ideal range for a multi-chain swap aggregator. Each tool corresponds to a distinct workflow step or supporting capability, with no obvious redundancy.
The core swap lifecycle is covered: chain/token discovery, quoting, execution payload generation, signature submission, and status polling, plus health and BTC-specific helpers. Minor gaps include no explicit swap history/list operation or refund/cancel flow, but standard agent workflows can be completed.
Available Tools
10 toolsravn_btc_coverageHow many BTC venues list each tokenARead-onlyInspect
For a swap where native BTC is the source: how many BTC venues list each of ravn_tokens's tokens on chainId. A ranking hint (a token more venues list is more likely to keep routing through one venue's outage), not a gate: ravn_quote decides, and tokens off RAVN's list route from BTC too. BTC-as-source only.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | No | Your RAVN API key, if you have one — raises your rate limit | |
| chainId | Yes | The destination chain to check BTC-source coverage on |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds the non-obvious interpretive caveat that coverage is a heuristic hint rather than an eligibility gate, and that RAVN's token list is not exhaustive for BTC-source routing. No claim about result shape or freshness is made, but the output schema carries the return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short segments with the core purpose front-loaded before the ranking-hint caveat and the BTC-only constraint. Some clauses are densely packed ("ravn_tokens's tokens") but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analytical lookup with a full output schema and complete parameter documentation, the description supplies everything needed to call and interpret it: the source-chain precondition, the input dimension, and the interpretive status of the result. It does not describe freshness or how venue counts are computed, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented (apiKey as a rate-limit lifter, chainId as the destination chain). The description only echoes chainId as the scoping dimension and adds no format or semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (counts how many BTC venues list each token on a given chainId) and immediately scopes it to "a swap where native BTC is the source". It also distinguishes itself from ravn_tokens (whose token list it consumes) and ravn_quote (which it explicitly says takes precedence in routing decisions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the output as "a ranking hint ... not a gate: ravn_quote decides", which tells the agent when not to rely on it, and names the case of tokens off RAVN's list routing from BTC too. Guidance is clear but does not state the positive condition (e.g. "call this when ranking candidate tokens before a quote") as directly as it could.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ravn_btc_prepare_sendPrepare a signable Bitcoin transaction for a RAVN DEPOSITARead-onlyInspect
Turns a DEPOSIT-type ravn_execute result (deposit.address + deposit.amount) into a ready-to-sign PSBT, so you don't have to write your own UTXO selection and fee-estimation code. If that result also has a fee (an integrator fee RAVN collects beside the deposit), pass its fee.address as feeAddress and fee.amount as feeAmountSats: the PSBT then pays it as a second output of the same transaction, which is the only place RAVN looks for it. Fetches your UTXOs and the current network fee rate from mempool.space (public, no auth). RAVN never sees or touches a private key — sign the returned PSBT with your own wallet and broadcast it yourself. Only one signer is ever needed (unlike PSBT flows that require coordinating signatures across multiple UTXO-holding wallets), because every RAVN BTC-source venue resolves to a plain payment to the deposit address (plus RAVN's fee output, when there is one).
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Defaults to mainnet | |
| toAddress | Yes | deposit.address from the ravn_execute DEPOSIT result | |
| amountSats | Yes | deposit.amount from the ravn_execute DEPOSIT result, in satoshis | |
| feeAddress | No | fee.address from the ravn_execute DEPOSIT result — REQUIRED whenever that result has a `fee`. RAVN's fee is paid as an extra output of this same transaction; leave it out and the fee is never paid | |
| fromAddress | Yes | Your Bitcoin address holding the UTXOs to spend — native SegWit (bc1q…) or Taproot (bc1p…) only | |
| feeAmountSats | No | fee.amount from the ravn_execute DEPOSIT result, in satoshis — pass together with feeAddress | |
| feeRateSatsPerVb | No | Omit to use mempool.space's current halfHourFee estimate |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it discloses the external dependency (mempool.space, public, no auth), the fee-output semantics ('the only place RAVN looks for it'), the key-custody boundary (RAVN never touches a private key; you sign and broadcast), and the single-signer guarantee with the reason behind it. This is rich behavioral context the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core transformation in the first clause, and every sentence carries integration or behavioral information. It is on the longer side and the multi-signer aside is somewhat tangential, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description still covers the end-to-end workflow: input source, fee handling, external data fetch, custody model, and signing/broadcast responsibility. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds integration meaning the schema lacks: it maps each parameter back to its source field in the ravn_execute result and explains the coupling between feeAddress and feeAmountSats as a conditional requirement. This raises it above the schema-only baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (turns a DEPOSIT result into a ready-to-sign PSBT) and resource (a Bitcoin transaction for a RAVN DEPOSIT), and explicitly positions itself relative to the ravn_execute output that feeds it. An agent can tell it apart from ravn_submit_signature and ravn_execute without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states the trigger condition (a DEPOSIT-type ravn_execute result with deposit.address/deposit.amount) and the conditional branch (when a `fee` is present, pass feeAddress/feeAmountSats), plus the sign-and-broadcast-yourself workflow. It differentiates from multi-signer PSBT approaches but never names sibling tools as alternatives, so it stops just short of a full when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ravn_chainsList every chain RAVN supportsARead-onlyInspect
Every chain RAVN lists a token registry for (see ravn_tokens). Static, doesn't change per request, safe to cache instead of hardcoding a chain table.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | No | Your RAVN API key, if you have one — raises your rate limit |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, but the description adds substantial behavioral value: it states the result is static, does not change per request, and is safe to cache. This is exactly the kind of context beyond the annotation that helps an agent decide whether and how often to call the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero wasted words: the purpose is front-loaded and the caching guidance follows naturally. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read-only list with no required parameters and an output schema available. The description covers the key non-obvious facts—stability, cacheability, and the relationship to ravn_tokens—leaving nothing essential missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional apiKey parameter is already fully documented in the schema as a rate-limit booster. The description adds no parameter-level information, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific resource: every chain RAVN maintains a token registry for, and the parenthetical cross-reference to ravn_tokens distinguishes it from the sibling that lists tokens. The title adds the clear verb 'List'. An agent can immediately tell what this tool returns and how it differs from the token-related siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: the data is static, per-request invariant, and safe to cache instead of hardcoding a chain table. This effectively tells the agent when to call it, though it does not explicitly state when not to use it or name a specific alternative tool beyond the ravn_tokens cross-reference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ravn_executeExecute a RAVN swap quoteAInspect
Turn a quoteToken from ravn_quote into an execution payload. Returns one of three shapes (executionType): TRANSACTION (sign and broadcast yourself), SIGNATURE (sign, RAVN submits), or DEPOSIT (send the input asset to a given address). RAVN never takes custody of funds — you always sign or send from your own wallet. TRANSACTION and SIGNATURE may also include an approval — an ERC-20 approve() you must broadcast and wait to be MINED before the transaction/signature, or it fails (reverts on TRANSACTION; on SIGNATURE the order is accepted and silently never fills). Only present when the sold token needs it — omitted for native-coin sells and already-approved tokens. An approval.reset (Ethereum USDT holding a partial allowance) goes first, mined, then the approval. A result with sandbox: true is a test: send nothing from it.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | No | Your RAVN API key, if you have one — raises your rate limit | |
| quoteToken | Yes | The quoteToken returned by ravn_quote | |
| refundAddress | No | Late-bound refund recipient if the swap fails, honoured by venues that read one at execution time (Chainflip, Garden, NEAR Intents, Rift). Every other venue, Mayan, Layerswap and RAVN two-hop routes included, fixes the refund address when it prices: one that differs from the refund the quote was priced with is rejected rather than silently ignored. A quote priced without one refunds where it was priced (normally userAddress) at these venues, so a refundAddress here other than userAddress is rejected too, when userAddress is a valid address on the input chain (selling native Bitcoin with no quoted refund, a venue that can execute uses this one). Supply refundAddress on ravn_quote instead | |
| destinationAddress | No | Late-bound output recipient, honoured by venues that bind at execution time (Chainflip, Garden, Layerswap, Mayan, NEAR Intents, Rift, RAVN two-hop routes). Every other venue fixes the recipient when it prices: a DIFFERENT address here is rejected rather than silently ignored. Supply destinationAddress on ravn_quote instead, which every venue honours |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the three return shapes, that approval must be broadcast and MINED first or the TRANSACTION reverts / the SIGNATURE silently never fills, that approval.reset must precede the approval, and that RAVN never takes custody. These are exactly the failure modes an agent cannot infer from readOnlyHint=false / destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the three execution shapes before the approval caveats, and every sentence carries operational information. It is dense and somewhat long, but nothing is wasted or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the conditional shape semantics (TRANSACTION/SIGNATURE/DEPOSIT, approval, sandbox) are behavioral context an agent needs to act correctly, and the description supplies all of it. Nothing required to call the tool safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema text for refundAddress/destinationAddress is already extremely detailed (late-bound vs price-bound venues, rejection rules). The description adds no parameter-level syntax or format beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Turn a quoteToken from ravn_quote into an execution payload') and enumerates the three executionType outcomes. An agent can distinguish this from ravn_quote (pricing) and ravn_submit_signature without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The first sentence establishes the pipeline from ravn_quote and the description explains when an approval is or isn't present, plus what sandbox:true means. It never explicitly names ravn_submit_signature as the alternative for the SIGNATURE shape, so the routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ravn_healthCheck RAVN venue healthARead-onlyInspect
Liveness check across every venue RAVN routes through — call before a swap if you want to know whether a route is degraded ahead of time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that: it discloses that the check spans all venues, is a liveness probe (not a performance metric), and is intended as a pre-swap gate — behavior the annotations alone don't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads what the tool is before adding the usage hint. No redundant restatement of the title or annotation flags; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present, and annotations covering read-only/open-world semantics, the description supplies exactly the remaining context an agent needs: what it checks and when to call it. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a 0-param tool applies. The description correctly implies the scope is global across venues, matching the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('liveness check') and a precise scope ('across every venue RAVN routes through'), which makes it clear this is a health probe rather than a quote or execute. It does not explicitly differentiate itself from the similarly-named sibling ravn_status, so the agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'call before a swap if you want to know whether a route is degraded ahead of time' gives a clear trigger condition and intent. It stops short of naming alternatives (e.g. ravn_status) or saying when not to bother, so the routing guidance is contextual rather than exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ravn_quoteGet a RAVN swap quoteARead-onlyInspect
Get a swap quote from RAVN — same-chain or cross-chain, across 18 chains including native (non-wrapped) Bitcoin and Solana as source or destination. Free, no API key or payment required. Returns a quoteToken; pass it to ravn_execute to get a signable/broadcastable execution payload.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | No | Your RAVN API key, if you have one — raises your rate limit | |
| timeoutMs | No | The race's time limit in milliseconds, counted from its start: once it has passed and some venue has priced the swap, slower venues are left out (with none priced yet, the first price ends the wait; a quote with slippage.noMinimum counts only 2000 ms past the limit). Defaults to 6000; a positive integer, clamped to 1000–15000 | |
| inputToken | Yes | Token contract address, or 0xEeeeeEeeeEeEeeEeEeEeeeEEeeeeEeeeeeeeEEeE for the chain's native coin | |
| onlyVenues | No | Race only these venues, e.g. ["bebop"] for an RFQ-only race. Every other venue is left out (including ones RAVN adds later); excludeVenues still applies on top. It covers every venue RAVN routes your funds through: a multi-step route is offered only when its own venue id and every venue in its hops are listed, e.g. ["compose","jupiter","relay"] or ["relay","kyberswap"]. RAVN's stablecoin route also needs 0x_swap beside its hops: it sweeps the leftover. Venues that swap for you may route through other venues of their own choosing, which this can't reach: Layerswap (a Solana token often goes through Jupiter first), Relay, Rift, Across (when it swaps before or after bridging) and Mayan (Jupiter on Solana, other DEXs such as Nordstern on EVM). Same-chain venues only quote same-chain pairs; if none of the named venues can quote you get NO_LIQUIDITY | |
| inputAmount | Yes | Positive integer string, in the input token's smallest unit (no decimals) | |
| outputToken | Yes | Token contract address, or 0xEeeeeEeeeEeEeeEeEeEeeeEEeeeeEeeeeeeeEEeE for the chain's native coin | |
| rankingMode | No | best_output (default) picks the highest net output; fastest picks the quickest-settling quote within slippageBps | |
| slippageBps | No | Max acceptable slippage in basis points. Setting it drops venues that enforce no minimum (today Rift) from the race unless allowNoMinimum is true | |
| userAddress | Yes | Address the input asset will be sent from | |
| confidential | No | Settle privately via NEAR Intents' Confidential Intents so the deposit and payout can't be linked on-chain. Through this MCP server only NEAR quotes it (NO_LIQUIDITY if it can't, never a public fallback): RAVN's other private venues aren't offered here — Houdini Swap needs the end user's IP, user-agent and country for its compliance rules, and Hinkal the user's country and two signatures from the paying wallet before it builds, none of which an MCP call carries — use POST /api/v1/quote and /api/v1/execute for them. ~0.3 bps extra on EVM-to-EVM, ~5-8 bps extra when Bitcoin or Solana is a leg, and it can settle slower than a public swap (Bitcoin-source: 13 min public vs 43 min confidential) — read estimatedTimeSeconds before executing | |
| inputChainId | Yes | Numeric chain id, e.g. 1=Ethereum, 8453=Base, -1=Bitcoin, -2=Solana — see ravn_chains for the full list, or ravn_health for live venue status | |
| excludeVenues | No | Drop specific venues, e.g. a risk objection to one of them or ravn_health showing it degraded. An excluded venue is used nowhere in the route, including the steps of RAVN's multi-step routes (compose, and relay quotes that carry hops); a multi-step route that needs it isn't offered. Venues that swap for you may route through other venues of their own choosing, which this can't reach: Layerswap (a Solana token often goes through Jupiter first), Relay, Rift, Across (when it swaps before or after bridging) and Mayan (Jupiter on Solana, other DEXs such as Nordstern on EVM). Naming a venue that was never eligible for this pair is a no-op, not an error | |
| outputChainId | Yes | Numeric chain id, e.g. 1=Ethereum, 8453=Base, -1=Bitcoin, -2=Solana — see ravn_chains for the full list, or ravn_health for live venue status | |
| refundAddress | No | Where to refund the input asset if the swap fails. Selling native Bitcoin with userAddress set to a Bitcoin address and no refundAddress refunds to userAddress. Well-known sample addresses (e.g. bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh) count as no address: supply the real refund. Otherwise it is required here, at quote time, for a Bitcoin-source Relay or THORChain quote — neither has an execute-time re-bind, so omitting it returns a priced-but-unexecutable preview and supplying it later on ravn_execute is refused. Other BTC-source venues (Garden, Chainflip, Rift, NEAR Intents) support binding this at execute time instead. Validated against the INPUT chain (refunds are paid back on the origin), with the same non-wallet-address check as destinationAddress | |
| allowNoMinimum | No | Let venues that enforce no minimum (today Rift) race even though slippageBps is set. Their quotes carry slippage.noMinimum true and fill at the venue's own rate: slippageBps does not protect them | |
| destinationAddress | No | Where output should land, if different from userAddress. Required here, at quote time, to get an executable quote from Relay (Bitcoin as the source), THORChain (Bitcoin either direction), Across (a Solana-touching route), or Eco (a cross-ecosystem route) — omit it there and you get back a priced-but-unexecutable preview instead (see ravn_quote's executable), not an error. A malformed address, one from the wrong ecosystem, or a known non-wallet address (a RAVN-listed token's mint/contract, this swap's own tokens, the native-coin sentinel, burn addresses, Solana core programs, and via an on-chain lookup a Solana token account or program — the token-account error names the owning wallet, which is the address to use) IS an error here — funds sent there are unrecoverable. Omit the field rather than passing an empty string; an empty string is treated as omitted |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds real value beyond that with cost (free, no key), the quoteToken output contract, and the downstream dependency. It omits one behavioral trait an agent would want up front — that some quotes come back as priced-but-unexecutable previews rather than errors — which is only disclosed in the per-parameter descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the resource and its scope before the cost and handoff details. No filler and nothing that duplicates the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and all 16 params are fully documented, so the description need only orient the agent — which it does, covering scope, cost, and the execute handoff. The remaining gap is the executable-vs-preview distinction, a consequential trait buried in parameter text rather than surfaced at the top level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 16 parameters, with unusually rich per-field text (venue include/exclude semantics, refundAddress timing rules, confidential trade-offs), so the schema carries the load. The description itself adds no parameter-level meaning, which lands at the baseline 3 for full-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get a swap quote) and scopes it precisely: same-chain or cross-chain, 18 chains, native non-wrapped BTC and Solana on either side. The final sentence distinguishes it from the sibling ravn_execute by naming the handoff artifact (quoteToken) and what that sibling produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes the sequencing explicit — call this first, then pass the quoteToken to ravn_execute — and removes a common blocker by stating it is free with no API key or payment. It does not name when-not to use it (e.g. that chain ids should come from ravn_chains or venue status from ravn_health), though those pointers live in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ravn_statusCheck RAVN swap statusARead-onlyInspect
Poll the status of a swap by its quoteToken and ref from ravn_execute (statusRef, deposit address, or origin tx hash). Use the quoteToken execute returned — compose rebinds hop 1 onto hop 2's deposit. Status is authoritative where the venue exposes it; a swap the venue can't track reports 'unknown' rather than a guess.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | statusRef from ravn_execute when it returned one (always for DEPOSIT and SIGNATURE venues — it is the venue's own tracking key, which is not always the deposit address); otherwise the origin tx hash | |
| apiKey | No | Your RAVN API key, if you have one — raises your rate limit | |
| txHash | No | The transaction that paid a fee the swap carries, where RAVN can't find it otherwise: a two-hop route's hop-1 tx, or the on-chain transaction that carried an execution's fee.transaction (Rift and private swaps on DEPOSIT; Eco, Layerswap and Mayan routes paying no referrer on TRANSACTION) — on its own, or the batch or relay that included it (not an EIP-5792 batch id or a 4337 userOpHash). Not needed on an Eco or Mayan TRANSACTION with no statusRef when the fee rode in the swap's own transaction and you poll with that hash. Send it on every poll once confirmed; until RAVN can read it, a delivered swap reports 'processing' (up to 15 minutes after execute). Without it nothing is owed on that swap | |
| quoteToken | Yes | The quoteToken from ravn_quote — the venue is decoded from it |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries real weight: status is authoritative, untracked swaps return 'unknown' rather than a guess, a delivered swap reports 'processing' for up to 15 minutes until the txHash is readable, and apiKey raises the rate limit. These are behavioral traits the agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the required inputs in the first sentence, then adds reinforcing context. The later sentences are dense but each earns its place by pinning down the ref/txHash semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the relevant failure modes, tracking-key selection, and the timing caveat. What an agent needs to poll correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds non-schema meaning: quoteToken carries the rebinding of hop 1 onto hop 2's deposit, and ref may be a statusRef, deposit address, or origin tx hash rather than only the form the schema lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Poll the status of a swap') and identifies the exact inputs it keys on (quoteToken and ref from ravn_execute). This clearly separates it from ravn_execute and ravn_quote, which only create or price the swap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent when to use it (after ravn_execute, to poll) and how to source the ref depending on venue, plus the txHash polling condition. It gives clear context but does not state explicit when-not conditions or boundaries against all sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ravn_submit_signatureSubmit a signed RAVN orderAInspect
For a SIGNATURE-type ravn_execute result only: submit the signature(s) you collected (over typedData, and approvalData if present) to actually place the order. RAVN decodes the venue from quoteToken and routes to the right venue-specific submit path — you never touch a per-venue endpoint. Returns a statusRef — pass it to ravn_status as ref to poll this swap.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | No | Your RAVN API key, if you have one — raises your rate limit | |
| signature | Yes | Signature over the typedData from ravn_execute | |
| quoteToken | Yes | The quoteToken from ravn_quote | |
| approvalSignature | No | 0x Gasless only: signature over approvalData, when ravn_execute returned one |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate this is not read-only and not destructive, and the description reinforces the side effect by saying it 'actually places the order.' It adds useful behavioral context: RAVN decodes the venue from quoteToken, routes automatically, and returns a statusRef for polling. It doesn't cover failure modes, but the annotation profile covers the key safety expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient: the key condition is front-loaded, each sentence carries distinct information, and there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich schema and output schema present, the description covers the remaining contextual gaps: when the tool is applicable, what inputs are involved, how venue routing works, and how to follow up via ravn_status. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description doesn't need to re-explain parameters. It adds mild value by linking parameters to their sources (signature from ravn_execute, quoteToken from ravn_quote), but this is context rather than essential semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the exact condition ('For a SIGNATURE-type ravn_execute result only') and states the core action: submit collected signatures to actually place the order. This clearly distinguishes it from sibling tools like ravn_execute, ravn_quote, and ravn_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly scopes when to use the tool ('SIGNATURE-type ravn_execute result only') and tells the agent what inputs are relevant (signature over typedData, approvalSignature if present). It also explains the routing behavior so the agent knows it doesn't need per-venue endpoints, and it points to ravn_status for polling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ravn_tokensList RAVN's token registry for a chainARead-onlyInspect
RAVN's own listed token registry for one chain — populate a token picker without hardcoding one. This is "what RAVN knows about and might route", not a per-pair routability guarantee for any specific pair; call ravn_quote to check that.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | No | Your RAVN API key, if you have one — raises your rate limit | |
| chainId | Yes | Numeric chain id, e.g. 1=Ethereum, 8453=Base, -1=Bitcoin, -2=Solana — see ravn_chains for the full list, or ravn_health for live venue status |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds behavioral nuance by clarifying that the list represents 'what RAVN knows about and might route', not a guaranteed routing list, and directs to ravn_quote for verification. This is valuable context beyond the annotations, though it doesn't discuss rate limits or other behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero waste. It front-loads the core purpose and then adds a crucial caveat and pointer to an alternative. Every sentence earns its place, and the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the output schema exists, the description does not need to explain return values. It covers the purpose, scope, limitations, and directs to the relevant sibling tool for further verification. For a read-only list tool with clear annotations, everything an agent needs to call it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both apiKey and chainId having clear descriptions. The tool description does not add further detail about the parameters themselves (e.g., formatting, optionality), so it remains at the baseline of 3—the schema carries the full burden and the description doesn't need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource ('List RAVN's token registry for one chain') and adds a concrete use case ('populate a token picker without hardcoding one'). It also distinguishes itself from ravn_quote by clarifying it is not a per-pair routability guarantee, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use the tool (to populate a token picker) and when not (for per-pair routability, directing to ravn_quote). It even names the alternative tool and the condition that selects it, leaving no ambiguity for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ravn_tokens_resolveResolve a token address to its metadataARead-onlyInspect
Resolve an arbitrary token address to its metadata (symbol, name, decimals) via an on-chain read — for a paste-any-address flow, when the token isn't necessarily on ravn_tokens's list.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | No | Your RAVN API key, if you have one — raises your rate limit | |
| address | Yes | Token contract address / mint to resolve | |
| chainId | Yes | Numeric chain id, e.g. 1=Ethereum, 8453=Base, -1=Bitcoin, -2=Solana — see ravn_chains for the full list, or ravn_health for live venue status |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds 'via an on-chain read,' confirming the operation is a non-mutating lookup. It also sets expectations for arbitrary/unlisted addresses, which is useful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence delivers purpose, output, behavioral mode, and usage context without waste. The em-dash separates the core action from the targeting guidance cleanly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering read-only/open-world behavior, the description provides all necessary context for correct invocation. It clearly states what this tool does, when to use it, and how it differs from ravn_tokens.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents address, chainId, and apiKey. The description reinforces that 'address' is a token contract/mint and clarifies the output metadata, but it does not add parameter-level detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Resolve'), a specific resource ('arbitrary token address'), and the exact metadata returned (symbol, name, decimals). It also distinguishes itself from ravn_tokens by clarifying it handles tokens not necessarily on that list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly scopes the tool to a 'paste-any-address flow' and states when it applies: 'when the token isn't necessarily on ravn_tokens's list.' This gives the agent a clear decision rule versus the sibling ravn_tokens.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
ravn_btc_coverage1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "chainId": { - "description": "Echoes the requested chain", - "type": "number" - }, - "coverage": { - "additionalProperties": { - "type": "number" - }, - "description": "Token address (lowercase on EVM; a Solana mint exactly as listed, since base58 is case-sensitive) to the number of BTC venues (1-3) that route to it from native Bitcoin. Tokens no venue serves are omitted, not listed at 0", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "filtered": { - "description": "False means the upstream venue lists couldn't be reached right now — coverage is empty and the answer is unknown, not 'nothing routes'. Treat like an outage: don't filter your token list on it", - "type": "boolean" - } - }, - "required": [ - "chainId", - "filtered", - "coverage" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "chainId": { + "description": "Echoes the requested chain", + "type": "number" + }, + "coverage": { + "additionalProperties": { + "type": "number" + }, + "description": "Token address (lowercase on EVM; a Solana mint exactly as listed, since base58 is case-sensitive) to the number of BTC venues (1-3) that list it, for native Bitcoin as the source. Every RAVN-listed token on the chain is in it", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "filtered": { + "description": "False means the upstream venue lists couldn't be reached right now — coverage is empty and the answer is unknown, not 'nothing routes'. Treat like an outage: don't filter your token list on it", + "type": "boolean" + } + }, + "required": [ + "chainId", + "filtered", + "coverage" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
2 tool updates
- Changed
ravn_health1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "status": { - "enum": [ - "ok", - "degraded" - ], - "type": "string" - }, - "venues": { - "items": { - "additionalProperties": false, - "properties": { - "healthy": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "id", - "name", - "healthy" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "status", - "venues" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "status": { + "enum": [ + "ok", + "degraded" + ], + "type": "string" + }, + "venues": { + "items": { + "additionalProperties": false, + "properties": { + "healthy": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "logoUrl": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "healthy" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "status", + "venues" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
- Changed
ravn_quote1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Every other venue that raced and produced a usable quote, best expected net output first (each carries expectedOutputAmount: a quote with slippage.noMinimum counts 0.05–1% under its outputAmount, by token type and size, the shortfall such a venue has delivered; one more than 1% above the best quote that holds a minimum is listed here but never picked as the main quote). Each has its own quoteToken to pass to ravn_execute instead, and pickable: false when RAVN would never pick it (a preview-only price while an executable one exists, or a no-minimum quote more than 1% above every quote holding a minimum), so choose among pickable ones on expectedOutputAmount; and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", - "items": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "estimatedTimeIsGuess": { - "description": "True when the time is RAVN's estimate, not the venue's own figure", - "type": "boolean" - }, - "estimatedTimeSeconds": { - "type": "number" - }, - "executable": { - "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", - "type": "boolean" - }, - "expectedOutputAmount": { - "description": "What RAVN counts on this route delivering, in the output token's base units: output.amount, less slippage.expectedShortfallBps when the venue holds no minimum (Rift); the same as output.amount otherwise. RAVN ranks on this (less gas), so compare routes on it, not output.amount. Alternatives carry it too", - "type": "string" - }, - "expiresAt": { - "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; up to 10 minutes past it, execute prices the same route again and builds it only if it still meets the minimum this quote showed, else (or later) fails with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", - "type": "number" - }, - "fee": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "gas": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "estimated": { - "type": "boolean" - }, - "native": { - "type": "string" - }, - "nativeSymbol": { - "type": "string" - }, - "usd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "native", - "nativeSymbol", - "usd", - "estimated" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The native gas the user must hold; null on gasless venues" - }, - "hops": { - "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "id", - "name" - ], - "type": "object" - }, - "type": "array" - }, - "input": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "inputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" - }, - "output": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "outputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the output amount. Compare against inputUsd for price impact" - }, - "quoteToken": { - "description": "Opaque token — pass to ravn_execute", - "type": "string" - }, - "routeType": { - "type": "string" - }, - "slippage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bps": { - "type": "number" - }, - "expectedShortfallBps": { - "description": "How far under its output RAVN counts on a no-minimum route delivering, in bps (5 for a $1k+ swap of listed, non-meme tokens up to 100 under $100); 0 when noMinimum is false. Already taken off expectedOutputAmount", - "type": "number" - }, - "guaranteedMin": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "isFirm": { - "type": "boolean" - }, - "noMinimum": { - "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", - "type": "boolean" - } - }, - "required": [ - "bps", - "isFirm", - "guaranteedMin", - "noMinimum", - "expectedShortfallBps" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when the venue reports no slippage bound" - }, - "venue": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "quoteToken", - "venue", - "routeType", - "input", - "output", - "expectedOutputAmount", - "fee", - "executable", - "slippage", - "gas", - "inputUsd", - "outputUsd", - "estimatedTimeSeconds", - "estimatedTimeIsGuess", - "expiresAt", - "alternatives" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "alternatives": { + "description": "Every other venue that raced and produced a usable quote, best expected net output first (each carries expectedOutputAmount: a quote with slippage.noMinimum counts 0.05–1% under its outputAmount, by token type and size, the shortfall such a venue has delivered; one more than 1% above the best quote that holds a minimum is listed here but never picked as the main quote). Each has its own quoteToken to pass to ravn_execute instead, and pickable: false when RAVN would never pick it (a preview-only price while an executable one exists, or a no-minimum quote more than 1% above every quote holding a minimum), so choose among pickable ones on expectedOutputAmount; and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "estimatedTimeIsGuess": { + "description": "True when the time is RAVN's estimate, not the venue's own figure", + "type": "boolean" + }, + "estimatedTimeSeconds": { + "type": "number" + }, + "executable": { + "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", + "type": "boolean" + }, + "expectedOutputAmount": { + "description": "What RAVN counts on this route delivering, in the output token's base units: output.amount, less slippage.expectedShortfallBps when the venue holds no minimum (Rift); the same as output.amount otherwise. RAVN ranks on this (less gas), so compare routes on it, not output.amount. Alternatives carry it too", + "type": "string" + }, + "expiresAt": { + "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; up to 10 minutes past it, execute prices the same route again and builds it only if it still meets the minimum this quote showed, else (or later) fails with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", + "type": "number" + }, + "fee": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "gas": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "estimated": { + "type": "boolean" + }, + "native": { + "type": "string" + }, + "nativeSymbol": { + "type": "string" + }, + "usd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "native", + "nativeSymbol", + "usd", + "estimated" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The native gas the user must hold; null on gasless venues" + }, + "hops": { + "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "logoUrl": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "input": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "inputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" + }, + "output": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "outputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the output amount. Compare against inputUsd for price impact" + }, + "quoteToken": { + "description": "Opaque token — pass to ravn_execute", + "type": "string" + }, + "routeType": { + "type": "string" + }, + "slippage": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bps": { + "type": "number" + }, + "expectedShortfallBps": { + "description": "How far under its output RAVN counts on a no-minimum route delivering, in bps (5 for a $1k+ swap of listed, non-meme tokens up to 100 under $100); 0 when noMinimum is false. Already taken off expectedOutputAmount", + "type": "number" + }, + "guaranteedMin": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "isFirm": { + "type": "boolean" + }, + "noMinimum": { + "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", + "type": "boolean" + } + }, + "required": [ + "bps", + "isFirm", + "guaranteedMin", + "noMinimum", + "expectedShortfallBps" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when the venue reports no slippage bound" + }, + "venue": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "quoteToken", + "venue", + "routeType", + "input", + "output", + "expectedOutputAmount", + "fee", + "executable", + "slippage", + "gas", + "inputUsd", + "outputUsd", + "estimatedTimeSeconds", + "estimatedTimeIsGuess", + "expiresAt", + "alternatives" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
1 tool update
- Changed
ravn_quote1 field changed- changed
Input schema / properties / confidential / descriptionPrevious value: -"Settle privately via NEAR Intents' Confidential Intents so the deposit and payout can't be linked on-chain. Through this MCP server only NEAR quotes it (NO_LIQUIDITY if it can't, never a public fallback): RAVN's second private venue, Houdini Swap, needs the end user's IP, user-agent and country for its compliance rules, which an MCP call doesn't carry — use POST /api/v1/quote for it. ~0.3 bps extra on EVM-to-EVM, ~5-8 bps extra when Bitcoin or Solana is a leg, and it can settle slower than a public swap (Bitcoin-source: 13 min public vs 43 min confidential) — read estimatedTimeSeconds before executing"New value: +"Settle privately via NEAR Intents' Confidential Intents so the deposit and payout can't be linked on-chain. Through this MCP server only NEAR quotes it (NO_LIQUIDITY if it can't, never a public fallback): RAVN's other private venues aren't offered here — Houdini Swap needs the end user's IP, user-agent and country for its compliance rules, and Hinkal the user's country and two signatures from the paying wallet before it builds, none of which an MCP call carries — use POST /api/v1/quote and /api/v1/execute for them. ~0.3 bps extra on EVM-to-EVM, ~5-8 bps extra when Bitcoin or Solana is a leg, and it can settle slower than a public swap (Bitcoin-source: 13 min public vs 43 min confidential) — read estimatedTimeSeconds before executing"
1 tool update
- Changed
ravn_quote1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Every other venue that raced and produced a usable quote, best expected net output first (a quote with slippage.noMinimum counts 0.05–0.5% under its outputAmount, by token type and size, the shortfall such a venue has delivered; one more than 1% above the best quote that holds a minimum is listed here but never picked as the main quote). Each has its own quoteToken to pass to ravn_execute instead, and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", - "items": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "estimatedTimeIsGuess": { - "description": "True when the time is RAVN's estimate, not the venue's own figure", - "type": "boolean" - }, - "estimatedTimeSeconds": { - "type": "number" - }, - "executable": { - "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", - "type": "boolean" - }, - "expiresAt": { - "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; up to 10 minutes past it, execute prices the same route again and builds it only if it still meets the minimum this quote showed, else (or later) fails with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", - "type": "number" - }, - "fee": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "gas": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "estimated": { - "type": "boolean" - }, - "native": { - "type": "string" - }, - "nativeSymbol": { - "type": "string" - }, - "usd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "native", - "nativeSymbol", - "usd", - "estimated" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The native gas the user must hold; null on gasless venues" - }, - "hops": { - "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "id", - "name" - ], - "type": "object" - }, - "type": "array" - }, - "input": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "inputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" - }, - "output": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "outputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the output amount. Compare against inputUsd for price impact" - }, - "quoteToken": { - "description": "Opaque token — pass to ravn_execute", - "type": "string" - }, - "routeType": { - "type": "string" - }, - "slippage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bps": { - "type": "number" - }, - "guaranteedMin": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "isFirm": { - "type": "boolean" - }, - "noMinimum": { - "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", - "type": "boolean" - } - }, - "required": [ - "bps", - "isFirm", - "guaranteedMin", - "noMinimum" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when the venue reports no slippage bound" - }, - "venue": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "quoteToken", - "venue", - "routeType", - "input", - "output", - "fee", - "executable", - "slippage", - "gas", - "inputUsd", - "outputUsd", - "estimatedTimeSeconds", - "estimatedTimeIsGuess", - "expiresAt", - "alternatives" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "alternatives": { + "description": "Every other venue that raced and produced a usable quote, best expected net output first (each carries expectedOutputAmount: a quote with slippage.noMinimum counts 0.05–1% under its outputAmount, by token type and size, the shortfall such a venue has delivered; one more than 1% above the best quote that holds a minimum is listed here but never picked as the main quote). Each has its own quoteToken to pass to ravn_execute instead, and pickable: false when RAVN would never pick it (a preview-only price while an executable one exists, or a no-minimum quote more than 1% above every quote holding a minimum), so choose among pickable ones on expectedOutputAmount; and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "estimatedTimeIsGuess": { + "description": "True when the time is RAVN's estimate, not the venue's own figure", + "type": "boolean" + }, + "estimatedTimeSeconds": { + "type": "number" + }, + "executable": { + "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", + "type": "boolean" + }, + "expectedOutputAmount": { + "description": "What RAVN counts on this route delivering, in the output token's base units: output.amount, less slippage.expectedShortfallBps when the venue holds no minimum (Rift); the same as output.amount otherwise. RAVN ranks on this (less gas), so compare routes on it, not output.amount. Alternatives carry it too", + "type": "string" + }, + "expiresAt": { + "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; up to 10 minutes past it, execute prices the same route again and builds it only if it still meets the minimum this quote showed, else (or later) fails with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", + "type": "number" + }, + "fee": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "gas": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "estimated": { + "type": "boolean" + }, + "native": { + "type": "string" + }, + "nativeSymbol": { + "type": "string" + }, + "usd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "native", + "nativeSymbol", + "usd", + "estimated" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The native gas the user must hold; null on gasless venues" + }, + "hops": { + "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "input": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "inputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" + }, + "output": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "outputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the output amount. Compare against inputUsd for price impact" + }, + "quoteToken": { + "description": "Opaque token — pass to ravn_execute", + "type": "string" + }, + "routeType": { + "type": "string" + }, + "slippage": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bps": { + "type": "number" + }, + "expectedShortfallBps": { + "description": "How far under its output RAVN counts on a no-minimum route delivering, in bps (5 for a $1k+ swap of listed, non-meme tokens up to 100 under $100); 0 when noMinimum is false. Already taken off expectedOutputAmount", + "type": "number" + }, + "guaranteedMin": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "isFirm": { + "type": "boolean" + }, + "noMinimum": { + "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", + "type": "boolean" + } + }, + "required": [ + "bps", + "isFirm", + "guaranteedMin", + "noMinimum", + "expectedShortfallBps" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when the venue reports no slippage bound" + }, + "venue": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "quoteToken", + "venue", + "routeType", + "input", + "output", + "expectedOutputAmount", + "fee", + "executable", + "slippage", + "gas", + "inputUsd", + "outputUsd", + "estimatedTimeSeconds", + "estimatedTimeIsGuess", + "expiresAt", + "alternatives" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
1 tool update
- Changed
ravn_quote1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Every other venue that raced and produced a usable quote, best expected net output first (a quote with slippage.noMinimum counts 0.3% under its outputAmount, the shortfall such a venue typically delivers; one more than 1% above the best quote that holds a minimum is listed here but never picked as the main quote). Each has its own quoteToken to pass to ravn_execute instead, and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", - "items": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "estimatedTimeIsGuess": { - "description": "True when the time is RAVN's estimate, not the venue's own figure", - "type": "boolean" - }, - "estimatedTimeSeconds": { - "type": "number" - }, - "executable": { - "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", - "type": "boolean" - }, - "expiresAt": { - "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; up to 10 minutes past it, execute prices the same route again and builds it only if it still meets the minimum this quote showed, else (or later) fails with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", - "type": "number" - }, - "fee": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "gas": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "estimated": { - "type": "boolean" - }, - "native": { - "type": "string" - }, - "nativeSymbol": { - "type": "string" - }, - "usd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "native", - "nativeSymbol", - "usd", - "estimated" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The native gas the user must hold; null on gasless venues" - }, - "hops": { - "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "id", - "name" - ], - "type": "object" - }, - "type": "array" - }, - "input": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "inputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" - }, - "output": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "outputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the output amount. Compare against inputUsd for price impact" - }, - "quoteToken": { - "description": "Opaque token — pass to ravn_execute", - "type": "string" - }, - "routeType": { - "type": "string" - }, - "slippage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bps": { - "type": "number" - }, - "guaranteedMin": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "isFirm": { - "type": "boolean" - }, - "noMinimum": { - "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", - "type": "boolean" - } - }, - "required": [ - "bps", - "isFirm", - "guaranteedMin", - "noMinimum" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when the venue reports no slippage bound" - }, - "venue": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "quoteToken", - "venue", - "routeType", - "input", - "output", - "fee", - "executable", - "slippage", - "gas", - "inputUsd", - "outputUsd", - "estimatedTimeSeconds", - "estimatedTimeIsGuess", - "expiresAt", - "alternatives" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "alternatives": { + "description": "Every other venue that raced and produced a usable quote, best expected net output first (a quote with slippage.noMinimum counts 0.05–0.5% under its outputAmount, by token type and size, the shortfall such a venue has delivered; one more than 1% above the best quote that holds a minimum is listed here but never picked as the main quote). Each has its own quoteToken to pass to ravn_execute instead, and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "estimatedTimeIsGuess": { + "description": "True when the time is RAVN's estimate, not the venue's own figure", + "type": "boolean" + }, + "estimatedTimeSeconds": { + "type": "number" + }, + "executable": { + "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", + "type": "boolean" + }, + "expiresAt": { + "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; up to 10 minutes past it, execute prices the same route again and builds it only if it still meets the minimum this quote showed, else (or later) fails with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", + "type": "number" + }, + "fee": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "gas": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "estimated": { + "type": "boolean" + }, + "native": { + "type": "string" + }, + "nativeSymbol": { + "type": "string" + }, + "usd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "native", + "nativeSymbol", + "usd", + "estimated" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The native gas the user must hold; null on gasless venues" + }, + "hops": { + "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "input": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "inputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" + }, + "output": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "outputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the output amount. Compare against inputUsd for price impact" + }, + "quoteToken": { + "description": "Opaque token — pass to ravn_execute", + "type": "string" + }, + "routeType": { + "type": "string" + }, + "slippage": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bps": { + "type": "number" + }, + "guaranteedMin": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "isFirm": { + "type": "boolean" + }, + "noMinimum": { + "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", + "type": "boolean" + } + }, + "required": [ + "bps", + "isFirm", + "guaranteedMin", + "noMinimum" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when the venue reports no slippage bound" + }, + "venue": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "quoteToken", + "venue", + "routeType", + "input", + "output", + "fee", + "executable", + "slippage", + "gas", + "inputUsd", + "outputUsd", + "estimatedTimeSeconds", + "estimatedTimeIsGuess", + "expiresAt", + "alternatives" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
1 tool update
- Changed
ravn_quote1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Every other venue that raced and produced a usable quote, best expected net output first (a quote with slippage.noMinimum counts 0.3% under its outputAmount, the shortfall such a venue typically delivers; one more than 1% above the best quote that holds a minimum is listed here but never picked as the main quote). Each has its own quoteToken to pass to ravn_execute instead, and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", - "items": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "estimatedTimeIsGuess": { - "description": "True when the time is RAVN's estimate, not the venue's own figure", - "type": "boolean" - }, - "estimatedTimeSeconds": { - "type": "number" - }, - "executable": { - "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", - "type": "boolean" - }, - "expiresAt": { - "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; past it most routes fail with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", - "type": "number" - }, - "fee": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "gas": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "estimated": { - "type": "boolean" - }, - "native": { - "type": "string" - }, - "nativeSymbol": { - "type": "string" - }, - "usd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "native", - "nativeSymbol", - "usd", - "estimated" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The native gas the user must hold; null on gasless venues" - }, - "hops": { - "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "id", - "name" - ], - "type": "object" - }, - "type": "array" - }, - "input": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "inputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" - }, - "output": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "outputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the output amount. Compare against inputUsd for price impact" - }, - "quoteToken": { - "description": "Opaque token — pass to ravn_execute", - "type": "string" - }, - "routeType": { - "type": "string" - }, - "slippage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bps": { - "type": "number" - }, - "guaranteedMin": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "isFirm": { - "type": "boolean" - }, - "noMinimum": { - "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", - "type": "boolean" - } - }, - "required": [ - "bps", - "isFirm", - "guaranteedMin", - "noMinimum" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when the venue reports no slippage bound" - }, - "venue": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "quoteToken", - "venue", - "routeType", - "input", - "output", - "fee", - "executable", - "slippage", - "gas", - "inputUsd", - "outputUsd", - "estimatedTimeSeconds", - "estimatedTimeIsGuess", - "expiresAt", - "alternatives" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "alternatives": { + "description": "Every other venue that raced and produced a usable quote, best expected net output first (a quote with slippage.noMinimum counts 0.3% under its outputAmount, the shortfall such a venue typically delivers; one more than 1% above the best quote that holds a minimum is listed here but never picked as the main quote). Each has its own quoteToken to pass to ravn_execute instead, and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "estimatedTimeIsGuess": { + "description": "True when the time is RAVN's estimate, not the venue's own figure", + "type": "boolean" + }, + "estimatedTimeSeconds": { + "type": "number" + }, + "executable": { + "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", + "type": "boolean" + }, + "expiresAt": { + "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; up to 10 minutes past it, execute prices the same route again and builds it only if it still meets the minimum this quote showed, else (or later) fails with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", + "type": "number" + }, + "fee": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "gas": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "estimated": { + "type": "boolean" + }, + "native": { + "type": "string" + }, + "nativeSymbol": { + "type": "string" + }, + "usd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "native", + "nativeSymbol", + "usd", + "estimated" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The native gas the user must hold; null on gasless venues" + }, + "hops": { + "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "input": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "inputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" + }, + "output": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "outputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the output amount. Compare against inputUsd for price impact" + }, + "quoteToken": { + "description": "Opaque token — pass to ravn_execute", + "type": "string" + }, + "routeType": { + "type": "string" + }, + "slippage": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bps": { + "type": "number" + }, + "guaranteedMin": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "isFirm": { + "type": "boolean" + }, + "noMinimum": { + "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", + "type": "boolean" + } + }, + "required": [ + "bps", + "isFirm", + "guaranteedMin", + "noMinimum" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when the venue reports no slippage bound" + }, + "venue": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "quoteToken", + "venue", + "routeType", + "input", + "output", + "fee", + "executable", + "slippage", + "gas", + "inputUsd", + "outputUsd", + "estimatedTimeSeconds", + "estimatedTimeIsGuess", + "expiresAt", + "alternatives" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
1 tool update
- Changed
ravn_quote2 fields changed- changed
Input schema / properties / excludeVenues / descriptionPrevious value: -"Drop specific venues from this race, e.g. a risk objection to one of them or ravn_health showing it degraded. Naming a venue that was never eligible for this pair is a no-op, not an error"New value: +"Drop specific venues, e.g. a risk objection to one of them or ravn_health showing it degraded. An excluded venue is used nowhere in the route, including the steps of RAVN's multi-step routes (compose, and relay quotes that carry hops); a multi-step route that needs it isn't offered. Venues that swap for you may route through other venues of their own choosing, which this can't reach: Layerswap (a Solana token often goes through Jupiter first), Relay, Rift, Across (when it swaps before or after bridging) and Mayan (Jupiter on Solana, other DEXs such as Nordstern on EVM). Naming a venue that was never eligible for this pair is a no-op, not an error" - changed
Input schema / properties / onlyVenues / descriptionPrevious value: -"Race only these venues, e.g. [\"bebop\"] for an RFQ-only race. Every other venue is left out (including ones RAVN adds later); excludeVenues still applies on top. Matched against the quote's venue id, so it picks which venue you deal with, not every venue your funds pass through: RAVN's multi-step routes (compose, and relay quotes that carry hops) run legs through the venues in hops, and venues such as Rift, Across (when it swaps before or after bridging) and Mayan (a Solana order swaps through Jupiter first) route through other venues without listing them. Same-chain venues only quote same-chain pairs; if none of the named venues can quote you get NO_LIQUIDITY"New value: +"Race only these venues, e.g. [\"bebop\"] for an RFQ-only race. Every other venue is left out (including ones RAVN adds later); excludeVenues still applies on top. It covers every venue RAVN routes your funds through: a multi-step route is offered only when its own venue id and every venue in its hops are listed, e.g. [\"compose\",\"jupiter\",\"relay\"] or [\"relay\",\"kyberswap\"]. RAVN's stablecoin route also needs 0x_swap beside its hops: it sweeps the leftover. Venues that swap for you may route through other venues of their own choosing, which this can't reach: Layerswap (a Solana token often goes through Jupiter first), Relay, Rift, Across (when it swaps before or after bridging) and Mayan (Jupiter on Solana, other DEXs such as Nordstern on EVM). Same-chain venues only quote same-chain pairs; if none of the named venues can quote you get NO_LIQUIDITY"
1 tool update
- Changed
ravn_execute1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "approval": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "approvalData": { - "additionalProperties": {}, - "description": "SIGNATURE only, 0x Gasless: a second EIP-712 payload some venues need signed for the approval itself", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "deposit": { - "additionalProperties": {}, - "description": "DEPOSIT only", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "executionType": { - "enum": [ - "DEPOSIT", - "TRANSACTION", - "SIGNATURE" - ], - "type": "string" - }, - "fee": { - "additionalProperties": {}, - "description": "When your key sets a fee on a route with none of its own: { amount, address, chainId, transaction? }, paid by the user to RAVN in the input token; deposit.amount (or the transaction) already leaves it out. On DEPOSIT (Rift, private swaps) and on EVM TRANSACTION (Eco, Layerswap, Mayan routes paying no referrer). EVM: send `transaction` exactly as given — on its own, or, for an ERC-20 fee, in the same wallet batch or relay as the swap (EIP-5792 / 7702 / 4337; one fee-bearing swap per batch). A native-coin deposit or fee is never batched: send each as a plain tx of its own from a regular wallet. Sent on its own, send the fee once the deposit or swap has confirmed: a fee paid on a swap the venue refunds stays with RAVN and nothing is owed on it. Then pass the on-chain hash of the tx that carried it (not a batch id or userOpHash) as txHash on every ravn_status poll — it counts once confirmed. Bitcoin (no `transaction`): pay `amount` sats to `address` as an extra output of the SAME transaction that pays the deposit — pass them to ravn_btc_prepare_send as feeAddress/feeAmountSats. Solana deposit (no `transaction`): add the fee to the SAME transaction that pays the deposit exactly deposit.amount — SOL: a System transfer of `amount` lamports to `address`; a token: createAssociatedTokenAccountIdempotent for `address` and the input mint (under the mint's token program), then transferChecked of `amount` to that associated token account; a fee in a transaction of its own isn't found. A Solana TRANSACTION RAVN builds has no `fee`: it's already inside transaction.serialized — send it from the signing wallet itself. Skip it and the swap still fills, but no fee is owed", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "quoteToken": { - "description": "Pass to ravn_submit_signature and ravn_status. On compose this is the post-bind token from execute, not the original quote token", - "type": "string" - }, - "sandbox": { - "const": true, - "description": "A sandbox quote's execution: a test, send nothing from it", - "type": "boolean" - }, - "statusRef": { - "description": "Poll ravn_status with this. Always set for DEPOSIT and SIGNATURE, and on a TRANSACTION whenever the venue tracks the swap by its own key (compose, Relay, Layerswap, Garden…); otherwise poll a TRANSACTION with the origin tx hash", - "type": "string" - }, - "submit": { - "additionalProperties": {}, - "description": "SIGNATURE only: { url, payload? } — POST the signed payload(s) to ravn_status's ref via /api/v1/submit-signature", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transaction": { - "additionalProperties": {}, - "description": "TRANSACTION only. On Solana (chainId -2): `serialized`, a base64 versioned transaction — have the user's wallet sign it exactly as returned and send it within a minute; never modify it, it can carry RAVN's partial signatures", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "typedData": { - "additionalProperties": {}, - "description": "SIGNATURE only", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "executionType", - "quoteToken" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "approval": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "approvalData": { + "additionalProperties": {}, + "description": "SIGNATURE only, 0x Gasless: a second EIP-712 payload some venues need signed for the approval itself", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "batch": { + "description": "Whether `calls` may go in one atomic wallet batch (EIP-5792); simulate first, and send them one by one if that fails", + "type": "boolean" + }, + "calls": { + "description": "EVM: every transaction to send, in order ({ to, data, value, chainId }: approval reset, approval, the swap or the deposit transfer, RAVN's fee). Each once the one before has succeeded (stop if one reverts), or all in one atomic wallet batch when `batch` is true", + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "deposit": { + "additionalProperties": {}, + "description": "DEPOSIT only: { address, amount, chainId?, expiresAt?, psbt?, transaction? }. psbt (Bitcoin, from a bc1q userAddress): the deposit, RAVN's fee output and change, ready to sign and broadcast. transaction (Solana deposit carrying RAVN's fee): deposit and fee in one unsigned transaction, to sign and send within a minute", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "executionType": { + "enum": [ + "DEPOSIT", + "TRANSACTION", + "SIGNATURE" + ], + "type": "string" + }, + "fee": { + "additionalProperties": {}, + "description": "When your key sets a fee on a route with none of its own: { amount, address, chainId, transaction? }, paid by the user to RAVN in the input token; deposit.amount (or the transaction) already leaves it out. On DEPOSIT (Rift, private swaps) and on EVM TRANSACTION (Eco, Layerswap, Mayan routes paying no referrer). EVM: send `transaction` exactly as given — on its own, or, for an ERC-20 fee, in the same wallet batch or relay as the swap (EIP-5792 / 7702 / 4337; one fee-bearing swap per batch). A native-coin deposit or fee is batched only where `batch` says so (beside a NEAR deposit on Ethereum, Base or Polygon); otherwise send each as a plain tx of its own from a regular wallet. Sent on its own, send the fee once the deposit or swap has confirmed: a fee paid on a swap the venue refunds stays with RAVN and nothing is owed on it. Then pass the on-chain hash of the tx that carried it (not a batch id or userOpHash) as txHash on every ravn_status poll — it counts once confirmed. Bitcoin (no `transaction`): pay `amount` sats to `address` as an extra output of the SAME transaction that pays the deposit — pass them to ravn_btc_prepare_send as feeAddress/feeAmountSats. Solana deposit (no `transaction`): add the fee to the SAME transaction that pays the deposit exactly deposit.amount — SOL: a System transfer of `amount` lamports to `address`; a token: createAssociatedTokenAccountIdempotent for `address` and the input mint (under the mint's token program), then transferChecked of `amount` to that associated token account; a fee in a transaction of its own isn't found. A Solana TRANSACTION RAVN builds has no `fee`: it's already inside transaction.serialized — send it from the signing wallet itself. Skip it and the swap still fills, but no fee is owed", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "quoteToken": { + "description": "Pass to ravn_submit_signature and ravn_status. On compose this is the post-bind token from execute, not the original quote token", + "type": "string" + }, + "sandbox": { + "const": true, + "description": "A sandbox quote's execution: a test, send nothing from it", + "type": "boolean" + }, + "statusRef": { + "description": "Poll ravn_status with this. Always set for DEPOSIT and SIGNATURE, and on a TRANSACTION whenever the venue tracks the swap by its own key (compose, Relay, Layerswap, Garden…); otherwise poll a TRANSACTION with the origin tx hash", + "type": "string" + }, + "submit": { + "additionalProperties": {}, + "description": "SIGNATURE only: { url, payload? } — POST the signed payload(s) to ravn_status's ref via /api/v1/submit-signature", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "transaction": { + "additionalProperties": {}, + "description": "TRANSACTION only. On Solana (chainId -2): `serialized`, a base64 versioned transaction — have the user's wallet sign it exactly as returned and send it within a minute; never modify it, it can carry RAVN's partial signatures", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "typedData": { + "additionalProperties": {}, + "description": "SIGNATURE only", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "executionType", + "quoteToken" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
2 tool updates
- Changed
ravn_execute1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "approval": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "approvalData": { - "additionalProperties": {}, - "description": "SIGNATURE only, 0x Gasless: a second EIP-712 payload some venues need signed for the approval itself", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "deposit": { - "additionalProperties": {}, - "description": "DEPOSIT only", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "executionType": { - "enum": [ - "DEPOSIT", - "TRANSACTION", - "SIGNATURE" - ], - "type": "string" - }, - "fee": { - "additionalProperties": {}, - "description": "When your key sets a fee on a route with none of its own: { amount, address, chainId, transaction? }, paid by the user to RAVN in the input token; deposit.amount (or the transaction) already leaves it out. On DEPOSIT (Rift, private swaps) and on EVM TRANSACTION (Eco, Layerswap, Mayan routes paying no referrer). EVM: send `transaction` exactly as given — on its own, or, for an ERC-20 fee, in the same wallet batch or relay as the swap (EIP-5792 / 7702 / 4337; one fee-bearing swap per batch). A native-coin deposit or fee is never batched: send each as a plain tx of its own from a regular wallet. Sent on its own, send the fee once the deposit or swap has confirmed: a fee paid on a swap the venue refunds stays with RAVN and nothing is owed on it. Then pass the on-chain hash of the tx that carried it (not a batch id or userOpHash) as txHash on every ravn_status poll — it counts once confirmed. Bitcoin (no `transaction`): pay `amount` sats to `address` as an extra output of the SAME transaction that pays the deposit — pass them to ravn_btc_prepare_send as feeAddress/feeAmountSats. Solana deposit (no `transaction`): add the fee to the SAME transaction that pays the deposit exactly deposit.amount — SOL: a System transfer of `amount` lamports to `address`; a token: createAssociatedTokenAccountIdempotent for `address` and the input mint (under the mint's token program), then transferChecked of `amount` to that associated token account; a fee in a transaction of its own isn't found. A Solana TRANSACTION RAVN builds has no `fee`: it's already inside transaction.serialized — send it from the signing wallet itself. Skip it and the swap still fills, but no fee is owed", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "quoteToken": { - "description": "Pass to ravn_submit_signature and ravn_status. On compose this is the post-bind token from execute, not the original quote token", - "type": "string" - }, - "statusRef": { - "description": "Poll ravn_status with this. Always set for DEPOSIT and SIGNATURE, and on a TRANSACTION whenever the venue tracks the swap by its own key (compose, Relay, Layerswap, Garden…); otherwise poll a TRANSACTION with the origin tx hash", - "type": "string" - }, - "submit": { - "additionalProperties": {}, - "description": "SIGNATURE only: { url, payload? } — POST the signed payload(s) to ravn_status's ref via /api/v1/submit-signature", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transaction": { - "additionalProperties": {}, - "description": "TRANSACTION only. On Solana (chainId -2): `serialized`, a base64 versioned transaction — have the user's wallet sign it exactly as returned and send it within a minute; never modify it, it can carry RAVN's partial signatures", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "typedData": { - "additionalProperties": {}, - "description": "SIGNATURE only", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "executionType", - "quoteToken" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "approval": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "approvalData": { + "additionalProperties": {}, + "description": "SIGNATURE only, 0x Gasless: a second EIP-712 payload some venues need signed for the approval itself", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "deposit": { + "additionalProperties": {}, + "description": "DEPOSIT only", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "executionType": { + "enum": [ + "DEPOSIT", + "TRANSACTION", + "SIGNATURE" + ], + "type": "string" + }, + "fee": { + "additionalProperties": {}, + "description": "When your key sets a fee on a route with none of its own: { amount, address, chainId, transaction? }, paid by the user to RAVN in the input token; deposit.amount (or the transaction) already leaves it out. On DEPOSIT (Rift, private swaps) and on EVM TRANSACTION (Eco, Layerswap, Mayan routes paying no referrer). EVM: send `transaction` exactly as given — on its own, or, for an ERC-20 fee, in the same wallet batch or relay as the swap (EIP-5792 / 7702 / 4337; one fee-bearing swap per batch). A native-coin deposit or fee is never batched: send each as a plain tx of its own from a regular wallet. Sent on its own, send the fee once the deposit or swap has confirmed: a fee paid on a swap the venue refunds stays with RAVN and nothing is owed on it. Then pass the on-chain hash of the tx that carried it (not a batch id or userOpHash) as txHash on every ravn_status poll — it counts once confirmed. Bitcoin (no `transaction`): pay `amount` sats to `address` as an extra output of the SAME transaction that pays the deposit — pass them to ravn_btc_prepare_send as feeAddress/feeAmountSats. Solana deposit (no `transaction`): add the fee to the SAME transaction that pays the deposit exactly deposit.amount — SOL: a System transfer of `amount` lamports to `address`; a token: createAssociatedTokenAccountIdempotent for `address` and the input mint (under the mint's token program), then transferChecked of `amount` to that associated token account; a fee in a transaction of its own isn't found. A Solana TRANSACTION RAVN builds has no `fee`: it's already inside transaction.serialized — send it from the signing wallet itself. Skip it and the swap still fills, but no fee is owed", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "quoteToken": { + "description": "Pass to ravn_submit_signature and ravn_status. On compose this is the post-bind token from execute, not the original quote token", + "type": "string" + }, + "sandbox": { + "const": true, + "description": "A sandbox quote's execution: a test, send nothing from it", + "type": "boolean" + }, + "statusRef": { + "description": "Poll ravn_status with this. Always set for DEPOSIT and SIGNATURE, and on a TRANSACTION whenever the venue tracks the swap by its own key (compose, Relay, Layerswap, Garden…); otherwise poll a TRANSACTION with the origin tx hash", + "type": "string" + }, + "submit": { + "additionalProperties": {}, + "description": "SIGNATURE only: { url, payload? } — POST the signed payload(s) to ravn_status's ref via /api/v1/submit-signature", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "transaction": { + "additionalProperties": {}, + "description": "TRANSACTION only. On Solana (chainId -2): `serialized`, a base64 versioned transaction — have the user's wallet sign it exactly as returned and send it within a minute; never modify it, it can carry RAVN's partial signatures", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "typedData": { + "additionalProperties": {}, + "description": "SIGNATURE only", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "executionType", + "quoteToken" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
- Changed
ravn_quote2 fields changed- added
Input schema / properties / timeoutMsAdded value: +{ + "description": "The race's time limit in milliseconds, counted from its start: once it has passed and some venue has priced the swap, slower venues are left out (with none priced yet, the first price ends the wait; a quote with slippage.noMinimum counts only 2000 ms past the limit). Defaults to 6000; a positive integer, clamped to 1000–15000", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "alternatives": { - "description": "Every other venue that raced and produced a usable quote, best expected net output first (a quote with slippage.noMinimum counts 0.3% under its outputAmount, the shortfall such a venue typically delivers). Each has its own quoteToken to pass to ravn_execute instead, and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", - "items": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "type": "array" - }, - "estimatedTimeIsGuess": { - "description": "True when the time is RAVN's estimate, not the venue's own figure", - "type": "boolean" - }, - "estimatedTimeSeconds": { - "type": "number" - }, - "executable": { - "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", - "type": "boolean" - }, - "expiresAt": { - "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; past it most routes fail with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", - "type": "number" - }, - "fee": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "gas": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "estimated": { - "type": "boolean" - }, - "native": { - "type": "string" - }, - "nativeSymbol": { - "type": "string" - }, - "usd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "native", - "nativeSymbol", - "usd", - "estimated" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The native gas the user must hold; null on gasless venues" - }, - "hops": { - "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", - "items": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "id", - "name" - ], - "type": "object" - }, - "type": "array" - }, - "input": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "inputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" - }, - "output": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "outputUsd": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "USD value of the output amount. Compare against inputUsd for price impact" - }, - "quoteToken": { - "description": "Opaque token — pass to ravn_execute", - "type": "string" - }, - "routeType": { - "type": "string" - }, - "slippage": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bps": { - "type": "number" - }, - "guaranteedMin": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "isFirm": { - "type": "boolean" - }, - "noMinimum": { - "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", - "type": "boolean" - } - }, - "required": [ - "bps", - "isFirm", - "guaranteedMin", - "noMinimum" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when the venue reports no slippage bound" - }, - "venue": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "quoteToken", - "venue", - "routeType", - "input", - "output", - "fee", - "executable", - "slippage", - "gas", - "inputUsd", - "outputUsd", - "estimatedTimeSeconds", - "estimatedTimeIsGuess", - "expiresAt", - "alternatives" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "alternatives": { + "description": "Every other venue that raced and produced a usable quote, best expected net output first (a quote with slippage.noMinimum counts 0.3% under its outputAmount, the shortfall such a venue typically delivers; one more than 1% above the best quote that holds a minimum is listed here but never picked as the main quote). Each has its own quoteToken to pass to ravn_execute instead, and its own expiresAt (same meaning as above; venues differ, so check it). Empty when no other venue could serve this pair, or when a route was excluded via excludeVenues", + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "estimatedTimeIsGuess": { + "description": "True when the time is RAVN's estimate, not the venue's own figure", + "type": "boolean" + }, + "estimatedTimeSeconds": { + "type": "number" + }, + "executable": { + "description": "False = preview-only price, priced against a placeholder destination/refund address. ravn_execute will fail with QUOTE_NOT_EXECUTABLE — request a fresh quote with destinationAddress/refundAddress supplied instead", + "type": "boolean" + }, + "expiresAt": { + "description": "Epoch ms, always a real time: call ravn_execute before this, re-quote after. Never refused for age before it; past it most routes fail with QUOTE_EXPIRED (already 5 s ahead of the venue's own deadline). Two-hop routes (venue.id compose) and venues with no deadline get 60 s: compose re-prices at execute and refuses only if the minimum shown can no longer be met", + "type": "number" + }, + "fee": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "gas": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "estimated": { + "type": "boolean" + }, + "native": { + "type": "string" + }, + "nativeSymbol": { + "type": "string" + }, + "usd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "native", + "nativeSymbol", + "usd", + "estimated" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The native gas the user must hold; null on gasless venues" + }, + "hops": { + "description": "RAVN routes (venue.name \"RAVN\": two-hop, or Relay with a DEX on arrival): the venues it runs through, in order. Sign hop 1; hop 2 is a unique deposit", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "input": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "inputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the input amount, same price source as gas.usd. Null when the token can't be priced" + }, + "output": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "outputUsd": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "USD value of the output amount. Compare against inputUsd for price impact" + }, + "quoteToken": { + "description": "Opaque token — pass to ravn_execute", + "type": "string" + }, + "routeType": { + "type": "string" + }, + "slippage": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bps": { + "type": "number" + }, + "guaranteedMin": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "isFirm": { + "type": "boolean" + }, + "noMinimum": { + "description": "True when the venue enforces no minimum output (Rift fills at its own rate once the deposit lands); bps is then not a protection", + "type": "boolean" + } + }, + "required": [ + "bps", + "isFirm", + "guaranteedMin", + "noMinimum" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when the venue reports no slippage bound" + }, + "venue": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "quoteToken", + "venue", + "routeType", + "input", + "output", + "fee", + "executable", + "slippage", + "gas", + "inputUsd", + "outputUsd", + "estimatedTimeSeconds", + "estimatedTimeIsGuess", + "expiresAt", + "alternatives" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
1 tool update
- Changed
ravn_status1 field changed- changed
Input schema / properties / txHash / descriptionPrevious value: -"The transaction that paid a fee the swap carries, where RAVN can't find it otherwise: a two-hop route's hop-1 tx, or the on-chain transaction that carried an execution's fee.transaction (Rift and private swaps on DEPOSIT; Eco, Layerswap and Mayan routes paying no referrer on TRANSACTION) — on its own, or the batch or relay that included it (not an EIP-5792 batch id or a 4337 userOpHash). Not needed on an Eco or Mayan TRANSACTION with no statusRef when the fee rode in the swap's own transaction and you poll with that hash. Send it on every poll once confirmed; without it nothing is owed on that swap"New value: +"The transaction that paid a fee the swap carries, where RAVN can't find it otherwise: a two-hop route's hop-1 tx, or the on-chain transaction that carried an execution's fee.transaction (Rift and private swaps on DEPOSIT; Eco, Layerswap and Mayan routes paying no referrer on TRANSACTION) — on its own, or the batch or relay that included it (not an EIP-5792 batch id or a 4337 userOpHash). Not needed on an Eco or Mayan TRANSACTION with no statusRef when the fee rode in the swap's own transaction and you poll with that hash. Send it on every poll once confirmed; until RAVN can read it, a delivered swap reports 'processing' (up to 15 minutes after execute). Without it nothing is owed on that swap"
1 tool update
- Changed
ravn_quote1 field changed- added
Input schema / properties / onlyVenuesAdded value: +{ + "description": "Race only these venues, e.g. [\"bebop\"] for an RFQ-only race. Every other venue is left out (including ones RAVN adds later); excludeVenues still applies on top. Matched against the quote's venue id, so it picks which venue you deal with, not every venue your funds pass through: RAVN's multi-step routes (compose, and relay quotes that carry hops) run legs through the venues in hops, and venues such as Rift, Across (when it swaps before or after bridging) and Mayan (a Solana order swaps through Jupiter first) route through other venues without listing them. Same-chain venues only quote same-chain pairs; if none of the named venues can quote you get NO_LIQUIDITY", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" +}
2 tool updates
- Changed
ravn_btc_coverage1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "chainId": { - "description": "Echoes the requested chain", - "type": "number" - }, - "coverage": { - "additionalProperties": { - "type": "number" - }, - "description": "Lowercased token address to the number of BTC venues (1-3) that route to it from native Bitcoin. Tokens no venue serves are omitted, not listed at 0", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "filtered": { - "description": "False means the upstream venue lists couldn't be reached right now — coverage is empty and the answer is unknown, not 'nothing routes'. Treat like an outage: don't filter your token list on it", - "type": "boolean" - } - }, - "required": [ - "chainId", - "filtered", - "coverage" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "chainId": { + "description": "Echoes the requested chain", + "type": "number" + }, + "coverage": { + "additionalProperties": { + "type": "number" + }, + "description": "Token address (lowercase on EVM; a Solana mint exactly as listed, since base58 is case-sensitive) to the number of BTC venues (1-3) that route to it from native Bitcoin. Tokens no venue serves are omitted, not listed at 0", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "filtered": { + "description": "False means the upstream venue lists couldn't be reached right now — coverage is empty and the answer is unknown, not 'nothing routes'. Treat like an outage: don't filter your token list on it", + "type": "boolean" + } + }, + "required": [ + "chainId", + "filtered", + "coverage" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
- Changed
ravn_quote1 field changed- changed
Input schema / properties / refundAddress / descriptionPrevious value: -"Where to refund the input asset if the swap fails. Selling native Bitcoin with userAddress set to a Bitcoin address and no refundAddress refunds to userAddress. Otherwise it is required here, at quote time, for a Bitcoin-source Relay or THORChain quote — neither has an execute-time re-bind, so omitting it returns a priced-but-unexecutable preview and supplying it later on ravn_execute is refused. Other BTC-source venues (Garden, Chainflip, Rift, NEAR Intents) support binding this at execute time instead. Validated against the INPUT chain (refunds are paid back on the origin), with the same non-wallet-address check as destinationAddress"New value: +"Where to refund the input asset if the swap fails. Selling native Bitcoin with userAddress set to a Bitcoin address and no refundAddress refunds to userAddress. Well-known sample addresses (e.g. bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh) count as no address: supply the real refund. Otherwise it is required here, at quote time, for a Bitcoin-source Relay or THORChain quote — neither has an execute-time re-bind, so omitting it returns a priced-but-unexecutable preview and supplying it later on ravn_execute is refused. Other BTC-source venues (Garden, Chainflip, Rift, NEAR Intents) support binding this at execute time instead. Validated against the INPUT chain (refunds are paid back on the origin), with the same non-wallet-address check as destinationAddress"
2 tool updates
- Changed
ravn_execute1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "approval": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "approvalData": { - "additionalProperties": {}, - "description": "SIGNATURE only, 0x Gasless: a second EIP-712 payload some venues need signed for the approval itself", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "deposit": { - "additionalProperties": {}, - "description": "DEPOSIT only", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "executionType": { - "enum": [ - "DEPOSIT", - "TRANSACTION", - "SIGNATURE" - ], - "type": "string" - }, - "fee": { - "additionalProperties": {}, - "description": "DEPOSIT only, when your key sets a fee on a venue with none of its own: { amount, address, chainId, transaction? }, paid by the user to RAVN. Bitcoin (no `transaction`): pay `amount` sats to `address` as an extra output of the SAME transaction that pays the deposit — pass them to ravn_btc_prepare_send as feeAddress/feeAmountSats. EVM: send `transaction` exactly as given, as its own tx from the user's regular wallet (bundled into a smart-wallet batch it can't be proven), then pass its hash as txHash on EVERY ravn_status poll — it only counts once confirmed. Skip it and the swap still fills, but no fee is owed", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "quoteToken": { - "description": "Pass to ravn_submit_signature and ravn_status. On compose this is the post-bind token from execute, not the original quote token", - "type": "string" - }, - "statusRef": { - "description": "Poll ravn_status with this. Always set for DEPOSIT and compose; TRANSACTION otherwise uses the origin tx hash", - "type": "string" - }, - "submit": { - "additionalProperties": {}, - "description": "SIGNATURE only: { url, payload? } — POST the signed payload(s) to ravn_status's ref via /api/v1/submit-signature", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transaction": { - "additionalProperties": {}, - "description": "TRANSACTION only. On Solana (chainId -2): `serialized`, a base64 versioned transaction — have the user's wallet sign it exactly as returned and send it within a minute; never modify it, it can carry RAVN's partial signatures", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "typedData": { - "additionalProperties": {}, - "description": "SIGNATURE only", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "executionType", - "quoteToken" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "approval": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "approvalData": { + "additionalProperties": {}, + "description": "SIGNATURE only, 0x Gasless: a second EIP-712 payload some venues need signed for the approval itself", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "deposit": { + "additionalProperties": {}, + "description": "DEPOSIT only", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "executionType": { + "enum": [ + "DEPOSIT", + "TRANSACTION", + "SIGNATURE" + ], + "type": "string" + }, + "fee": { + "additionalProperties": {}, + "description": "When your key sets a fee on a route with none of its own: { amount, address, chainId, transaction? }, paid by the user to RAVN in the input token; deposit.amount (or the transaction) already leaves it out. On DEPOSIT (Rift, private swaps) and on EVM TRANSACTION (Eco, Layerswap, Mayan routes paying no referrer). EVM: send `transaction` exactly as given — on its own, or, for an ERC-20 fee, in the same wallet batch or relay as the swap (EIP-5792 / 7702 / 4337; one fee-bearing swap per batch). A native-coin deposit or fee is never batched: send each as a plain tx of its own from a regular wallet. Sent on its own, send the fee once the deposit or swap has confirmed: a fee paid on a swap the venue refunds stays with RAVN and nothing is owed on it. Then pass the on-chain hash of the tx that carried it (not a batch id or userOpHash) as txHash on every ravn_status poll — it counts once confirmed. Bitcoin (no `transaction`): pay `amount` sats to `address` as an extra output of the SAME transaction that pays the deposit — pass them to ravn_btc_prepare_send as feeAddress/feeAmountSats. Solana deposit (no `transaction`): add the fee to the SAME transaction that pays the deposit exactly deposit.amount — SOL: a System transfer of `amount` lamports to `address`; a token: createAssociatedTokenAccountIdempotent for `address` and the input mint (under the mint's token program), then transferChecked of `amount` to that associated token account; a fee in a transaction of its own isn't found. A Solana TRANSACTION RAVN builds has no `fee`: it's already inside transaction.serialized — send it from the signing wallet itself. Skip it and the swap still fills, but no fee is owed", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "quoteToken": { + "description": "Pass to ravn_submit_signature and ravn_status. On compose this is the post-bind token from execute, not the original quote token", + "type": "string" + }, + "statusRef": { + "description": "Poll ravn_status with this. Always set for DEPOSIT and SIGNATURE, and on a TRANSACTION whenever the venue tracks the swap by its own key (compose, Relay, Layerswap, Garden…); otherwise poll a TRANSACTION with the origin tx hash", + "type": "string" + }, + "submit": { + "additionalProperties": {}, + "description": "SIGNATURE only: { url, payload? } — POST the signed payload(s) to ravn_status's ref via /api/v1/submit-signature", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "transaction": { + "additionalProperties": {}, + "description": "TRANSACTION only. On Solana (chainId -2): `serialized`, a base64 versioned transaction — have the user's wallet sign it exactly as returned and send it within a minute; never modify it, it can carry RAVN's partial signatures", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "typedData": { + "additionalProperties": {}, + "description": "SIGNATURE only", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "executionType", + "quoteToken" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
- Changed
ravn_status1 field changed- changed
Input schema / properties / txHash / descriptionPrevious value: -"The transaction that paid a fee the swap carries: a two-hop route's hop-1 tx, or the fee payment a DEPOSIT's fee.transaction asked for (Rift, private swaps). Without it nothing is owed on that swap"New value: +"The transaction that paid a fee the swap carries, where RAVN can't find it otherwise: a two-hop route's hop-1 tx, or the on-chain transaction that carried an execution's fee.transaction (Rift and private swaps on DEPOSIT; Eco, Layerswap and Mayan routes paying no referrer on TRANSACTION) — on its own, or the batch or relay that included it (not an EIP-5792 batch id or a 4337 userOpHash). Not needed on an Eco or Mayan TRANSACTION with no statusRef when the fee rode in the swap's own transaction and you poll with that hash. Send it on every poll once confirmed; without it nothing is owed on that swap"
3 tool updates
- Changed
ravn_btc_prepare_send4 fields changed- changed
Input schema / properties / amountSats / descriptionPrevious value: -"depositAmount from ravn_execute, in satoshis"New value: +"deposit.amount from the ravn_execute DEPOSIT result, in satoshis" - added
Input schema / properties / feeAddressAdded value: +{ + "description": "fee.address from the ravn_execute DEPOSIT result — REQUIRED whenever that result has a `fee`. RAVN's fee is paid as an extra output of this same transaction; leave it out and the fee is never paid", + "type": "string" +} - added
Input schema / properties / feeAmountSatsAdded value: +{ + "description": "fee.amount from the ravn_execute DEPOSIT result, in satoshis — pass together with feeAddress", + "type": "string" +} - changed
Input schema / properties / toAddress / descriptionPrevious value: -"depositAddress from ravn_execute"New value: +"deposit.address from the ravn_execute DEPOSIT result"
- Changed
ravn_execute1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "approval": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "approvalData": { - "additionalProperties": {}, - "description": "SIGNATURE only, 0x Gasless: a second EIP-712 payload some venues need signed for the approval itself", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "deposit": { - "additionalProperties": {}, - "description": "DEPOSIT only", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "executionType": { - "enum": [ - "DEPOSIT", - "TRANSACTION", - "SIGNATURE" - ], - "type": "string" - }, - "quoteToken": { - "description": "Pass to ravn_submit_signature and ravn_status. On compose this is the post-bind token from execute, not the original quote token", - "type": "string" - }, - "statusRef": { - "description": "Poll ravn_status with this. Always set for DEPOSIT and compose; TRANSACTION otherwise uses the origin tx hash", - "type": "string" - }, - "submit": { - "additionalProperties": {}, - "description": "SIGNATURE only: { url, payload? } — POST the signed payload(s) to ravn_status's ref via /api/v1/submit-signature", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "transaction": { - "additionalProperties": {}, - "description": "TRANSACTION only. On Solana (chainId -2): `serialized`, a base64 versioned transaction — have the user's wallet sign it exactly as returned and send it within a minute; never modify it, it can carry RAVN's partial signatures", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "typedData": { - "additionalProperties": {}, - "description": "SIGNATURE only", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "executionType", - "quoteToken" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "data", - "meta" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "details": {}, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "meta": { - "additionalProperties": false, - "properties": { - "requestId": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "requestId", - "version" - ], - "type": "object" - } - }, - "required": [ - "error", - "meta" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "approval": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "approvalData": { + "additionalProperties": {}, + "description": "SIGNATURE only, 0x Gasless: a second EIP-712 payload some venues need signed for the approval itself", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "deposit": { + "additionalProperties": {}, + "description": "DEPOSIT only", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "executionType": { + "enum": [ + "DEPOSIT", + "TRANSACTION", + "SIGNATURE" + ], + "type": "string" + }, + "fee": { + "additionalProperties": {}, + "description": "DEPOSIT only, when your key sets a fee on a venue with none of its own: { amount, address, chainId, transaction? }, paid by the user to RAVN. Bitcoin (no `transaction`): pay `amount` sats to `address` as an extra output of the SAME transaction that pays the deposit — pass them to ravn_btc_prepare_send as feeAddress/feeAmountSats. EVM: send `transaction` exactly as given, as its own tx from the user's regular wallet (bundled into a smart-wallet batch it can't be proven), then pass its hash as txHash on EVERY ravn_status poll — it only counts once confirmed. Skip it and the swap still fills, but no fee is owed", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "quoteToken": { + "description": "Pass to ravn_submit_signature and ravn_status. On compose this is the post-bind token from execute, not the original quote token", + "type": "string" + }, + "statusRef": { + "description": "Poll ravn_status with this. Always set for DEPOSIT and compose; TRANSACTION otherwise uses the origin tx hash", + "type": "string" + }, + "submit": { + "additionalProperties": {}, + "description": "SIGNATURE only: { url, payload? } — POST the signed payload(s) to ravn_status's ref via /api/v1/submit-signature", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "transaction": { + "additionalProperties": {}, + "description": "TRANSACTION only. On Solana (chainId -2): `serialized`, a base64 versioned transaction — have the user's wallet sign it exactly as returned and send it within a minute; never modify it, it can carry RAVN's partial signatures", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "typedData": { + "additionalProperties": {}, + "description": "SIGNATURE only", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "executionType", + "quoteToken" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "details": {}, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "meta": { + "additionalProperties": false, + "properties": { + "requestId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "requestId", + "version" + ], + "type": "object" + } + }, + "required": [ + "error", + "meta" + ], + "type": "object" + } +]
- Changed
ravn_status1 field changed- changed
Input schema / properties / txHash / descriptionPrevious value: -"The transaction that paid a fee the swap carries: a two-hop route's hop-1 tx, or the fee payment a Rift DEPOSIT's fee.transaction asked for. Without it nothing is owed on that swap"New value: +"The transaction that paid a fee the swap carries: a two-hop route's hop-1 tx, or the fee payment a DEPOSIT's fee.transaction asked for (Rift, private swaps). Without it nothing is owed on that swap"
1 tool update
- Changed
ravn_status1 field changed- added
Input schema / properties / txHashAdded value: +{ + "description": "The transaction that paid a fee the swap carries: a two-hop route's hop-1 tx, or the fee payment a Rift DEPOSIT's fee.transaction asked for. Without it nothing is owed on that swap", + "pattern": "^0x[0-9a-fA-F]{64}$", + "type": "string" +}
2 tool updates
- Changed
ravn_execute1 field changed- changed
Input schema / properties / refundAddress / descriptionPrevious value: -"Late-bound refund recipient if the swap fails, honoured by the same venues as destinationAddress. Every other venue fixes the refund address when it prices, and a DIFFERENT one here is rejected rather than silently ignored; supply refundAddress on ravn_quote instead"New value: +"Late-bound refund recipient if the swap fails, honoured by venues that read one at execution time (Chainflip, Garden, NEAR Intents, Rift). Every other venue, Mayan, Layerswap and RAVN two-hop routes included, fixes the refund address when it prices: one that differs from the refund the quote was priced with is rejected rather than silently ignored. A quote priced without one refunds where it was priced (normally userAddress) at these venues, so a refundAddress here other than userAddress is rejected too, when userAddress is a valid address on the input chain (selling native Bitcoin with no quoted refund, a venue that can execute uses this one). Supply refundAddress on ravn_quote instead"
- Changed
ravn_quote3 fields changed- added
Input schema / properties / allowNoMinimumAdded value: +{ + "description": "Let venues that enforce no minimum (today Rift) race even though slippageBps is set. Their quotes carry slippage.noMinimum true and fill at the venue's own rate: slippageBps does not protect them", + "type": "boolean" +} - changed
Input schema / properties / refundAddress / descriptionPrevious value: -"Where to refund the input asset if the swap fails. Selling native Bitcoin with userAddress set to a Bitcoin address and no refundAddress refunds to userAddress. Otherwise it is required here, at quote time, for a Bitcoin-source Relay or THORChain quote — neither has an execute-time re-bind, so omitting it returns a priced-but-unexecutable preview and supplying it later on ravn_execute is refused. Other BTC-source venues (Garden, Chainflip, Rift) support binding this at execute time instead. Validated against the INPUT chain (refunds are paid back on the origin), with the same non-wallet-address check as destinationAddress"New value: +"Where to refund the input asset if the swap fails. Selling native Bitcoin with userAddress set to a Bitcoin address and no refundAddress refunds to userAddress. Otherwise it is required here, at quote time, for a Bitcoin-source Relay or THORChain quote — neither has an execute-time re-bind, so omitting it returns a priced-but-unexecutable preview and supplying it later on ravn_execute is refused. Other BTC-source venues (Garden, Chainflip, Rift, NEAR Intents) support binding this at execute time instead. Validated against the INPUT chain (refunds are paid back on the origin), with the same non-wallet-address check as destinationAddress" - changed
Input schema / properties / slippageBps / descriptionPrevious value: -"Max acceptable slippage in basis points"New value: +"Max acceptable slippage in basis points. Setting it drops venues that enforce no minimum (today Rift) from the race unless allowNoMinimum is true"
Related MCP Connectors
Token swaps at the best net price on 9 EVM chains and Solana. No API key, non-custodial.
No-account cross-chain crypto swaps (BTC, ETH, SOL, USDT, ZEC…) for AI agents. Flat 0.5% fee.
Quote, create and track cross-chain crypto swaps. Non-custodial exchange, no account, no KYC.
Best-price cross-chain swap quotes across 70 chains (EVM + Solana). Holds no keys, never signs.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables cross-chain swap execution across 12 venues and 17 chains, including native Bitcoin as source or destination, with tools for quoting, execution, status, and health checks. No signup, API key, or protocol fee required.5MIT
- AlicenseAqualityAmaintenanceReal-time non-custodial crypto swap rates, fees, and on-chain routing across 240+ multi-chain pairs.142MIT
- AlicenseNot gradedqualityCmaintenanceCross-chain cryptocurrency swaps via Chainflip. Get quotes, execute swaps, and track progress. No API key required to get started.10MIT
- AlicenseNot gradedqualityDmaintenanceFree DEX aggregator API that returns executable swap calldata across 46 EVM chains. No API key required. Single GET request returns ready-to-sign transactions for any token pair.22MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.