Awesome
We are hiring, join us! šØāš»š©āš»
Ledger Live (desktop)
- Related: ledger-live-mobile
- Backed by: ledger-live-common
<a href="https://github.com/LedgerHQ/ledger-live-desktop/releases"> <p align="center"> <img src="/docs/screenshot.png" width="550"/> </p> </a>Ledger Live is a new generation wallet desktop application providing a unique interface to maintain multiple cryptocurrencies for your Ledger Nano S / Blue. Manage your device, create accounts, receive and send cryptoassets, ...and many more.
Architecture
Ledger Live is an hybrid desktop application built with Electron, React, Redux, RxJS,.. and highly optimized with ledger-core C++ library to deal with blockchains (sync, broadcast,..) via ledger-core-node-bindings. It communicates to Ledger hardware wallet devices (Nano X / Nano S / Blue) to verify address and sign transactions with ledgerjs. Some logic is shared with live-common.
<p align="center"> <img src="/docs/architecture.png" width="550"/> </p>Download
The latest stable release is available on ledger.com/ledger-live.
Previous versions and pre-releases can be downloaded on here from the Releases section.
Compatibility
- macOS 10.14+
- Windows 8.1+ (x64)
- Linux (x64)
Signed hashes
Ledger Live releases are signed. The automatic update mechanism makes use of the signature to verify that each subsequent update is authentic. Instructions for verifying the hash and signatures of the installation packages are available on this page, which will be integrated into the official download page.
Development
Setup
Requirements
- NodeJS
lts/fermium
(Node 14.x) - Yarn 1.x (Classic)
- Python 2.7 or 3.5+
- A C/C++ toolchain (see node-gyp documentation)
- On Linux:
sudo apt-get update && sudo apt-get install libudev-dev libusb-1.0-0-dev
Install
# install dependencies
yarn
Run
# launch the app
yarn start
Build
# Build & package the whole app
# Creates a .dmg for Mac, .exe installer for Windows, or .AppImage for Linux
# Output files will be created in dist/ folder
yarn dist
Debug
If you are using Visual Studio Code IDE, here is a Launch Configuration that should allow you to run and debug the main process as well as the render process of the application.
As stated in the debugging documentation, this file should be named launch.json
and located under the .vscode
folder.
{
"version": "0.2.0",
"compounds": [
{
"name": "Run and Debug LLD",
"configurations": ["Debug Main Process", "Debug Renderer Process"],
"stopAll": true
}
],
"configurations": [
{
"name": "Debug Main Process",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}",
"runtimeExecutable": "yarn",
"args": ["start"],
"outputCapture": "std",
"resolveSourceMapLocations": null,
"env": {
"ELECTRON_ARGS": "--remote-debugging-port=8315"
}
},
{
"name": "Debug Renderer Process",
"type": "chrome",
"request": "attach",
"address": "localhost",
"port": 8315,
"timeout": 60000
}
]
}
Config (optional helpers)
Environment variables
(you can use a .env or export environment variables)
NO_DEBUG_COMMANDS=1
NO_DEBUG_DB=1
NO_DEBUG_ACTION=1
NO_DEBUG_TAB_KEY=1
NO_DEBUG_NETWORK=1
NO_DEBUG_ANALYTICS=1
NO_DEBUG_WS=1
NO_DEBUG_DEVICE=1
NO_DEBUG_COUNTERVALUES=1
other envs can be seen in live-common:src/env.js
Run tests
In a terminal you need to have webpack dev server running
yarn start
In an other terminal you need to launch the webdriver/electron container. First run will be slow. Next ones will be fast unless some changes are made to the container or package.json. You need to kill and re run the command if package.json changed. Make sure you are running Docker.
yarn start-electron-webdriver
You can point VNCViewer to localhost::5900
to check what is happening in the container. secret
is the password.
Then you can launch tests.
yarn spectron
or
node_modules/.bin/jest tests/specs/<FILEREGEX>.spec.js
By default it uses --runInBand jest option otherwise it explodes!
If you need to create an app.json, run a test that set up what you need and run it with the env var SPECTRON_DUMP_APP_JSON
set. It will create tests/dump.json
at the end of the spec.
Please put the image expectations at the end of the it(...) tests so that it does not break the whole flow if a snapshot breaks
Run code quality checks
yarn ci
File structure
src
āāā main : the main process is the mother of all process. it boots internal and renderer process and starts the window.
āāā internal : related to internal thread that runs commands, device logic, libcore,..
āāā renderer : everything related to the UI.
āĀ Ā āāā screens
āĀ Ā āāā modals
āĀ Ā āāā components : all components that are not screens or modals, flattened.
āĀ Ā āāā animations
āĀ Ā āāā icons
āĀ Ā āāā images
āĀ Ā āāā styles
āĀ Ā āāā bridge : logic related to interacting with accounts and currencies.
āĀ Ā āāā families : per currency specific logic and components
āĀ Ā āāā actions : redux actions
āĀ Ā āāā reducers : redux reducers
āĀ Ā āāā middlewares
āĀ Ā āāā analytics
āĀ Ā āāā fonts
āĀ Ā āāā hooks
āĀ Ā āāā i18n : all translation files
āĀ Ā āāā index.html : html point point
āĀ Ā āāā index.js : js entry point
āĀ Ā āāā init.js : initialize the rendering
āĀ Ā āāā live-common-setup.js : set up live-common for renderer specific parts
āĀ Ā āāā ... other files related to renderer
āāā config : constants files. DEPRECATED. will be moved to live-common.
āāā helpers : helpers. DEPRECATED. will be moved to live-common or in relevant places.
āāā live-common-set-supported-currencies.js : generic set up of supported coins
āāā live-common-setup.js : generic set up of live-common
āāā logger : internal logging library. used by all thread. produces the "export logs".
āāā network.js : network implementation. will eventually move back to live-common.
āāā sentry : related to bug report API
Localization / Translations
Translations from English to other languages are handled internally so it is not possible to directly contribute to them, however if you spot a bug (e.g. a wrong variable name) or any issue in translation files, feel free to report a bug to Ledger's support team and it will be taken care of.