Error reference
ImplementedCustom errors and skip reasons, with what each one actually means when you see it.
#Skip reasons
A skip is a recorded decision, not a failure. Every one of these appears in a SyncSkipped event and on the activity feed.
| Reason | What happened |
|---|---|
None | No skip. Present for enum completeness. |
NoChange | The source's balance matched the accepted snapshot. Nothing to mirror. |
AssetNotApproved | The asset is not on the approved list. Recorded as visible divergence and never bought — including an airdrop. |
AssetPaused | The asset is approved but currently paused. Existing holdings are unaffected and remain redeemable in kind. |
VaultHoldsNoPosition | A sell was indicated, but the vault holds none of that asset. |
InsufficientBaseAsset | Not enough spendable base asset after reserving the cash buffer. |
BelowDustThreshold | The proportional trade was too small to be worth its gas. |
PositionCountCapReached | Opening this position would exceed the tracked-asset limit. |
ExposureCapReached | Buying more would breach the position concentration cap. |
VaultNavCapReached | The vault is at the maximum size its parameters were reviewed for. |
CashBufferWouldBreach | Spending would eat the reserve that keeps in-kind exit cheap. |
PriceStale | The price adapter refused to stand behind a number. |
PriceInsufficientHistory | Not enough TWAP history to form a reference. |
PriceDeviationImplausible | Spot and the oracle reference disagree beyond the tolerance. |
LiquidityTooLow | The pool cannot absorb the size at an acceptable price. |
EntryImpactTooHigh | Buying would move the price further than the ceiling allows. |
ExitImpactTooHigh | The position could not be exited at size within the ceiling. |
SlippageExceeded | Execution would return materially less than quoted. |
SourceStateAlreadyExecuted | This exact source movement has already been mirrored. Duplicate-execution guard. |
SourceStateStale | The movement is older than the pending expiry. Chasing a price that has moved on is worse than acknowledging the miss. |
ExecutionPaused | Mirroring is paused on this vault. Withdrawal is unaffected. |
NoEligibleSourceNav | The source holds no approved assets, so there is no denominator to size against. |
QuoteUnavailable | The venue could not produce a quote. |
#Vault errors
| Error | Meaning |
|---|---|
ZeroAddress() | An address argument was zero. |
ZeroAmount() | An amount argument was zero. |
DepositsArePaused() | Deposits paused. Withdrawal unaffected. |
ExecutionIsPaused() | Mirroring paused. Withdrawal unaffected. |
VaultCapReached(nav, cap) | The deposit would push NAV past the cap. |
SourceInactive() | The source version is not active. |
TrackedAssetLimitReached() | The tracked-asset set is full. Bounded so a sync stays gasable. |
AssetNotApproved(token) | The asset is not approved for mirroring. |
NothingToSync() | No actionable change for that asset. |
InsufficientShares(held, requested) | You do not hold that many shares. |
NotRequestOwner() | That redemption request belongs to someone else. |
RequestNotSettled() | The epoch has not settled yet. |
RequestAlreadyClaimed() | Already collected. |
EpochNotReady() | The epoch cannot settle yet. |
PriceUnavailable(token) | A held position cannot be priced, so NAV cannot be computed. Deposits refuse; in-kind exit is unaffected. |
Note.
PriceUnavailableis the error behind every "NAV unavailable" state in the interface. It is a refusal to produce a number the contract does not stand behind, not a malfunction.
#Registry and router errors
| Error | Contract | Meaning |
|---|---|---|
UnknownAsset(token) | AssetRiskRegistry | No review recorded for that asset |
ParameterOutOfRange(parameter, value, ceiling) | AssetRiskRegistry | A parameter was set above the hard ceiling |
DecimalsMismatch(declared, onChain) | AssetRiskRegistry | Declared decimals disagree with the token contract |
UnknownVersion(versionId) | SourceRegistry | No such source version |
DuplicateSource(hash, account) | SourceRegistry | That source is already registered |
AdapterNotAllowed(adapter) | PriceRouter / ExecutionRouter | Adapter is not allowlisted |
CannotPrice(token, reason) | PriceRouter | Pricing failed, with the skip reason |
NotAVault(caller) | ExecutionRouter | Caller is not a factory-deployed vault |
VaultMismatch(caller, orderVault) | ExecutionRouter | The order names a different vault than the caller |
PairNotAllowed(tokenIn, tokenOut) | ExecutionRouter | That pair is not permitted |
SourceStateAlreadyConsumed(id) | ExecutionRouter | Replay guard |
DeadlinePassed(deadline, nowTs) | ExecutionRouter | The order expired |
#Decoding
The SDK's explainViemError turns a revert into the contract's own error with its arguments, so an interface can say why instead of showing a hex selector.