From: Chris Duncan Date: Mon, 15 Sep 2025 14:44:08 +0000 (-0700) Subject: Privatize Ledger transport. X-Git-Tag: v0.10.5~14^2~21 X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=d0ef1d6da092fcce4230710452f33572ab829ebc;p=libnemo.git Privatize Ledger transport. --- diff --git a/src/lib/wallet/ledger.ts b/src/lib/wallet/ledger.ts index dbe4e35..311faaa 100644 --- a/src/lib/wallet/ledger.ts +++ b/src/lib/wallet/ledger.ts @@ -25,6 +25,7 @@ export class Ledger { static #listenTimeout: 30000 = 30000 static #openTimeout: 3000 = 3000 static #status: DeviceStatus = 'DISCONNECTED' + static #transport: typeof TransportHID | typeof TransportBLE | typeof TransportUSB static #ADPU_CODES: { [key: string]: number } = Object.freeze({ class: 0xa1, bip32DerivationLevel: 0x03, @@ -54,8 +55,7 @@ export class Ledger { 0x9000: 'OK' }) - static DynamicTransport: typeof TransportHID | typeof TransportBLE | typeof TransportUSB - static UsbVendorId: typeof ledgerUSBVendorId = ledgerUSBVendorId + static get UsbVendorId (): typeof ledgerUSBVendorId { return ledgerUSBVendorId } /** * Check which transport protocols are supported by the browser and return the @@ -64,15 +64,15 @@ export class Ledger { static get isUnsupported (): boolean { console.log('Checking browser Ledger support...') if (typeof globalThis.navigator?.hid?.getDevices === 'function') { - this.DynamicTransport = TransportHID + this.#transport ??= TransportHID return false } if (typeof globalThis.navigator?.bluetooth?.getDevices === 'function') { - this.DynamicTransport = TransportBLE + this.#transport ??= TransportBLE return false } if (typeof globalThis.navigator?.usb?.getDevices === 'function') { - this.DynamicTransport = TransportUSB + this.#transport ??= TransportUSB return false } return true @@ -97,7 +97,7 @@ export class Ledger { const account = dec.toBytes(index + HARDENED_OFFSET, 4) const data = new Uint8Array([...Ledger.#DERIVATION_PATH, ...account]) - const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout) + const transport = await Ledger.#transport.create(Ledger.#openTimeout, Ledger.#listenTimeout) const response = await transport .send(Ledger.#ADPU_CODES.class, Ledger.#ADPU_CODES.account, show ? 1 : 0, Ledger.#ADPU_CODES.paramUnused, data as Buffer) .catch(err => dec.toBytes(err.statusCode)) as Uint8Array @@ -316,7 +316,7 @@ export class Ledger { const signature = hex.toBytes(block.signature, 64) const data = new Uint8Array([Ledger.#ADPU_CODES.bip32DerivationLevel, ...purpose, ...coin, ...account, ...previous, ...link, ...representative, ...balance, ...signature]) - const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout) + const transport = await Ledger.#transport.create(Ledger.#openTimeout, Ledger.#listenTimeout) const response = await transport .send(Ledger.#ADPU_CODES.class, Ledger.#ADPU_CODES.cacheBlock, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused, data as Buffer) .then(res => bytes.toDec(res)) @@ -340,7 +340,7 @@ export class Ledger { * @returns Status of command */ static async #close (): Promise { - const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout) + const transport = await Ledger.#transport.create(Ledger.#openTimeout, Ledger.#listenTimeout) const response = await transport .send(0xb0, 0xa7, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused) .then(res => bytes.toDec(res)) @@ -405,7 +405,7 @@ export class Ledger { */ static async #open (): Promise { const name = new TextEncoder().encode('Nano') - const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout) + const transport = await Ledger.#transport.create(Ledger.#openTimeout, Ledger.#listenTimeout) const response = await transport .send(0xe0, 0xd8, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused, name as Buffer) .then(res => bytes.toDec(res)) @@ -438,7 +438,7 @@ export class Ledger { const balance = hex.toBytes(BigInt(block.balance).toString(16), 16) const data = new Uint8Array([...Ledger.#DERIVATION_PATH, ...account, ...previous, ...link, ...representative, ...balance]) - const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout) + const transport = await Ledger.#transport.create(Ledger.#openTimeout, Ledger.#listenTimeout) const response = await transport .send(Ledger.#ADPU_CODES.class, Ledger.#ADPU_CODES.signBlock, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused, data as Buffer) .catch(err => dec.toBytes(err.statusCode)) as Uint8Array @@ -479,7 +479,7 @@ export class Ledger { const derivationAccount = dec.toBytes(index + HARDENED_OFFSET, 4) const data = new Uint8Array([...Ledger.#DERIVATION_PATH, ...derivationAccount, ...nonce]) - const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout) + const transport = await Ledger.#transport.create(Ledger.#openTimeout, Ledger.#listenTimeout) const response = await transport .send(Ledger.#ADPU_CODES.class, Ledger.#ADPU_CODES.signNonce, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused, data as Buffer) .catch(err => dec.toBytes(err.statusCode)) as Uint8Array @@ -508,7 +508,7 @@ export class Ledger { * @returns Status, process name, and version */ static async #version (): Promise { - const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout) + const transport = await Ledger.#transport.create(Ledger.#openTimeout, Ledger.#listenTimeout) const response = await transport .send(0xb0, Ledger.#ADPU_CODES.version, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused) .catch(err => dec.toBytes(err.statusCode)) as Uint8Array