Before considering using a library or contributing to it, it's important to understand its goals and tradeoffs (or non-goals).
Ledger Live Common is Ledger Live's business logic library.
Contributing to Ledger Live is actually likely going to happen in this library.
We can highlight this library have:
- Currency models logic: Fiat and Crypto currencies data, icons and logic (formatters, parsers,...).
- Account models logic: all helpers to display accounts and portfolio to the user.
- Hardware Wallet logic for all interaction with our devices.
- Manager logic including apps store logic and firmware updates.
- CurrencyBridge and AccountBridge logic: All the logic needed for Add Accounts (scan accounts from Ledger devices), Receive flow (get account addresses), Send flow (blockchain transactions), and beyond... (specific currency feature are possible. Tezos staking is one example)
- Countervalues logic: converting crypto currencies amount to fiat amounts.
This library does not have/is agnostic of:
- The actual HW transport you use. But you can easily find one on ledgerjs libraries (or implement your own). There are many communication channel possible: webusb, u2f, webhid, webble, node-hid, react-native-hid, react-native bluetooth,...)
- A lib-ledger-core implementation (but you can attach a binding easily)
Ledger Live is one monolithic library that glue everything together, yet things are decoupled in a way that you can still use it for specific usecase without importing everything in the final bundle.
This works by having multiple entry points.
For instance, the Manager apps logic is imported from @ledgerhq/live-common/lib/apps
and the currencies logic is in @ledgerhq/live-common/lib/currencies
.
Some of the bricks have different requirements. For instance
@ledgerhq/live-common/lib/bridge
will require you to provide a lib-ledger-core implementation (Node bindings or React Native bindings) while other utility like@ledgerhq/live-common/lib/countervalues
just requires networking and can run on the web.
Ledger Live Common is designed to have very generic models (for currencies, accounts) but to also facilitate new coin integrations and via different ways (pure JS implementation, lib-ledger-core integrations,...).
More information in Coin Integration Introduction...
We use FlowType for type safety. There are plan to eventually migrate to TypeScript but no ETA yet.
On top of Flowtype, we also use a extended set of JS incoming features like React, import syntax, class properties,... Therefore Babel is used to transpile our code from src/
folder to lib/
folder. (see
.babelrc
)
This is purely an internal technology, the target module is a regular JavaScript package and
@ledgerhq/live-common
can totally be used in JS context.
We use ESlint linter and Prettier code formatter.