vaultsDocumentation

Error reference

Implemented

Custom 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.

ReasonWhat happened
NoneNo skip. Present for enum completeness.
NoChangeThe source's balance matched the accepted snapshot. Nothing to mirror.
AssetNotApprovedThe asset is not on the approved list. Recorded as visible divergence and never bought — including an airdrop.
AssetPausedThe asset is approved but currently paused. Existing holdings are unaffected and remain redeemable in kind.
VaultHoldsNoPositionA sell was indicated, but the vault holds none of that asset.
InsufficientBaseAssetNot enough spendable base asset after reserving the cash buffer.
BelowDustThresholdThe proportional trade was too small to be worth its gas.
PositionCountCapReachedOpening this position would exceed the tracked-asset limit.
ExposureCapReachedBuying more would breach the position concentration cap.
VaultNavCapReachedThe vault is at the maximum size its parameters were reviewed for.
CashBufferWouldBreachSpending would eat the reserve that keeps in-kind exit cheap.
PriceStaleThe price adapter refused to stand behind a number.
PriceInsufficientHistoryNot enough TWAP history to form a reference.
PriceDeviationImplausibleSpot and the oracle reference disagree beyond the tolerance.
LiquidityTooLowThe pool cannot absorb the size at an acceptable price.
EntryImpactTooHighBuying would move the price further than the ceiling allows.
ExitImpactTooHighThe position could not be exited at size within the ceiling.
SlippageExceededExecution would return materially less than quoted.
SourceStateAlreadyExecutedThis exact source movement has already been mirrored. Duplicate-execution guard.
SourceStateStaleThe movement is older than the pending expiry. Chasing a price that has moved on is worse than acknowledging the miss.
ExecutionPausedMirroring is paused on this vault. Withdrawal is unaffected.
NoEligibleSourceNavThe source holds no approved assets, so there is no denominator to size against.
QuoteUnavailableThe venue could not produce a quote.

#Vault errors

ErrorMeaning
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. PriceUnavailable is 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

ErrorContractMeaning
UnknownAsset(token)AssetRiskRegistryNo review recorded for that asset
ParameterOutOfRange(parameter, value, ceiling)AssetRiskRegistryA parameter was set above the hard ceiling
DecimalsMismatch(declared, onChain)AssetRiskRegistryDeclared decimals disagree with the token contract
UnknownVersion(versionId)SourceRegistryNo such source version
DuplicateSource(hash, account)SourceRegistryThat source is already registered
AdapterNotAllowed(adapter)PriceRouter / ExecutionRouterAdapter is not allowlisted
CannotPrice(token, reason)PriceRouterPricing failed, with the skip reason
NotAVault(caller)ExecutionRouterCaller is not a factory-deployed vault
VaultMismatch(caller, orderVault)ExecutionRouterThe order names a different vault than the caller
PairNotAllowed(tokenIn, tokenOut)ExecutionRouterThat pair is not permitted
SourceStateAlreadyConsumed(id)ExecutionRouterReplay guard
DeadlinePassed(deadline, nowTs)ExecutionRouterThe 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.