Skip to content

Commit 6659f06

Browse files
authored
Add Execution Errors doc for fill and refund failure reasons (#352)
* Add Execution Errors doc for fill and refund failure reasons Documents failReason (57 codes) and refundFailReason (4 codes) as the fill/refund counterpart to the existing quote-errors page. Wired into Core Concepts nav and cross-linked from Handling Quote Errors. * Address review: remove legacy DEPOSIT_ADDRESS_MISMATCH, fix onchain terminology * Add 9 fill failure codes from v3 response schema * Reconcile duplicate error descriptions per review
1 parent 1a1350a commit 6659f06

3 files changed

Lines changed: 136 additions & 0 deletions

File tree

‎docs.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
"references/api/api_core_concepts/trade-types",
9494
"references/api/api_core_concepts/surplus-and-shortage",
9595
"references/api/api_core_concepts/handling-errors",
96+
"references/api/api_core_concepts/execution-errors",
9697
"references/api/api_core_concepts/contract-compatibility"
9798
]
9899
},
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
---
2+
title: "Handling Execution Errors"
3+
description: "Interpret fill and refund failure reasons returned after a request has been submitted"
4+
---
5+
6+
Once a request is submitted, execution can still fail during the fill or, if a fill isn't possible, during the refund. These failures are surfaced as `failReason` (fill) and `refundFailReason` (refund) on the request object, distinct from the [quote errors](/references/api/api_core_concepts/handling-errors) returned before a request is ever submitted. This guide outlines the possible fill and refund failure reasons and what each one means.
7+
8+
## Fill Errors
9+
10+
`failReason` explains why a fill did not complete after a request was submitted.
11+
12+
### Deposit & Validation Errors
13+
14+
| Error Code | Description |
15+
| ---------- | ------------ |
16+
| `DEPOSIT_CHAIN_MISMATCH` | For strict deposit addresses, the deposit landed on a different chain than the one the address was registered for. |
17+
| `INCORRECT_DEPOSIT_CURRENCY` | For strict deposit addresses, the token received doesn't match the currency quoted for this request. |
18+
| `DOUBLE_SPEND` | A second deposit was detected at an address whose first deposit was already processed. |
19+
| `DEPOSITED_AMOUNT_TOO_LOW_TO_FILL` | The amount deposited is less than the quoted amount needed to complete the swap. |
20+
| `ORIGIN_CURRENCY_MISMATCH` | The currency detected on origin doesn't match the origin currency specified in the request. |
21+
| `TTL_EXPIRED` | The request's time-to-live window passed before it could be filled. |
22+
| `DEPOSIT_CONFIRMATION_TIMEOUT` | The deposit transaction wasn't confirmed within the expected window, so the request timed out and was routed to a refund. |
23+
| `DEPOSIT_REORGED` | The deposit transaction was removed from the canonical chain by a block reorganization, so the request was failed. |
24+
| `ORPHANED_DEPOSIT_REFUND` | A deposit at a deposit address couldn't be matched to a fillable request, so the funds were refunded to the depositor. |
25+
| `BLOCKED_WALLET` | An address associated with the request was flagged by wallet screening at fill time, so the fill was blocked. Funds are not automatically refunded and are subject to compliance review. |
26+
27+
### Solver Capacity & Balance Errors
28+
29+
| Error Code | Description |
30+
| ---------- | ------------ |
31+
| `SOLVER_CAPACITY_EXCEEDED` | The solver's available capacity for this route has been exceeded. |
32+
| `SOLVER_BALANCE_TOO_LOW` | The solver doesn't have enough native tokens or balance to construct the fill transaction. |
33+
| `SPONSOR_BALANCE_TOO_LOW` | The sponsor covering transaction fees doesn't have sufficient balance. |
34+
| `INSUFFICIENT_FUNDS_FOR_RENT` | The user's balance isn't enough to cover rent/storage fees (Solana). |
35+
| `NEGATIVE_NEW_AMOUNT_AFTER_FEES` | After deducting fees, the resulting amount is zero or negative. |
36+
| `AMOUNT_TOO_LOW_TO_REFUND` | The amount to refund is zero or negative, or below the chain's minimum transfer threshold, so no refund could be issued. |
37+
| `GASLESS_PERMIT_BALANCE_TOO_LOW` | The balance available from a gasless permit wasn't enough to complete the request, so the funds were refunded. |
38+
39+
### Swap Routing & Pricing Errors
40+
41+
| Error Code | Description |
42+
| ---------- | ------------ |
43+
| `NO_QUOTES` | No liquidity providers returned a valid quote for this swap at fill time. |
44+
| `NO_INTERNAL_SWAP_ROUTES_FOUND` | No internal DEX route was found between the specified currencies on this chain. |
45+
| `SWAP_IMPACT_TOO_HIGH` | The swap's price impact at fill time exceeds the acceptable threshold. |
46+
| `INSUFFICIENT_POOL_LIQUIDITY` | The DEX pool doesn't have enough reserves to complete the swap at any price. |
47+
| `SLIPPAGE` | The swap couldn't complete within the given slippage tolerance. |
48+
| `TOO_LITTLE_RECEIVED` | The onchain swap executed, but the output amount was below the guaranteed minimum. |
49+
| `GENERATE_SWAP_FAILED` | Generating the swap transaction (routing, calldata) failed before execution. |
50+
| `REVERSE_SWAP_FAILED` | The reversal swap used to return funds to the user for a refund failed to execute or quote. |
51+
52+
### Transaction Construction & Gas Errors
53+
54+
| Error Code | Description |
55+
| ---------- | ------------ |
56+
| `TRANSACTION_TOO_LARGE` | The serialized transaction exceeds the maximum payload size for the origin chain or RPC. |
57+
| `SWAP_USES_TOO_MUCH_GAS` | The swap transaction would consume more gas than a single block allows. |
58+
| `NEW_CALLDATA_INCLUDES_HIGHER_RENT_FEE` | A refreshed permit increased the rent/storage fee beyond the acceptable limit (Solana). |
59+
| `INVALID_GAS_PRICE` | The submitted gas price is outside acceptable bounds. |
60+
| `QUOTED_GAS_LIMIT_EXCEEDED` | The gas limit required at fill time was significantly higher than the gas limit quoted, so the fill was aborted. |
61+
| `JUPITER_INVALID_TOKEN_ACCOUNT` | The token account required for the swap doesn't exist or is invalid (Solana/Jupiter). |
62+
63+
### Onchain Execution & Revert Errors
64+
65+
| Error Code | Description |
66+
| ---------- | ------------ |
67+
| `EXECUTION_REVERTED` | The swap contract call reverted during execution. |
68+
| `TRANSACTION_REVERTED` | The transaction reverted at the blockchain level. |
69+
| `MISSING_REVERT_DATA` | The transaction reverted, but the reason couldn't be decoded from the returned data. |
70+
| `CONTRACT_PAUSED` | The target contract is currently paused and not accepting calls. |
71+
| `TOKEN_NOT_TRANSFERABLE` | The token enforces a non-transferable restriction (for example, a soulbound token). |
72+
| `TRANSFER_FAILED` | A token transfer reverted at the contract level. |
73+
| `TRANSFER_FROM_FAILED` | Transferring tokens from the user to the contract failed (for example, insufficient allowance). |
74+
| `TRANSFER_AMOUNT_EXCEEDS_ALLOWANCE` | The approved allowance is less than the amount being transferred. |
75+
| `TRANSFER_AMOUNT_EXCEEDS_BALANCE` | The sender's token balance is less than the amount being transferred. |
76+
| `INSUFFICIENT_NATIVE_TOKENS_SUPPLIED` | The native token value supplied with the transaction is less than required. |
77+
| `INCORRECT_PAYMENT` | The value or amount sent doesn't match what the swap requires. |
78+
| `ZERO_SELL_AMOUNT` | The swap was attempted with a zero input amount. |
79+
| `INVALID_SENDER` | The address executing the swap isn't authorized to do so. |
80+
| `INVALID_SIGNER` | The signer on the order doesn't match the address expected by the contract. |
81+
| `DESTINATION_TOKEN_TRANSFER_REJECTED` | A token transfer reverted during the destination-side swap — typically the token itself rejecting the transfer (transfer tax, max wallet/transaction limits, or a blacklist). |
82+
83+
### Order & Signature Errors
84+
85+
| Error Code | Description |
86+
| ---------- | ------------ |
87+
| `ORDER_EXPIRED` | The order's expiration timestamp passed before it could be executed. |
88+
| `ORDER_IS_CANCELLED` | The order was cancelled onchain before it could be filled. |
89+
| `ORDER_ALREADY_FILLED` | The order was already fully executed and can't be filled again. |
90+
| `SIGNATURE_EXPIRED` | The signature used for token approval expired before execution. |
91+
| `INVALID_SIGNATURE` | The provided signature is invalid or doesn't match the expected signer. |
92+
| `INVALID_NONCE` | The nonce provided has already been used or isn't valid for this signer. |
93+
| `SEAPORT_INEXACT_FRACTION` | The Seaport order specifies a fractional amount that can't be fulfilled exactly. |
94+
| `SEAPORT_INVALID_FULFILLER` | The caller isn't an authorized fulfiller for this Seaport order. |
95+
| `PROTOCOL_DEADLINE_EXPIRED` | The protocol order's deadline expired before the fill could complete, so a no-fill-or-refund was submitted onchain. |
96+
97+
### Account Abstraction Errors
98+
99+
| Error Code | Description |
100+
| ---------- | ------------ |
101+
| `ACCOUNT_ABSTRACTION_INVALID_NONCE` | The nonce in the account abstraction user operation is invalid or stale. |
102+
| `ACCOUNT_ABSTRACTION_SIGNATURE_ERROR` | The account abstraction user operation's signature is invalid. |
103+
| `ACCOUNT_ABSTRACTION_GAS_LIMIT` | The gas required for account abstraction verification exceeds the allowed limit. |
104+
105+
### NFT Minting Errors
106+
107+
| Error Code | Description |
108+
| ---------- | ------------ |
109+
| `MINT_NOT_ACTIVE` | The NFT mint phase isn't currently active. |
110+
| `ERC_1155_TOO_MANY_REQUESTED` | The quantity requested exceeds the contract's allowed batch size. |
111+
| `MINT_QUANTITY_EXCEEDS_MAX_PER_WALLET` | The wallet has already minted the maximum quantity allowed. |
112+
| `MINT_QUANTITY_EXCEEDS_MAX_SUPPLY` | The requested quantity would exceed the collection's maximum supply. |
113+
114+
### Other
115+
116+
| Error Code | Description |
117+
| ---------- | ------------ |
118+
| `FLUID_DEX_ERROR` | The Fluid DEX protocol returned an error during the swap. |
119+
| `MANUAL_ADMIN_REFUND` | The request was manually refunded by the Relay team via an admin action. |
120+
| `UNKNOWN` | The fill failed for a reason that didn't match a known error pattern. |
121+
| `N/A` | The fill completed without failure. |
122+
123+
## Refund Errors
124+
125+
`refundFailReason` explains why a refund could not be completed after a fill failed. This field defaults to `N/A` when no refund failure has occurred.
126+
127+
| Error Code | Description |
128+
| ---------- | ------------ |
129+
| `AMOUNT_TOO_LOW_TO_REFUND` | The amount to refund is zero or negative, or below the chain's minimum transfer threshold, so no refund could be issued. |
130+
| `NEGATIVE_NEW_AMOUNT_AFTER_FEES` | After deducting fees, the resulting amount is zero or negative. |
131+
| `SWAP_CURRENCY_NOT_ON_ORIGIN` | The swap's output currency isn't available to bridge back to the origin chain, so the refund can't be issued in the original currency. |
132+
| `REFUND_RECIPIENT_IS_VASP` | The refund recipient was identified as a Virtual Asset Service Provider (VASP), which requires manual review before the refund can be issued. |
133+
| `N/A` | No refund failure has occurred. |

‎references/api/api_core_concepts/handling-errors.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ description: "Interpret and recover from quote errors in your integration"
55

66
When calling the `/quote/v2` endpoint, various errors may be returned depending on request conditions, user input, or internal routing logic. This guide outlines the possible error codes, their meanings, and how to handle them.
77

8+
<Tip>Looking for errors that occur after a request is submitted? See [Handling Execution Errors](/references/api/api_core_concepts/execution-errors) for fill and refund failure reasons.</Tip>
9+
810
## Expected Errors
911

1012
These are known validation and routing issues that developers should gracefully handle in their integrations:

0 commit comments

Comments
 (0)