Skip to main content
A brokerage can fail at four layers: the broker contract, the token (EIP-3009), the adapter, or the relayer in front of them. This is the single lookup. Contract and token reverts unwind the whole transaction atomically; the consumer is not charged. Relayer codes are returned without spending gas (the relayer pre-simulates).

Contract and on-chain reverts

These revert the transaction. Nothing moves; the EIP-3009 nonce is not consumed (except a genuine replay, where the nonce was already spent).
RevertOriginMeaningHow to fix
FeeTooHigh()CapabilityBrokerorder.feeBps > 10000.Set feeBps at most 10000.
ReentrancyGuardReentrantCall()CapabilityBrokerA reentrant call into the broker mid-settlement.An adapter must not re-enter the broker; keep checks-effects-interactions.
SafeERC20FailedOperation(address)CapabilityBrokerA payout transfer failed.Check the payToken and balances.
invalid signatureTestUSDC (EIP-3009)The recovered signer is not order.consumer. Any tampered order field changes the orderHash and breaks the signature.Submit the order exactly as signed; recompute the encoding.
authorization expiredTestUSDC (EIP-3009)block.timestamp > validBefore.Re-sign with a fresh window.
authorization usedTestUSDC (EIP-3009)The orderHash nonce was already spent (replay).Build a new order (a fresh order.nonce salt).
AllocationSoldOut(uint256 vaultId)AllocationAdapterThe vault has no remaining slots (or is unconfigured).Pick an open vault, or ask the provider to raise the cap.
NoLaneControl()TimeboostAdapterThe laneOperator does not control the current express-lane round.Retry when the operator holds the round.
NotBroker()any adaptergrant was called by something other than the broker.Only the broker calls grant; route through brokerCapability.
BadAttestation()AttestedAdapterThe attestation signer is not the configured attestor.Obtain a valid attestation from the provider’s attestor.
AttestationExpired()AttestedAdapterblock.timestamp > notAfter.Request a fresh attestation.
ZeroAddress()any adapterA required address argument was zero (construction or admin).Pass a non-zero address.

Relayer wire codes

The relayer returns { ok: false, code, message } (no key or signature material) with the HTTP status below. These come from RelayErrorCode and RELAY_ERROR_STATUS in @caplane/shared.
CodeHTTPMeaningHow to fix
MALFORMED_ORDER400The request body failed validation.Check field types (feeBps is a uint16; amount and nonce are decimal strings).
ORDERHASH_MISMATCH400The client orderHash does not match the relayer’s recomputed hash.Re-encode the order. See Order encoding.
FEE_BELOW_FLOOR402order.feeBps is under this relayer’s floor.Raise feeBps, or pick a relayer with a lower floor (GET /info).
WOULD_REVERT422Pre-simulation shows the order would revert on-chain.Fix the inputs (fund the key, pick an open vault).
AUTH_EXPIRED422The signed window has passed.Re-sign with a fresh window.
INSUFFICIENT_RELAYER_GAS503The relayer is low on gas.Try another relayer, or run your own.
UPSTREAM_RPC502The relayer’s RPC failed.Retry, or try another relayer.
A non-JSON or unexpected relayer response surfaces client-side as SubmitError("BAD_RESPONSE").

Hardened-edge codes

A public relayer may run the opt-in hardened edge. Its rejections use a separate EdgeErrorCode union, so the audited settlement taxonomy above stays clean.
CodeHTTPMeaningHow to fix
RATE_LIMITED429Per-IP rate limit exceeded.Wait for the Retry-After delay.
SERVER_BUSY429The relayer is at its concurrency cap.Retry shortly, or use another relayer.
INSUFFICIENT_RELAYER_GAS503The relayer key’s balance is below its gas floor; POST /broker is paused.Try another relayer, or run your own. (Reuses the settlement code so handling stays uniform.)

See also