Auth leg (raised by the OIDC client in core/auth.ts):
authorization_error — the issuer returned an error parameter in the
authorization callback (e.g. the user denied consent).invalid_callback — the callback was malformed or arrived without a
matching pending login attempt (missing code, or no persisted PKCE state).state_mismatch — the callback state did not match the value stored for
this login attempt (CSRF / stale-tab defense).token_request_failed — the token endpoint rejected the exchange or the
response was missing id_token/access_token.invalid_id_token — the returned id_token failed binding-claim validation
(issuer, audience, expiry, nonce, or subject).Client / session lifecycle:
config_invalid — UpbondConfig failed boundary validation in
validateConfig (missing/relative URL, unknown environment, ...).not_signed_in — an operation needing a session was called before sign-in
(embedded connect() included: the RP must login() first — D20 A-3),
or the session was ended while a refresh was in flight.session_expired — the id_token has expired and no refresh token was
available, or the refresh grant was definitively rejected — sign in again.wallet_not_configured — a wallet method was called without a matching
wallet config, or a redirect-mode method was called in embedded mode (or
vice versa).Wallet leg (translated from wallet-core implementation errors at the adapter
boundary, original error preserved on cause):
popup_blocked — the browser blocked the popup (connect() /
loginAndConnect() must be called synchronously from a user gesture).
Recoverable: fall back to the redirect login().popup_closed — the user closed the popup before the flow completed
(login leg or wallet leg). Treat as cancellation, not failure.unsupported_browser — an in-app browser (LINE, Instagram, Facebook, ...)
where popup windows and usually WebAuthn are unavailable, so neither the
popup login nor the wallet ceremony can run. Terminal in this browser:
guide the user to open the page in an external browser.wallet_not_set_up — a signature was requested before the wallet was
onboarded (run setupWallet() or recoverWallet() first).recovery_required — this device holds no usable factor; new-device
recovery (recoverWallet()) is needed.recovery_unavailable — recovery cannot proceed: no stored binding, or the
recoverian/OTP prompt is not configured.passkey_unsupported — the platform authenticator lacks the required
WebAuthn PRF capability (or WebAuthn is absent). Terminal for wallet
creation — there is no passcode fallback; guide the user to an external
browser. Unlock can still succeed via a previously added passcode sealer.wallet_locked — a Layer-2 operation was attempted on a locked wallet
(call unlockWallet() first).invalid_otp — the recoverian rejected the presented one-time code.resend_too_soon — an OTP was requested again before the resend cooldown
elapsed (recoverian rate limit).factor_limit_reached — the MPC network refused to register another key
factor (per-account cap); no new device can be enrolled and the recovery
factor cannot be rotated until unused factors are removed.factor_not_deletable — removeFactor refused the requested factor: it
is not a stale device factor (recovery factors and unclassified factors
are never deletable), it is this device's own factor, or the MPC engine
refused (last remaining factor / the ceremony's active factor).passcode_not_allowed — the client's sealer policy is 'passkey-strict':
passcode sealers are disabled, so addPasscodeSealer is refused.invalid_passcode — the entered passcode failed to unseal the device
factor vault (authenticated decryption failed). The vault stays locked.wallet_error — catch-all for any other wallet-layer failure (handshake
timeout, unexpected internal error).External wallets (connectExternal, issue #302):
external_wallet_unavailable — no EIP-6963 provider announced for the
requested rdns: the wallet extension is not installed (or not responding).
Provider-level rejections (e.g. the user declining the connect prompt)
surface as Eip1193Error with the standard numeric code instead.
The frozen set of error codes carried by every UpbondError. Narrow on
error.coderather than parsing messages — the code union is the customer contract; messages are advisory and may change.