https://github.com/metamask/eth-ledger-bridge-keyring
A wrapper around LedgerJS libraries, to support the KeyringController protocol used by MetaMask
https://github.com/metamask/eth-ledger-bridge-keyring
Last synced: about 1 year ago
JSON representation
A wrapper around LedgerJS libraries, to support the KeyringController protocol used by MetaMask
- Host: GitHub
- URL: https://github.com/metamask/eth-ledger-bridge-keyring
- Owner: MetaMask
- License: isc
- Created: 2018-08-12T04:11:01.000Z (almost 8 years ago)
- Default Branch: main
- Last Pushed: 2024-04-11T12:29:22.000Z (about 2 years ago)
- Last Synced: 2024-04-14T10:47:52.623Z (about 2 years ago)
- Language: TypeScript
- Homepage:
- Size: 12.8 MB
- Stars: 78
- Watchers: 47
- Forks: 91
- Open Issues: 25
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
README
# eth-ledger-bridge-keyring [](https://circleci.com/gh/MetaMask/eth-ledger-bridge-keyring)
> [!WARNING]
> This package has been moved into a
> [new monorepo](https://github.com/MetaMask/accounts/tree/main/packages/keyring-eth-ledger-bridge).
> This repository is no longer in use, and pull requests will no longer be accepted.
An implementation of MetaMask's [Keyring interface](https://github.com/MetaMask/eth-simple-keyring#the-keyring-class-protocol), that uses a Ledger hardware wallet for all cryptographic operations.
In most regards, it works in the same way as
[eth-hd-keyring](https://github.com/MetaMask/eth-hd-keyring), but using a Ledger
device. However there are a number of differences:
- Because the keys are stored in the device, operations that rely on the device
will fail if there is no Ledger device attached, or a different Ledger device
is attached.
- It does not support the `signMessage`, `signTypedData` or `exportAccount`
methods, because Ledger devices do not support these operations.
- Because extensions have limited access to browser features, there's no easy way to interact wth the Ledger Hardware wallet from the MetaMask extension. This library implements a workaround to those restrictions by injecting (on demand) an iframe to the background page of the extension, (which is hosted [here](https://metamask.github.io/eth-ledger-bridge-keyring/index.html).
The iframe is allowed to interact with the Ledger device (since U2F requires SSL and the iframe is hosted under https) using the libraries from [LedgerJS](https://github.com/LedgerHQ/ledgerjs) _hw-app-eth_ and _hw-transport-u2f_ and establishes a two-way communication channel with the extension via postMessage.
The iframe code it's hosted in the same repo under the branch [gh-pages](https://github.com/MetaMask/eth-ledger-bridge-keyring/tree/gh-pages) and it's being served via github pages. In the future we might move it under the metamask.io domain.
## Usage
In addition to all the known methods from the [Keyring class protocol](https://github.com/MetaMask/eth-simple-keyring#the-keyring-class-protocol),
there are a few others:
- **isUnlocked** : Returns true if we have the public key in memory, which allows to generate the list of accounts at any time
- **unlock** : Connects to the Ledger device and exports the extended public key, which is later used to read the available ethereum addresses inside the Ledger account.
- **setAccountToUnlock** : the index of the account that you want to unlock in order to use with the signTransaction and signPersonalMessage methods
- **getFirstPage** : returns the first ordered set of accounts from the Ledger account
- **getNextPage** : returns the next ordered set of accounts from the Ledger account based on the current page
- **getPreviousPage** : returns the previous ordered set of accounts from the Ledger account based on the current page
- **forgetDevice** : removes all the device info from memory so the next interaction with the keyring will prompt the user to connect the Ledger device and export the account information
## 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.
## Attributions
This code was inspired by [eth-ledger-keyring](https://github.com/jamespic/eth-ledger-keyring) and [eth-hd-keyring](https://github.com/MetaMask/eth-hd-keyring)