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
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
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
* 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
} else {\r
this.#status = 'BUSY'\r
}\r
- return this.status\r
+ return this.#status\r
}\r
\r
/**\r
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
* @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
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
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
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
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
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
* @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