Build with Signal
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. 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.