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.
