Node Speculos

This page is an extract from the repository

Sections in this article

This is a package for the Speculos Nano emulator.

Install the package

yarn add @ledgerhq/hw-transport-node-speculos

Getting started

  • Install Speculos.
  • Make sure to have a Speculos running with a APDU port and (optionally) a buttons port available.
import SpeculosTransport from "@ledgerhq/hw-transport-node-speculos";

const apduPort = 40000;

async function exampleSimple() {
  const transport = await SpeculosTransport.open({ apduPort });
  const res = await transport.send(0xE0, 0x01, 0x00, 0x00);
}

async function exampleAdvanced() {
  const transport = await SpeculosTransport.open({ apduPort });
  setTimeout(() => {
    // in 1s i'll click on right button and release
    transport.button("Rr");
  }, 1000); // 1s is a tradeoff here. In future, we need to be able to "await & expect a text" but that will need a feature from speculos to notify us when text changes.
  // derivate btc address and ask for device verification
  const res = await transport.send(0xE0, 0x40, 0x01, 0x00, Buffer.from("058000002c8000000080000000000000000000000f"));
}

With ledger-live CLI

It’s working with SPECULOS_APDU_PORT and SPECULOS_HOST envs.

SPECULOS_APDU_PORT=40000 ledger-live sync -c btc

# starts an http proxy with speculos (http proxy that works with LLD and LLM)
SPECULOS_APDU_PORT=40000 ledger-live proxy

To make it work with Docker, you need to expose some port and do this:

docker run -it -p 40000:40000 -v "$(pwd)"/apps:/speculos/apps speculos /bin/bash

$ pipenv shell
$ ./speculos.py -m nanos ./apps/btc.elf --sdk 1.6 --seed "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" --display headless --apdu-port 40000

API

SpeculosTransportOpts

Type: {apduPort: number, buttonPort: number?, automationPort: number?, host: string?}

Properties

SpeculosTransport

Extends Transport

Speculos TCP transport implementation

Parameters

Examples

import SpeculosTransport from "@ledgerhq/hw-transport-node-speculos";
const transport = await SpeculosTransport.open({ apduPort });
const res = await transport.send(0xE0, 0x01, 0, 0);

button

Send a speculos button command typically “Ll” would press and release the left button typically “Rr” would press and release the right button

Parameters

  • command any

Returns Promise<void>

open

Parameters

Returns Promise<SpeculosTransport>


Did you find this page helpful?

What would you like to see here?
Node Hid Singleton
React native HID
Getting Started
Theme Features
Customization