# Errors and recovery

## Curve launches

The standard Pair Router uses `CurvePairCheck(uint8 reason)`. Decode against the exact ABI and retain the original revert data.

| Reason | Check category | Recovery |
| ---: | --- | --- |
| 1 | Constructor/configuration or companion consistency | Review deployment identity; do not retry as a trade |
| 2 | Reentrancy guard | Review the calling contract |
| 3 | Unexpected native transfer sender | Use the supported router method |
| 4 | Market identity or token/curve/quote/pool linkage | Stop and verify the market |
| 5 | Recipient eligibility | Review the actual recipient; do not silently replace it |
| 6 | Nonzero minimum or bounded deadline | Requote and set a valid protected deadline |
| 7 | Expected phase changed | Read graduation state and rebuild the route |
| 8 | Conversion route identity | Refresh the admitted route; do not substitute a pool |
| 9 | Balance delta or minimum-output condition | Requote and simulate; inspect actual amounts |
| 10 | Native payout failed | Check recipient's ability to receive HYPE |
| 11 | Input amount or input/minimum constraints | Validate amounts and units |

These are categories: a reason can cover more than one condition. Underlying contracts can also return their own errors. An RPC transport error is not a decoded contract revert.

## Signal v4 pools

A v4 trade reverts with the hook's or the router's own error. Decode against the [v4 ABIs](v4-deployments.md#interfaces). A revert raised inside the PoolManager can arrive wrapped; search the revert data for the selector.

| Error | Selector | Meaning | Recovery |
| --- | --- | --- | --- |
| `ExactOutputUnsupported()` | `0xf7ebfa18` | An exact-output swap | Send exact input |
| `PartialFill()` | `0xd964f528` | A buy the pool could not fill whole | Remove the price limit or lower the size; requote |
| `Gated()` | `0xfb727798` | A buy through a router the factory has not approved, inside the launch's Signal-only window | Use Signal's router, or wait for the window to end |
| `WhaleCap()` | `0xb11c7524` | The buy would lift its recipient over the launch's wallet cap, or came through a router that is not approved and so named no recipient | Lower the size so the recipient stays under the cap, send through Signal's router, or wait |
| `OverBudget()` | `0x323e8637` | This buy would take this block's token budget past its limit | Send again in a later block. If the buy alone is larger than the budget, lower the size or wait for the window to end |
| `TooLittleReceived(got, min)` | `0x4e86d23a` | The output was under the minimum | Requote; do not lower the minimum silently |
| `Expired()` | `0x203d82d8` | Past the deadline | Requote with a fresh deadline |
| `NotNativePool()` | `0x425c65bb` | `buyNative` on a pool not paired with WHYPE | Pay in the pair asset with `swap` |
| `Locked()` | `0x0f2e5b6c` | Adding, removing or donating liquidity, or creating a pool on the hook | Not available to anyone |
| `UnknownPool()` | `0xf7139e33` | The pool id is not one of this hook's | Recheck the release and the pool id |

A sale is never refused by `Gated`, `WhaleCap` or `OverBudget`.

## Ambiguous sends

Track chain, sender, nonce, signed intent and transaction hash locally in the wallet integration. If submission times out, reconcile that intent and nonce before sending a replacement. A successful receipt can exist even if the client never received the RPC response.

If a transaction reverted, preserve its evidence and obtain a fresh quote before another user-approved attempt. Do not automatically increase slippage, change recipient or remove a minimum to make a retry succeed.
