Giter Site home page Giter Site logo

eth-hd-keyring's Introduction

HD Keyring

A simple JS class wrapped around ethereumjs-wallet designed to expose an interface common to many different signing strategies, to be used in a KeyringController, like is being used in MetaMask

Installation

yarn add @metamask/eth-hd-keyring

or

npm install @metamask/eth-hd-keyring

The Keyring Class Protocol

One of the goals of this class is to allow developers to easily add new signing strategies to MetaMask. We call these signing strategies Keyrings, because they can manage multiple keys.

Keyring.type

A class property that returns a unique string describing the Keyring. This is the only class property or method, the remaining methods are instance methods.

constructor( options )

As a Javascript class, your Keyring object will be used to instantiate new Keyring instances using the new keyword. For example:

const keyring = new YourKeyringClass(options);

The constructor currently receives an options object that will be defined by your keyring-building UI, once the user has gone through the steps required for you to fully instantiate a new keyring. For example, choosing a pattern for a vanity account, or entering a seed phrase.

We haven't defined the protocol for this account-generating UI yet, so for now please ensure your Keyring behaves nicely when not passed any options object.

Keyring Instance Methods

All below instance methods must return Promises to allow asynchronous resolution.

serialize()

In this method, you must return any JSON-serializable JavaScript object that you like. It will be encoded to a string, encrypted with the user's password, and stored to disk. This is the same object you will receive in the deserialize() method, so it should capture all the information you need to restore the Keyring's state.

deserialize( object )

As discussed above, the deserialize() method will be passed the JavaScript object that you returned when the serialize() method was called.

addAccounts( n = 1 )

The addAccounts(n) method is used to inform your keyring that the user wishes to create a new account. You should perform whatever internal steps are needed so that a call to serialize() will persist the new account, and then return an array of the new account addresses.

The method may be called with or without an argument, specifying the number of accounts to create. You should generally default to 1 per call.

getAccounts()

When this method is called, you must return an array of hex-string addresses for the accounts that your Keyring is able to sign for.

signTransaction(address, transaction)

This method will receive a hex-prefixed, all-lowercase address string for the account you should sign the incoming transaction with.

For your convenience, the transaction is an instance of ethereumjs-tx, (https://github.com/ethereumjs/ethereumjs-tx) so signing can be as simple as:

transaction.sign(privateKey)

You must return a valid signed ethereumjs-tx (https://github.com/ethereumjs/ethereumjs-tx) object when complete, it can be the same transaction you received.

signMessage(address, data)

The eth_sign method will receive the incoming data, alread hashed, and must sign that hash, and then return the raw signed hash.

exportAccount(address)

Exports the specified account as a private key hex string.

Contributing

Setup

  • Install Node.js version 18
    • 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. Squash & Merge the release.

    • This should trigger the action-publish-release workflow to tag the final release commit and publish the release on GitHub.
  7. Publish the release on npm.

    • Be very careful to use a clean local environment to publish the release, and follow exactly the same steps used during CI.
    • Use npm publish --dry-run to examine the release contents to ensure the correct files are included. Compare to previous releases if necessary (e.g. using https://unpkg.com/browse/[package name]@[package version]/).
    • Once you are confident the release contents are correct, publish the release using npm publish.

eth-hd-keyring's People

Contributors

adonesky1 avatar bitpshr avatar brad-decker avatar danfinlay avatar danjm avatar danroc avatar dependabot[bot] avatar flyswatter avatar github-actions[bot] avatar gudahtt avatar kumavis avatar legobeat avatar logvik avatar metamaskbot avatar montelaidev avatar ukstv avatar whymarrh avatar zgayjjf 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

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

eth-hd-keyring's Issues

Action required: Greenkeeper could not be activated 🚨

🚨 You need to enable Continuous Integration on all branches of this repository. 🚨

To enable Greenkeeper, you need to make sure that a commit status is reported on all branches. This is required by Greenkeeper because we are using your CI build statuses to figure out when to notify you about breaking changes.

Since we did not receive a CI status on the greenkeeper/initial branch, we assume that you still need to configure it.

If you have already set up a CI for this repository, you might need to check your configuration. Make sure it will run on all new branches. If you don’t want it to run on every branch, you can whitelist branches starting with greenkeeper/.

We recommend using Travis CI, but Greenkeeper will work with every other CI service as well.

Once you have installed CI on this repository, you’ll need to re-trigger Greenkeeper’s initial Pull Request. To do this, please delete the greenkeeper/initial branch in this repository, and then remove and re-add this repository to the Greenkeeper integration’s white list on Github. You'll find this list on your repo or organiszation’s settings page, under Installed GitHub Apps.

Migrate to TypeScript

We want to migrate this package to TypeScript to reduce regressions and improve compatibility with our other TypeScript projects.

Question on expected time for browser computation

When running MetaMask and attempting to create a bulk group of secp256k1 addresses, my browser is spending a lot of time computing the comb10MulTo (10 seconds on 123 addresses / ~50% total runtime) that is downstream of the addAccounts used in the eth-hd-keyring package.

Has anyone here run into this when bulk generating addresses in the browser using eth-hd-keyring? Running the program outside of the browser takes 2.43ms for 100 address via the test methods.

I understand that the browser computation will be slower but is 500x slowness expected?

CallTrace for reference:
Screen Shot 2021-11-17 at 11 46 58 AM

Support hardened keys.

MetaMask uses BIP32 HD keys, which means a single root seed phrase can result in many wallets. Unfortunately, it calls deriveChild(i) where i is a small number which means the additional keys it generates are not hardened. A non-hardened key (as I understand it) is one that could be associated with other un-hardened keys correlated with the account. This means if someone knows one of your MetaMask accounts, they can correlate it with your other MetaMask accounts.

I recommend adding a way for users to derive hardened keys. Using the current library, this is done by passing in a very large number for i to deriveChild(i). You can see the hdkey library for details.

How to add native address for some uncommon tokens to MetaMask wallet?

Hello:
I want to bridge some BTCBAM tokens from its native network ‘BTCBAM’ to Ethereum (ERC20) network, so I can get some wrapped BTCBAM tokens.
I know its contract address on BSC is: 0x79abC799ae4B749C01e07a60c8687A49D128eA1C
But my MetaMask wallet address is EVM address like: 0x…., I can find one BTCBAM native address is something like this: Bq4Ei1WxgnN6VD5jxeTtMSdvLfK8as7sJM
In order to bridge BTCBAM from its native address to ERC20 address, I think I need some BTCBAM address in my MetaMask wallet, right? But how can I get one of such address.
I found some articles from BTCBAM web site talking about BTCBAM wallet, I think those address in BTCBAM wallet should be the native network address.
I want to know if I can use BTCBAM wallet to generate a deposit address, and export the address using the wallet private key, then use MetaMask wallet to import the native BTCBAM address with its wallet private key. If it works, then I can add native BTCBAM wallet address in my MetaMask wallet, then later on go to some bridge web site, to bridge the BTCBAM tokens from its native network to ERC20 network, I want to get the wrapped BTCBAM tokens on ERC20 network.
Please advise if I think in the correct way or not.
Thanks,

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.