# Ledger Bitcoin application client Client library in [Rust](https://www.rust-lang.org/) for the Ledger Bitcoin application with minimal dependencies. If you wish to contribute to this library, please read [CONTRIBUTING.md](CONTRIBUTING.md). ## Minimum Supported Rust Version `bitcoin_client_rs` should always compile using **Rust 1.60**. ## Getting started The `client::BitcoinClient` struct implements the methods that call and interpret the commands between the Ledger device and your software. ```rust pub struct BitcoinClient {...} impl BitcoinClient { pub fn get_extended_pubkey( &self, path: &bitcoin::util::bip32::DerivationPath, display: bool, ) -> Result>; } ``` It requires an internal connection implementing the `client::Transport` Trait. ```rust pub trait Transport { type Error: Debug; fn exchange(&self, command: &APDUCommand) -> Result<(StatusWord, Vec), Self::Error>; } ``` In order to satisfy this Trait, it is possible to import the `ledger-transport-hid` crate from https://github.com/Zondax/ledger-rs. Please, read the `examples/ledger_hwi/src/transport.rs` file to find an example. ## The `async` feature The optional feature `async` adds the `async_client` module to the crate and imports the `async_trait` library. The `async_client::BitcoinClient` struct is an asynchronous equivalent to the `BitcoinClient` struct. It requires an internal connection implementing the `async_client::Transport` Trait. ```rust #[async_trait] pub trait Transport { type Error: Debug; async fn exchange(&self, command: &APDUCommand) -> Result<(StatusWord, Vec), Self::Error>; } ``` ## The `no-std` support Work in progress. ## Example The code source for a simple tool to communicate with either a Ledger device or Speculos emulator can be found in the `examples` directory. Example of a command to retrieve the extended pubkey with the given derivation path and display it on the device screen: ``` cargo run --package ledger_hwi -- \ get-extended-pubkey --derivation-path "m/44'/0'/0'/0/0" --display ```