Browser Extension

Errors

Error codes returned by the Joey browser extension and how to handle them.

Every SDK method rejects with a JoeyRpcError:

class JoeyRpcError extends Error {
  name: 'JoeyRpcError'
  code: number
  message: string
  data?: unknown
}

JoeyRpcError.from(anything) turns any thrown value into a JoeyRpcError. The codes follow EIP-1193 and JSON-RPC.

Error codes

JOEY_ERROR_CODES Code When
USER_REJECTED 4001 The user rejected or closed the approval window; the approval expired after 5 minutes; or connect was called on a wallet with no accounts. Sites that aren't connected also get 4001 where a locked wallet would otherwise be reported, so lock state isn't revealed.
UNAUTHORIZED 4100 Your site isn't connected; account or tx_signer isn't one of your granted addresses; the transaction type isn't permitted; your origin can't connect (for example file: pages); access was revoked while a request was pending.
UNSUPPORTED_METHOD 4200 Unknown method name.
LOCKED 4300 Joey is locked and the request can't wait for unlock. Rare: most requests wait behind the unlock screen instead.
DISCONNECTED 4900 Joey isn't installed (requireJoey, or waitForJoey timing out), or the extension can't be reached.
CHAIN_DISCONNECTED 4901 The chain you passed doesn't match Joey's network, or the user switched network while the request was pending.
UNRECOGNIZED_CHAIN 4902 Joey reported a chain the SDK doesn't recognise. A chain parameter that isn't xrpl:0, xrpl:1 or xrpl:2 is rejected as -32602.
LIMIT_EXCEEDED -32005 Too many requests. Back off; don't retry in a loop. See rate limits.
INVALID_REQUEST -32600 Malformed request.
INVALID_PARAMS -32602 Invalid parameters, including: tx_json.Account isn't the signing account; a fee over 2 XRP with autofill: false; a NetworkID field; an X-address; malformed fields; an invalid Batch; oversized params.
INTERNAL -32603 Anything else, including an aborted waitForJoey.

Handling errors

import { JOEY_ERROR_CODES, JoeyRpcError, isUserRejection } from '@joeywallet/wallet-sdk'

try {
  await joey.signAndSubmitTransaction({ tx_json })
} catch (error) {
  if (isUserRejection(error)) return // the user said no; not an error to report

  if (error instanceof JoeyRpcError) {
    switch (error.code) {
      case JOEY_ERROR_CODES.UNAUTHORIZED:
        return showError('Not permitted, or not connected.')
      case JOEY_ERROR_CODES.CHAIN_DISCONNECTED:
        return showError('Joey is on a different network.')
      case JOEY_ERROR_CODES.LIMIT_EXCEEDED:
        return showError('Too many requests. Please wait a moment.')
      case JOEY_ERROR_CODES.LOCKED:
        return showError('Unlock Joey and try again.')
    }
  }
  throw error
}

Use isUserRejection(error) rather than checking code === 4001: it also recognises rejections from wallets and shims that only say "reject" in the message.