]> git.codecow.com Git - libnemo.git/commitdiff
Privatize some ledger properties and rearrance them toward the bottom of the file...
authorChris Duncan <chris@zoso.dev>
Mon, 11 Aug 2025 13:00:24 +0000 (06:00 -0700)
committerChris Duncan <chris@zoso.dev>
Mon, 11 Aug 2025 13:00:24 +0000 (06:00 -0700)
src/lib/wallet/ledger.ts

index 9f471c6944c74a7389f685fffc88a325900cf745..5bfd3c6be9c0c970bc6b1743318048e432729ef9 100644 (file)
@@ -55,8 +55,8 @@ export class Ledger extends Wallet {
        static DynamicTransport: typeof TransportBLE | typeof TransportUSB | typeof TransportHID\r
        static SYMBOL: Symbol = Symbol('Ledger')\r
 \r
-       static get listenTimeout (): 30000 { return 30000 }\r
-       static get openTimeout (): 3000 { return 3000 }\r
+       static get #listenTimeout (): 30000 { return 30000 }\r
+       static get #openTimeout (): 3000 { return 3000 }\r
 \r
        /**\r
        * Check which transport protocols are supported by the browser and return the\r
@@ -105,10 +105,6 @@ export class Ledger extends Wallet {
                return Ledger.create()\r
        }\r
 \r
-       #accounts: AccountList\r
-       #status: DeviceStatus = 'DISCONNECTED'\r
-       get status (): DeviceStatus { return this.#status }\r
-\r
        private constructor () {\r
                if (!Ledger.#isInternal) {\r
                        throw new Error(`Ledger cannot be instantiated directly. Use 'await Ledger.create()' instead.`)\r
@@ -118,6 +114,8 @@ export class Ledger extends Wallet {
                this.#accounts = new AccountList()\r
        }\r
 \r
+       get status (): DeviceStatus { return this.#status }\r
+\r
        /**\r
        * Gets the public key for an account from the Ledger device.\r
        *\r
@@ -141,14 +139,15 @@ export class Ledger extends Wallet {
        * that index in the wallet.\r
        *\r
        * ```\r
-       * console.log(await wallet.accounts(5))\r
-       * // outputs sixth account of the wallet\r
-       * // {\r
-       * //   5: {\r
-       * //     privateKey: <...>,\r
-       * //     index: 5\r
-       * //   }\r
-       * // }\r
+       * const accounts = await wallet.accounts(0, 1))\r
+       *\r
+       * // outputs the first and second account of the wallet\r
+       * console.log(accounts)\r
+       * // { 0: { privateKey: <...>, index: 0 }, 1: { privateKey: <...>, index: 1 } }\r
+       *\r
+       * // individual accounts can be referenced using array index notation\r
+       * console.log(accounts[1])\r
+       * // { privateKey: <...>, index: 1 }\r
        * ```\r
        *\r
        * @param {number} from - Start index of secret keys. Default: 0\r
@@ -210,7 +209,7 @@ export class Ledger extends Wallet {
                } else {\r
                        this.#status = 'BUSY'\r
                }\r
-               return this.status\r
+               return this.#status\r
        }\r
 \r
        /**\r
@@ -407,28 +406,8 @@ export class Ledger extends Wallet {
                return await this.#version()\r
        }\r
 \r
-       /**\r
-       * Open the Nano app by launching a user flow.\r
-       *\r
-       * https://developers.ledger.com/docs/connectivity/ledgerJS/open-close-info-on-apps#open-application\r
-       *\r
-       * This command resets the internal USB connection of the device which can\r
-       * cause subsequent commands to fail if called too quickly. A one-second delay\r
-       * is implemented in this method to mitigate the issue.\r
-       *\r
-       * https://github.com/LedgerHQ/ledger-live/issues/4964#issuecomment-1878361157\r
-       *\r
-       * @returns Status of command\r
-       */\r
-       async #open (): Promise<LedgerResponse> {\r
-               const name = new TextEncoder().encode('Nano')\r
-               const transport = await Ledger.DynamicTransport.create(Ledger.openTimeout, Ledger.listenTimeout)\r
-               const response = await transport\r
-                       .send(0xe0, 0xd8, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused, name as Buffer)\r
-                       .then(res => bytes.toDec(res))\r
-                       .catch(err => err.statusCode) as number\r
-               return new Promise(r => setTimeout(r, 1000, { status: Ledger.#STATUS_CODES[response] }))\r
-       }\r
+       #accounts: AccountList\r
+       #status: DeviceStatus = 'DISCONNECTED'\r
 \r
        /**\r
        * Close the currently running app and return to the device dashboard.\r
@@ -444,7 +423,7 @@ export class Ledger extends Wallet {
        * @returns Status of command\r
        */\r
        async #close (): Promise<LedgerResponse> {\r
-               const transport = await Ledger.DynamicTransport.create(Ledger.openTimeout, Ledger.listenTimeout)\r
+               const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout)\r
                const response = await transport\r
                        .send(0xb0, 0xa7, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused)\r
                        .then(res => bytes.toDec(res))\r
@@ -464,7 +443,7 @@ export class Ledger extends Wallet {
                const account = dec.toBytes(index + HARDENED_OFFSET, 4)\r
                const data = new Uint8Array([...Ledger.#DERIVATION_PATH, ...account])\r
 \r
-               const transport = await Ledger.DynamicTransport.create(Ledger.openTimeout, Ledger.listenTimeout)\r
+               const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout)\r
                const response = await transport\r
                        .send(Ledger.#ADPU_CODES.class, Ledger.#ADPU_CODES.account, show ? 1 : 0, Ledger.#ADPU_CODES.paramUnused, data as Buffer)\r
                        .catch(err => dec.toBytes(err.statusCode)) as Uint8Array\r
@@ -521,7 +500,7 @@ export class Ledger extends Wallet {
                const signature = hex.toBytes(block.signature, 64)\r
                const data = new Uint8Array([Ledger.#ADPU_CODES.bip32DerivationLevel, ...purpose, ...coin, ...account, ...previous, ...link, ...representative, ...balance, ...signature])\r
 \r
-               const transport = await Ledger.DynamicTransport.create(Ledger.openTimeout, Ledger.listenTimeout)\r
+               const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout)\r
                const response = await transport\r
                        .send(Ledger.#ADPU_CODES.class, Ledger.#ADPU_CODES.cacheBlock, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused, data as Buffer)\r
                        .then(res => bytes.toDec(res))\r
@@ -531,6 +510,29 @@ export class Ledger extends Wallet {
                return { status: Ledger.#STATUS_CODES[response] }\r
        }\r
 \r
+       /**\r
+       * Open the Nano app by launching a user flow.\r
+       *\r
+       * https://developers.ledger.com/docs/connectivity/ledgerJS/open-close-info-on-apps#open-application\r
+       *\r
+       * This command resets the internal USB connection of the device which can\r
+       * cause subsequent commands to fail if called too quickly. A one-second delay\r
+       * is implemented in this method to mitigate the issue.\r
+       *\r
+       * https://github.com/LedgerHQ/ledger-live/issues/4964#issuecomment-1878361157\r
+       *\r
+       * @returns Status of command\r
+       */\r
+       async #open (): Promise<LedgerResponse> {\r
+               const name = new TextEncoder().encode('Nano')\r
+               const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout)\r
+               const response = await transport\r
+                       .send(0xe0, 0xd8, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused, name as Buffer)\r
+                       .then(res => bytes.toDec(res))\r
+                       .catch(err => err.statusCode) as number\r
+               return new Promise(r => setTimeout(r, 1000, { status: Ledger.#STATUS_CODES[response] }))\r
+       }\r
+\r
        /**\r
        * Sign a block with the Ledger device.\r
        *\r
@@ -556,7 +558,7 @@ export class Ledger extends Wallet {
                const balance = hex.toBytes(BigInt(block.balance).toString(16), 16)\r
                const data = new Uint8Array([...Ledger.#DERIVATION_PATH, ...account, ...previous, ...link, ...representative, ...balance])\r
 \r
-               const transport = await Ledger.DynamicTransport.create(Ledger.openTimeout, Ledger.listenTimeout)\r
+               const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout)\r
                const response = await transport\r
                        .send(Ledger.#ADPU_CODES.class, Ledger.#ADPU_CODES.signBlock, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused, data as Buffer)\r
                        .catch(err => dec.toBytes(err.statusCode)) as Uint8Array\r
@@ -597,7 +599,7 @@ export class Ledger extends Wallet {
                const derivationAccount = dec.toBytes(index + HARDENED_OFFSET, 4)\r
                const data = new Uint8Array([...Ledger.#DERIVATION_PATH, ...derivationAccount, ...nonce])\r
 \r
-               const transport = await Ledger.DynamicTransport.create(Ledger.openTimeout, Ledger.listenTimeout)\r
+               const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout)\r
                const response = await transport\r
                        .send(Ledger.#ADPU_CODES.class, Ledger.#ADPU_CODES.signNonce, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused, data as Buffer)\r
                        .catch(err => dec.toBytes(err.statusCode)) as Uint8Array\r
@@ -626,7 +628,7 @@ export class Ledger extends Wallet {
        * @returns Status, process name, and version\r
        */\r
        async #version (): Promise<LedgerVersionResponse> {\r
-               const transport = await Ledger.DynamicTransport.create(Ledger.openTimeout, Ledger.listenTimeout)\r
+               const transport = await Ledger.DynamicTransport.create(Ledger.#openTimeout, Ledger.#listenTimeout)\r
                const response = await transport\r
                        .send(0xb0, Ledger.#ADPU_CODES.version, Ledger.#ADPU_CODES.paramUnused, Ledger.#ADPU_CODES.paramUnused)\r
                        .catch(err => dec.toBytes(err.statusCode)) as Uint8Array\r