@ledgerhq/hw-transport-node-speculos
v6.29.4
Published
Ledger Hardware Wallet communication layer with speculos Nano simulator
Downloads
1,768
Readme
@ledgerhq/hw-transport-node-speculos
A transport for https://github.com/LedgerHQ/speculos Nano simulator.
GitHub, Ledger Devs Discord, Developer Portal
Getting started
- Install https://github.com/LedgerHQ/speculos
- Make sure to have a speculos running with an 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, I had 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
Table of Contents
SpeculosTransportOpts
Type: {apduPort: number, buttonPort: number?, automationPort: number?, host: string?}
Properties
SpeculosTransport
Extends Transport
Speculos TCP transport implementation
Parameters
apduSocket
net.Socketopts
SpeculosTransportOpts
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>