WHEN IT FAILS

Errors

Every named revert becomes a typed error with a sentence about what to do next.

Scope and expiry are checked locally, before a request is sent, so a call the grant cannot make never hits the node. Everything below extends InterludeError. Catch that if you want one branch; catch the named class if you want a specific sentence on screen.

SessionExpiredError
The grant's hour ran out. Call openSession again. The user signs a new message.
SelectorOutOfSessionScopeError
The call is not in the grant's scope, or the app reached it through this.other(), which changes msg.sig. Widen the scope or stop hopping.
SessionEpochStaleError
The user revoked, or the node pinned its block before the epoch moved. The message says which. Open a new session in the first case. In the second, the running node refuses this grant until the app is re-delegated: a node never re-reads the epoch mid-session.
WrongSessionKeyError
The grant was presented by a key it does not name. The stored grant and the key that signed the wrapper drifted. Open a new session.
SessionNotSignedByGranterError
Usually a grant signed for another app or another chain id. Check that base is Monad and that app is the address the user saw.
PrivilegedSelectorError
No grant reaches the delegation controls or the hub callbacks. Those stay on the owner wallet, on Monad.
DelegatedWritesDisabledError
The write went to Monad instead of the node. The base chain refuses it on purpose. Point the call at the node URL.
AppRevertError
Your own rule, with its error name and decoded arguments. Treat it like any other contract revert.
NodeUnreachableError
The node did not answer. The message names the url. The rest of the page is fine; the process is down.
NodeBusyError
The node refused for backpressure, and send already retried with the same signed transaction (busyRetries, 5 by default). kind "batch": the open batch is full until the next commit. kind "limit": a rate limit (HTTP 429 or -32005), with retryAfterMs when the node named one. Nothing ran. retryable: false means this one call writes more than a batch can carry: split it.
WrongNodeError
The node at node serves another app. Each node serves one contract: use the app and the node ship printed, together.
WrongChainError
The wallet is on another network than Monad testnet. Nothing was sent or signed. Pass ensureChain: true to openSession (or to the React provider), or call interlude.ensureChain(wallet) first.
WriteOutsideDelegationError
The call writes state the delegation does not cover: another contract, or a slot that was never delegated. The node dropped the call whole.
SessionUnusableError
An SDK precondition failed before anything was sent: a wallet client with no account, a grant with no scope, a stored session that does not match.
SessionRevokedError
This client revoked the grant with revokeAll and will not sign with that key again. Open a new session.
ResultUnavailableError
The call ran, but its response was lost and the node's receipt carries no return data. It was not sent again: read the state it changed rather than retrying it.
SettlementLostError
From settled or waitSettled({ hash }): the node no longer knows the call, most likely a restart that dropped what it had not committed. It will never settle; send it again.
SettlementTimeoutError
From settled or waitSettled: no commit carried the call in time (60 s by default). Commits may have stopped; status() shows what is still pending.
UnrecognisedRevertError
Revert data no error in the ABI matches. Pass the app's full ABI, errors included.

The rest (InvalidScopeError, EmptySessionScopeError, DelegatableError and the malformed-grant reverts) are in the Errors table of the SDK’s README on npm. What the node and control refuse, and when, is on What will not work.