Giter Site home page Giter Site logo

rpc-errors's Introduction

@metamask/rpc-errors

JSON-RPC errors, including for Ethereum JSON RPC and Ethereum Provider, and making unknown errors compliant with either spec.

Installation

yarn add @metamask/rpc-errors

or

npm install @metamask/rpc-errors

Usage

import { rpcErrors, providerErrors } from '@metamask/rpc-errors';

throw rpcErrors.invalidRequest();
// or
throw providerErrors.unauthorized('my custom message');

Supported Errors

API

import { rpcErrors, providerErrors } from '@metamask/rpc-errors';

// JSON-RPC errors and Ethereum EIP-1474 errors are namespaced under "rpcErrors"
response.error = rpcErrors.methodNotFound({
  message: optionalCustomMessage,
  data: optionalData,
});

// Ethereum EIP-1193 Provider errors namespaced under "providerErrors"
response.error = providerErrors.unauthorized({
  message: optionalCustomMessage,
  data: optionalData,
});

// each error getter takes a single "opts" argument
// for most errors, this can be replaced with a single string, which becomes
// the error message
response.error = providerErrors.unauthorized(customMessage);

// if an error getter accepts a single string, all arguments can be omitted
response.error = providerErrors.unauthorized();
response.error = providerErrors.unauthorized({});

// omitting the message will produce an error with a default message per
// the relevant spec

// omitting the data argument will produce an error without a
// "data" property

// the JSON RPC 2.0 server error requires a valid code
response.error = rpcErrors.server({
  code: -32031,
});

// custom Ethereum Provider errors require a valid code and message
// valid codes are integers i such that: 1000 <= i <= 4999
response.error = providerErrors.custom({
  code: 1001,
  message: 'foo',
});

Parsing Unknown Errors

// this is useful for ensuring your errors are standardized
import { serializeError } from '@metamask/rpc-errors'

// if the argument is not a valid error per any supported spec,
// it will be added as error.data.originalError
response.error = serializeError(maybeAnError)

// you can add a custom fallback error code and message if desired
const fallbackError = { code: 4999, message: 'My custom error.' }
response.error = serializeError(maybeAnError, fallbackError)

// Note: if the original error has a "message" property, it will take
// precedence over the fallback error's message

// the default fallback is:
{
  code: -32603,
  message: 'Internal JSON-RPC error.'
}

Other Exports

/**
 * Classes
 */
import { JsonRpcError, EthereumProviderError } from '@metamask/rpc-errors';

/**
 * getMessageFromCode and errorCodes
 */
import { getMessageFromCode, errorCodes } from '@metamask/rpc-errors';

// get the default message string for the given code, or a fallback message if
// no message exists for the given code
const message1 = getMessageFromCode(someCode);

// you can specify your own fallback message
const message2 = getMessageFromCode(someCode, myFallback);
// it can be anything, use at your own peril
const message3 = getMessageFromCode(someCode, null);

// {
//   rpcErrors: { [errorName]: code, ... },
//   providerErrors: { [errorName]: code, ... },
// }
const code1 = rpcErrors.parse;
const code2 = providerErrors.userRejectedRequest;

// all codes in errorCodes have default messages
const message4 = getMessageFromCode(code1);
const message5 = getMessageFromCode(code2);

Contributing

Setup

  • Install Node.js version 16
    • If you are using nvm (recommended) running nvm use will automatically choose the right node version for you.
  • Install Yarn v3
  • Run yarn install to install dependencies and run any required post-install scripts

Testing and Linting

Run yarn test to run the tests once. To run tests on file changes, run yarn test:watch.

Run yarn lint to run the linter, or run yarn lint:fix to run the linter and fix any automatically fixable issues.

Release & Publishing

The project follows the same release process as the other libraries in the MetaMask organization. The GitHub Actions action-create-release-pr and action-publish-release are used to automate the release process; see those repositories for more information about how they work.

  1. Choose a release version.
  • The release version should be chosen according to SemVer. Analyze the changes to see whether they include any breaking changes, new features, or deprecations, then choose the appropriate SemVer version. See the SemVer specification for more information.
  1. If this release is backporting changes onto a previous release, then ensure there is a major version branch for that version (e.g. 1.x for a v1 backport release).
  • The major version branch should be set to the most recent release with that major version. For example, when backporting a v1.0.2 release, you'd want to ensure there was a 1.x branch that was set to the v1.0.1 tag.
  1. Trigger the workflow_dispatch event manually for the Create Release Pull Request action to create the release PR.
  • For a backport release, the base branch should be the major version branch that you ensured existed in step 2. For a normal release, the base branch should be the main branch for that repository (which should be the default value).
  • This should trigger the action-create-release-pr workflow to create the release PR.
  1. Update the changelog to move each change entry into the appropriate change category (See here for the full list of change categories, and the correct ordering), and edit them to be more easily understood by users of the package.
  • Generally any changes that don't affect consumers of the package (e.g. lockfile changes or development environment changes) are omitted. Exceptions may be made for changes that might be of interest despite not having an effect upon the published package (e.g. major test improvements, security improvements, improved documentation, etc.).
  • Try to explain each change in terms that users of the package would understand (e.g. avoid referencing internal variables/concepts).
  • Consolidate related changes into one change entry if it makes it easier to explain.
  • Run yarn auto-changelog validate --rc to check that the changelog is correctly formatted.
  1. Review and QA the release.
  • If changes are made to the base branch, the release branch will need to be updated with these changes and review/QA will need to restart again. As such, it's probably best to avoid merging other PRs into the base branch while review is underway.
  1. Squash & Merge the release.
  • This should trigger the action-publish-release workflow to tag the final release commit and publish the release on GitHub.
  1. Publish the release on npm.
  • Wait for the publish-release GitHub Action workflow to finish. This should trigger a second job (publish-npm), which will wait for a run approval by the npm publishers team.
  • Approve the publish-npm job (or ask somebody on the npm publishers team to approve it for you).
  • Once the publish-npm job has finished, check npm to verify that it has been published.

rpc-errors's People

Contributors

danfinlay avatar dependabot[bot] avatar frederikbolding avatar github-actions[bot] avatar gudahtt avatar legobeat avatar metamaskbot avatar mrtenz avatar rekmarks avatar ryanml avatar whymarrh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rpc-errors's Issues

how can I get the error code of erc error in metamask?

my question is : if I use

await ethereum.request({ method: "wallet_switchEthereumChain", params: [{ chainId: "0x80" }], });

maybe the console of my browser will throw a error like:{code:4902},this code indicate the current network is not added in my metamask.

so,now I want to get this code:4902 without use that request method,for example:there is a button,when I click it,the codes in the button I wrote will detect that the current network is in the metamask or not without use 'wallet_switchEthereumChain' first, is there any erc error api for me to do that?

React-Native crashed when try access `err.stack`

React Native app crashed when try to access stack field in the error object

in reactNative ( version 0.72.0 )

to reproduce (in react native)

    import {rpcErrors} from '@metamask/rpc-errors';
    
    try {
      let err = rpcErrors.invalidRequest();
      console.log(err.stack);
    } catch (error) {
      console.log(error);
    }

Accessing stack in Error class works fine

   try {
     let err = new Error("error message");
     console.log(err.stack);
   } catch (error) {
     console.log(error);
   }

Migrate tests to Jest

Replace tape with jest per the MetaMask module template, and colocate tests with source files.

Update ESLint config

Add the latest @metamask/eslint-config packages and a config matching the module template.

Property 'cause' does not exist on type 'Json & ExactOptionalGuard'

Hi,
My main purpose of using serializeError is to get cause. it works perfectly but I get a following error

Property 'cause' does not exist on type 'Json & ExactOptionalGuard'.

What would be the appropriate type of it? My code is below:

const err = serializeError(e);  // 'e' from smart contract error
const cause = err?.data?.cause?.reason; // Property 'cause' does not exist on type 'Json & ExactOptionalGuard'

Enable CirlceCI

CirlceCI should be enabled for the project & run against fork PRs

Rename exports to be rpc-based rather than Ethereum-based

Since we're aiming to support multiple networks, and these errors can be used across those different networks, we should make the package more generic. This includes things like:

  • Renaming the ethErrors variable to something like rpcErrors.
  • Renaming the different classes to remove "Ethereum" from the name.
  • Renaming this repository to rpc-errors, to match the name of the package (#67).

how to get the revert error message

I have tried using serializeError(error) it doesn't contain the original revert error in the output.

here's is an example of what I'm trying to get my hands on
image

passing the error as is to serializeError gives me this output which doesn't contain the revert message at all.
image

is there another way or am I doing it wrong sirs! thanks

Non-standard code being thrown

Getting an error that isn't included in this list. I'm not familiar with what to do about that nor where the error is originating from:

MetaMask - RPC Error: The execution failed due to an exception. {code: -32016, message: 'The execution failed due to an exception.', data: 'Reverted'}
  1. Any suggestions on how to troubleshoot these scenarios?
  2. In this case I actually believe this is a require() in the contract function. Would that even make sense here? The error is actually being thrown before a user is even prompted to submit the tx.
  3. Who could be throwing these errors? I imagine this is either on the contract dev or the RPC client?

Error serialization logic is faulty

Errors are "serialized" using the serializeError function, and this function has considerable issues. We use the internal utility isValidCode which only returns true if this package has a message for that code in its enums. This sucks, because technically any valid integer code is valid. I don't know what I was thinking when I implemented this.

The error serialization should continue to optionally include the stack property, but it should permit any error object (and especially, error code) that is valid per the JSON-RPC 2.0 specification, i.e. any integer number. Only if the original error object does not conform to the following interface should we modify it and replace it with a -32603 error:

type JsonRpcError = {
  code: number, // specifically, any safe integer
  message: string,
  data?: Json,
  stack?: string, // non-standard, but on occasion useful
}

If a value passed to serializeError violates this interface in any way, we should create a new JSON-RPC error as follows, where data.originalError is the original error value if it's valid JSON:

{
  code: -32603,
  message: 'Invalid internal error. See "data.originalError" for original value. Please report this bug.',
  data: { originalError }
}

See #48 and the following screenshot for examples of how the current logic mangles errors:
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.