Crate ledger_lib

source ·
Expand description

A Ledger hardware wallet communication library

Device provides a high-level API for exchanging APDUs with Ledger devices using the ledger_proto traits. This is suitable for extension with application-specific interface traits, and automatically implemented over Exchange for low-level byte exchange with devices.

LedgerProvider and LedgerHandle provide a high-level tokio-compatible Transport for application integration, supporting connecting to and interacting with ledger devices. This uses a pinned thread to avoid thread safety issues with hidapi and async executors.

Low-level Transport implementations are provided for USB/HID, BLE and TCP, with a Generic implementation providing a common interface over all enabled transports.

Safety

Transports are currently marked as Send due to limitations of async_trait and are NOT all thread safe. If you’re calling this from an async context, please use LedgerProvider.

This will be corrected when the unstable async trait feature is stabilised, which until then can be opted-into using the unstable_async_trait feature

Examples

use ledger_lib::{LedgerProvider, Filters, Transport, Device, DEFAULT_TIMEOUT};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Fetch provider handle
    let mut provider = LedgerProvider::init().await;

    // List available devices
    let devices = provider.list(Filters::Any).await?;

    // Check we have -a- device to connect to
    if devices.is_empty() {
        return Err(anyhow::anyhow!("No devices found"));
    }

    // Connect to the first device
    let mut ledger = provider.connect(devices[0].clone()).await?;

    // Request device information
    let info = ledger.app_info(DEFAULT_TIMEOUT).await?;
    println!("info: {info:?}");

    Ok(())
}

Re-exports

Modules

  • Device information types and connection filters
  • Low-level transport implementations for communication with ledger devices and nano apps

Structs

Enums

  • Ledger interface error type
  • Device discovery filter

Constants

Traits

  • Device provides a high-level interface exchanging APDU objects with implementers of Exchange
  • Exchange trait provides a low-level interface for byte-wise exchange of APDU commands with a ledger devices