From: Chris Duncan Date: Mon, 18 May 2026 13:41:55 +0000 (-0700) Subject: Adjust Ledger constants. X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=41034552a811ded62d1ef8d023eea7ce4c9379eb;p=libnemo.git Adjust Ledger constants. --- diff --git a/src/lib/ledger/account.ts b/src/lib/ledger/account.ts index f534011..ba155a6 100644 --- a/src/lib/ledger/account.ts +++ b/src/lib/ledger/account.ts @@ -1,7 +1,7 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { APDU_CODES, DERIVATION_PATH, LedgerAccountResponse, LedgerTransport, STATUS_CODES, listenTimeout, openTimeout } from '.' +import { APDU_CODES, DERIVATION_PATH, LedgerAccountResponse, LedgerTransport, STATUS_CODES, LISTEN_TIMEOUT, OPEN_TIMEOUT } from '.' import { HARDENED_OFFSET } from '../constants' import { bytes, dec } from '../convert' @@ -13,7 +13,7 @@ export async function _account (transport: LedgerTransport, index: number = 0, s const account = dec.toBytes(index + HARDENED_OFFSET, 4) const data = new Uint8Array([...DERIVATION_PATH, ...account]) - const t = await transport.create(openTimeout, listenTimeout) + const t = await transport.create(OPEN_TIMEOUT, LISTEN_TIMEOUT) const response = await t .send(APDU_CODES.class, APDU_CODES.account, show ? 1 : 0, APDU_CODES.paramUnused, data as Buffer) .catch((err: any) => dec.toBytes(err.statusCode)) diff --git a/src/lib/ledger/cache.ts b/src/lib/ledger/cache.ts index 98bd68d..fb32768 100644 --- a/src/lib/ledger/cache.ts +++ b/src/lib/ledger/cache.ts @@ -1,7 +1,7 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { APDU_CODES, LedgerResponse, LedgerTransport, STATUS_CODES, listenTimeout, openTimeout } from '.' +import { APDU_CODES, LedgerResponse, LedgerTransport, STATUS_CODES, LISTEN_TIMEOUT, OPEN_TIMEOUT } from '.' import { Account } from '../account' import { Block } from '../block' import { BIP44_COIN_NANO, BIP44_PURPOSE, HARDENED_OFFSET } from '../constants' @@ -37,7 +37,7 @@ export async function _cache (transport: LedgerTransport, index: number = 0, blo const signature = hex.toBytes(block.signature, 64) const data = new Uint8Array([APDU_CODES.bip32DerivationLevel, ...purpose, ...coin, ...account, ...previous, ...link, ...representative, ...balance, ...signature]) - const t = await transport.create(openTimeout, listenTimeout) + const t = await transport.create(OPEN_TIMEOUT, LISTEN_TIMEOUT) const response = await t .send(APDU_CODES.class, APDU_CODES.cacheBlock, APDU_CODES.paramUnused, APDU_CODES.paramUnused, data as Buffer) .then((res: Buffer) => bytes.toDec(res)) diff --git a/src/lib/ledger/close.ts b/src/lib/ledger/close.ts index 18ffd7a..3a729cb 100644 --- a/src/lib/ledger/close.ts +++ b/src/lib/ledger/close.ts @@ -1,11 +1,11 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { LedgerResponse, LedgerTransport, openTimeout, listenTimeout, APDU_CODES, STATUS_CODES } from '.' +import { LedgerResponse, LedgerTransport, OPEN_TIMEOUT, LISTEN_TIMEOUT, APDU_CODES, STATUS_CODES } from '.' import { bytes } from '../convert' export async function _close (transport: LedgerTransport): Promise { - const t = await transport.create(openTimeout, listenTimeout) + const t = await transport.create(OPEN_TIMEOUT, LISTEN_TIMEOUT) const response = await t .send(0xb0, 0xa7, APDU_CODES.paramUnused, APDU_CODES.paramUnused) .then((res: Buffer) => bytes.toDec(res)) diff --git a/src/lib/ledger/disconnect.ts b/src/lib/ledger/disconnect.ts index 4d32f9f..a6389f1 100644 --- a/src/lib/ledger/disconnect.ts +++ b/src/lib/ledger/disconnect.ts @@ -1,14 +1,14 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { ledgerVendorId } from '.' +import { LEDGER_VENDOR_ID } from '.' export async function _disconnect (): Promise { try { const hidDevices = await navigator?.hid?.getDevices?.() ?? [] const usbDevices = await navigator?.usb?.getDevices?.() ?? [] const devices = [...hidDevices, ...usbDevices] - .filter(device => device.vendorId === ledgerVendorId) + .filter(device => device.vendorId === LEDGER_VENDOR_ID) await Promise.allSettled(devices.map(device => device.forget?.() ?? Promise.resolve())) } catch (err) { console.warn('Ledger.disconnect()', err) diff --git a/src/lib/ledger/index.ts b/src/lib/ledger/index.ts index 3ed6997..969c75f 100644 --- a/src/lib/ledger/index.ts +++ b/src/lib/ledger/index.ts @@ -57,7 +57,11 @@ export const DERIVATION_PATH: Uint8Array = new Uint8Array([ * Vendor ID assigned to Ledger for HID and USB interfaces. * https://github.com/LedgerHQ/ledger-live/blob/develop/libs/ledgerjs/packages/devices/src/index.ts#L164 */ -export const ledgerVendorId: 0x2c97 = 0x2c97 +export const LEDGER_VENDOR_ID: 0x2c97 = 0x2c97 + +export const LISTEN_TIMEOUT: 30000 = 30000 + +export const OPEN_TIMEOUT: 3000 = 3000 export const STATUS_CODES: Readonly> = Object.freeze({ ...Object.fromEntries(Object.entries(StatusCodes).map(([k, v]) => [+v, k])), @@ -67,10 +71,6 @@ export const STATUS_CODES: Readonly> = Object.freeze({ 0x6a82: 'CACHE_MISS' }) -export const listenTimeout: 30000 = 30000 - -export const openTimeout: 3000 = 3000 - /** * Ledger hardware wallet created by communicating with a Ledger device via ADPU * calls. This wallet does not feature any seed nor mnemonic phrase as all @@ -368,9 +368,9 @@ export class Ledger { static async #poll (): Promise { try { const isHidPaired = (await navigator.hid?.getDevices?.() ?? []) - .some(device => device.vendorId === ledgerVendorId) + .some(device => device.vendorId === LEDGER_VENDOR_ID) const isUsbPaired = (await navigator.usb?.getDevices?.() ?? []) - .some(device => device.vendorId === ledgerVendorId) + .some(device => device.vendorId === LEDGER_VENDOR_ID) if ((this.#transport === TransportHID && isHidPaired) || (this.#transport === TransportUSB && isUsbPaired)) { await this.connect() diff --git a/src/lib/ledger/open.ts b/src/lib/ledger/open.ts index 5ffc2b6..1e6023b 100644 --- a/src/lib/ledger/open.ts +++ b/src/lib/ledger/open.ts @@ -1,12 +1,12 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { LedgerResponse, LedgerTransport, openTimeout, listenTimeout, APDU_CODES, STATUS_CODES } from '.' +import { LedgerResponse, LedgerTransport, OPEN_TIMEOUT, LISTEN_TIMEOUT, APDU_CODES, STATUS_CODES } from '.' import { bytes } from '../convert' export async function _open (transport: LedgerTransport): Promise { const name = new TextEncoder().encode('Nano') - const t = await transport.create(openTimeout, listenTimeout) + const t = await transport.create(OPEN_TIMEOUT, LISTEN_TIMEOUT) const response = await t .send(0xe0, 0xd8, APDU_CODES.paramUnused, APDU_CODES.paramUnused, name as Buffer) .then((res: Buffer) => bytes.toDec(res)) diff --git a/src/lib/ledger/sign.ts b/src/lib/ledger/sign.ts index 5bb3d26..a520822 100644 --- a/src/lib/ledger/sign.ts +++ b/src/lib/ledger/sign.ts @@ -1,7 +1,7 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { APDU_CODES, DERIVATION_PATH, LedgerSignResponse, LedgerTransport, STATUS_CODES, listenTimeout, openTimeout } from '.' +import { APDU_CODES, DERIVATION_PATH, LedgerSignResponse, LedgerTransport, STATUS_CODES, LISTEN_TIMEOUT, OPEN_TIMEOUT } from '.' import { Account } from '../account' import { Block } from '../block' import { HARDENED_OFFSET } from '../constants' @@ -38,7 +38,7 @@ export async function signBlock (transport: LedgerTransport, index: number, bloc const balance = hex.toBytes(BigInt(block.balance).toString(16), 16) const data = new Uint8Array([...DERIVATION_PATH, ...account, ...previous, ...link, ...representative, ...balance]) - const t = await transport.create(openTimeout, listenTimeout) + const t = await transport.create(OPEN_TIMEOUT, LISTEN_TIMEOUT) const response = await t .send(APDU_CODES.class, APDU_CODES.signBlock, APDU_CODES.paramUnused, APDU_CODES.paramUnused, data as Buffer) .catch((err: any) => dec.toBytes(err.statusCode)) @@ -83,7 +83,7 @@ export async function signNonce (transport: LedgerTransport, index: number, nonc const derivationAccount = dec.toBytes(index + HARDENED_OFFSET, 4) const data = new Uint8Array([...DERIVATION_PATH, ...derivationAccount, ...nonce]) - const t = await transport.create(openTimeout, listenTimeout) + const t = await transport.create(OPEN_TIMEOUT, LISTEN_TIMEOUT) const response = await t .send(APDU_CODES.class, APDU_CODES.signNonce, APDU_CODES.paramUnused, APDU_CODES.paramUnused, data as Buffer) .catch((err: any) => dec.toBytes(err.statusCode)) diff --git a/src/lib/ledger/version.ts b/src/lib/ledger/version.ts index 3315246..ccbd2b7 100644 --- a/src/lib/ledger/version.ts +++ b/src/lib/ledger/version.ts @@ -1,7 +1,7 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { APDU_CODES, LedgerResponse, LedgerTransport, STATUS_CODES, listenTimeout, openTimeout } from '.' +import { APDU_CODES, LedgerResponse, LedgerTransport, STATUS_CODES, LISTEN_TIMEOUT, OPEN_TIMEOUT } from '.' import { bytes, dec } from '../convert' import { queue } from './queue' @@ -20,7 +20,7 @@ interface LedgerVersionResponse extends LedgerResponse { export async function version (transport: LedgerTransport): Promise { return queue(async () => { try { - const t = await transport.create(openTimeout, listenTimeout) + const t = await transport.create(OPEN_TIMEOUT, LISTEN_TIMEOUT) const response = await t .send(0xb0, APDU_CODES.version, APDU_CODES.paramUnused, APDU_CODES.paramUnused) .catch((err: any) => dec.toBytes(err.statusCode))