diff --git a/README.md b/README.md
index cd6d673..79bcad5 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,39 @@
-# @wharfkit/wallet-plugin-template
+# @wharfkit/wallet-plugin-ledger
-A template to create a `WalletPlugin` for use within the `@wharfkit/session` library.
+A Ledger hardware wallet plugin for use within the `@wharfkit/session` library.
+
+## Overview
+
+This plugin allows users to interact with their Ledger hardware wallet to sign transactions on supported blockchains. It supports various connection methods including WebUSB, WebHID, WebBLE, and node-hid (for Node.js environments).
+
+## Features
+
+- Connect to Ledger devices using multiple transport methods (WebUSB, WebHID, WebBLE)
+- Support for EOSIO-based blockchains
+- Secure transaction signing with Ledger hardware devices
+- Compatible with @wharfkit/session
## Usage
-- [Use this as a template.](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)
-- Write your wallet plugin's logic.
-- Publish it on Github or npmjs.com
-- Include it in your project and use it.
+```typescript
+import { SessionKit } from '@wharfkit/session'
+import { WalletPluginLedger } from '@wharfkit/wallet-plugin-ledger'
+
+// Create a new SessionKit with the Ledger wallet plugin
+const kit = new SessionKit({
+ appName: 'My App',
+ chains: [...],
+ walletPlugins: [
+ new WalletPluginLedger()
+ ]
+})
+
+// Login with Ledger
+const { session } = await kit.login()
+
+// Sign transactions
+const result = await session.transact(...)
+```
## Developing
diff --git a/package.json b/package.json
index a1af369..00adb44 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
{
- "name": "@wharfkit/wallet-plugin-template",
- "description": "A template to create wallet plugins for use with @wharfkit/session.",
- "version": "1.1.0",
- "homepage": "https://github.com/wharfkit/wallet-plugin-template",
+ "name": "@wharfkit/wallet-plugin-ledger",
+ "description": "A Ledger hardware wallet plugin for use with @wharfkit/session.",
+ "version": "0.1.0",
+ "homepage": "https://github.com/wharfkit/wallet-plugin-ledger",
"license": "BSD-3-Clause",
- "main": "lib/wallet-plugin-template.js",
- "module": "lib/wallet-plugin-template.m.js",
- "types": "lib/wallet-plugin-template.d.ts",
+ "main": "lib/wallet-plugin-ledger.js",
+ "module": "lib/wallet-plugin-ledger.m.js",
+ "types": "lib/wallet-plugin-ledger.d.ts",
"sideEffects": false,
"files": [
"lib/*",
@@ -16,6 +16,10 @@
"prepare": "make"
},
"dependencies": {
+ "@ledgerhq/hw-transport-node-hid": "^6.27.1",
+ "@ledgerhq/hw-transport-web-ble": "^6.27.1",
+ "@ledgerhq/hw-transport-webhid": "^6.27.1",
+ "@ledgerhq/hw-transport-webusb": "^6.27.1",
"tslib": "^2.1.0"
},
"peerDependencies": {
@@ -31,7 +35,7 @@
"@rollup/plugin-virtual": "^2.0.3",
"@types/chai": "^4.3.1",
"@types/mocha": "^9.0.0",
- "@types/node": "^18.7.18",
+ "@types/node": "^22.15.12",
"@typescript-eslint/eslint-plugin": "^5.20.0",
"@typescript-eslint/parser": "^5.20.0",
"@wharfkit/mock-data": "^1.2.0",
diff --git a/src/index.ts b/src/index.ts
index fbe961e..8841e21 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,3 +1,5 @@
+///
+
import {
AbstractWalletPlugin,
Checksum256,
@@ -13,7 +15,46 @@ import {
WalletPluginSignResponse,
} from '@wharfkit/session'
-export class WalletPluginTEMPLATE extends AbstractWalletPlugin implements WalletPlugin {
+// Import Ledger Transport classes
+import TransportWebUSB from '@ledgerhq/hw-transport-webusb'
+import TransportWebHID from '@ledgerhq/hw-transport-webhid'
+import TransportWebBLE from '@ledgerhq/hw-transport-web-ble'
+import TransportNodeHID from '@ledgerhq/hw-transport-node-hid'
+import Transport from '@ledgerhq/hw-transport'
+
+// Re-export Transport libraries
+export {TransportWebUSB, TransportWebHID, TransportWebBLE, TransportNodeHID}
+
+// Ledger app communication constants
+const CLA = 0xd4
+const INS = {
+ GET_APP_CONFIGURATION: 0x01,
+ GET_PUBLIC_KEY: 0x02,
+ SIGN_TRANSACTION: 0x04,
+}
+
+// Error messages
+const ERROR_MESSAGES = {
+ DEVICE_NOT_CONNECTED: 'Ledger device not connected',
+ APP_NOT_OPEN: 'EOS application not open on Ledger device',
+ USER_REJECTED: 'Transaction was rejected by the user',
+ TIMEOUT: 'Operation timed out',
+}
+
+// Config interface for the Ledger wallet plugin
+export interface WalletPluginLedgerOptions {
+ // Optional parameters
+ transport?: Transport
+ transportType?: 'WebUSB' | 'WebHID' | 'WebBLE' | 'NodeHID'
+ timeout?: number
+}
+
+// Wrapper for Ledger responses
+interface LedgerResponse {
+ data: Buffer
+}
+
+export class WalletPluginLedger extends AbstractWalletPlugin implements WalletPlugin {
/**
* The logic configuration for the wallet plugin.
*/
@@ -22,66 +63,250 @@ export class WalletPluginTEMPLATE extends AbstractWalletPlugin implements Wallet
requiresChainSelect: true,
// Should the user interface display a permission selector?
- requiresPermissionSelect: false,
-
- // Optionally specify if this plugin only works with specific blockchains.
- // supportedChains: ['73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d']
+ requiresPermissionSelect: true,
}
+
/**
* The metadata for the wallet plugin to be displayed in the user interface.
*/
readonly metadata: WalletPluginMetadata = WalletPluginMetadata.from({
- name: 'Wallet Plugin Template',
- description: 'A template that can be used to build wallet plugins!',
- logo: 'base_64_encoded_image',
- homepage: 'https://someplace.com',
- download: 'https://someplace.com/download',
+ name: 'Ledger Hardware Wallet',
+ description: 'Use your Ledger hardware wallet to sign transactions securely.',
+ logo: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBQcm8gNi40LjAgYnkgQGZvbnRhd2Vzb21lIC0gaHR0cHM6Ly9mb250YXdlc29tZS5jb20gTGljZW5zZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tL2xpY2Vuc2UgKENvbW1lcmNpYWwgTGljZW5zZSkgQ29weXJpZ2h0IDIwMjMgRm9udGljb25zLCBJbmMuIC0tPjxwYXRoIGQ9Ik00MDAgMjU2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyIC0zMi0xNC4zLTMyLTMyIDMyIDE0LjMgMzIgMzJoNTZsLTMyIDE5MkgzMlYzMmgyODhMMzQ0IDIyNGg1NnpNNDQgMEMyOS43IDAgMTguMSAxMi44IDE2LjEgMjcuMUwwIDMwNy4yYy0uNiA0LjUuOCA5IDMuOCAxMi42QzcuMiAzMjMuMyAxMS41IDMyNiAxNiAzMjZoNDE2YzQuNSAwIDguOC0yLjcgMTAuNy02LjIgMy01LjYgNC4xLTguMSAzLjgtMTIuNkw0MzEuOSAyNy4xQzQyOS45IDEyLjggNDE4LjMgMCA0MDQgMEg0NHoiLz48L3N2Zz4=',
+ homepage: 'https://www.ledger.com',
+ download: 'https://www.ledger.com/ledger-live',
})
+
+ private transport?: Transport
+ private transportType: 'WebUSB' | 'WebHID' | 'WebBLE' | 'NodeHID'
+ private timeout: number
+
+ /**
+ * Constructor for the Ledger wallet plugin
+ */
+ constructor(options: WalletPluginLedgerOptions = {}) {
+ super()
+ this.transport = options.transport
+ this.transportType = options.transportType || 'WebUSB'
+ this.timeout = options.timeout || 30000 // Default 30 seconds timeout
+ }
+
/**
* A unique string identifier for this wallet plugin.
- *
- * It's recommended this is all lower case, no spaces, and only URL-friendly special characters (dashes, underscores, etc)
*/
get id(): string {
- return 'wallet-plugin-template'
+ return 'wallet-plugin-ledger'
}
+
/**
- * Performs the wallet logic required to login and return the chain and permission level to use.
- *
- * @param options WalletPluginLoginOptions
- * @returns Promise
+ * Create or get the transport instance based on the transport type
*/
- // TODO: Remove these eslint rule modifiers when you are implementing this method.
- /* eslint-disable @typescript-eslint/no-unused-vars */
- async login(context: LoginContext): Promise {
- // Example response...
- return {
- chain: Checksum256.from(
- '73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d'
- ),
- permissionLevel: PermissionLevel.from('wharfkit1111@test'),
+ private async getTransport(): Promise {
+ if (this.transport) {
+ return this.transport
+ }
+
+ try {
+ switch (this.transportType) {
+ case 'WebUSB':
+ return await TransportWebUSB.create()
+ case 'WebHID':
+ return await TransportWebHID.create()
+ case 'WebBLE':
+ return await TransportWebBLE.create()
+ case 'NodeHID':
+ return await TransportNodeHID.create()
+ default:
+ return await TransportWebUSB.create()
+ }
+ } catch (error) {
+ throw new Error(ERROR_MESSAGES.DEVICE_NOT_CONNECTED)
}
}
+
+ /**
+ * Helper function to wrap a buffer in a LedgerResponse format
+ */
+ private wrapResponse(buffer: Buffer): LedgerResponse {
+ return {data: buffer}
+ }
+
+ /**
+ * Get the app configuration from the Ledger device
+ */
+ private async getAppConfiguration(transport: Transport): Promise<{version: string}> {
+ try {
+ const responseBuffer = await transport.send(CLA, INS.GET_APP_CONFIGURATION, 0x00, 0x00)
+ const response = this.wrapResponse(responseBuffer)
+ const version = `${response.data[0]}.${response.data[1]}.${response.data[2]}`
+ return {version}
+ } catch (error) {
+ throw new Error(ERROR_MESSAGES.APP_NOT_OPEN)
+ }
+ }
+
+ /**
+ * Get a public key from the Ledger device
+ */
+ private async getPublicKey(
+ transport: Transport,
+ bip32Path: string,
+ display: boolean = false
+ ): Promise<{publicKey: string}> {
+ const paths = bip32Path.split('/')
+ const buffer = Buffer.alloc(1 + paths.length * 4)
+ buffer[0] = paths.length
+
+ paths.forEach((element, index) => {
+ let value = parseInt(element, 10)
+ if (isNaN(value)) {
+ value = parseInt(element.replace("'", ''), 10) | 0x80000000
+ }
+ buffer.writeUInt32BE(value, 1 + 4 * index)
+ })
+
+ const p1 = display ? 0x01 : 0x00
+ const responseBuffer = await transport.send(CLA, INS.GET_PUBLIC_KEY, p1, 0x00, buffer)
+ const response = this.wrapResponse(responseBuffer)
+ const keyLength = response.data[0]
+ const publicKey = response.data.slice(1, 1 + keyLength).toString('hex')
+
+ return {publicKey}
+ }
+
+ /**
+ * Sign a transaction with the Ledger device
+ */
+ private async signTransaction(
+ transport: Transport,
+ bip32Path: string,
+ transactionData: Buffer
+ ): Promise<{signature: string}> {
+ const paths = bip32Path.split('/')
+ const pathBuffer = Buffer.alloc(1 + paths.length * 4)
+ pathBuffer[0] = paths.length
+
+ paths.forEach((element, index) => {
+ let value = parseInt(element, 10)
+ if (isNaN(value)) {
+ value = parseInt(element.replace("'", ''), 10) | 0x80000000
+ }
+ pathBuffer.writeUInt32BE(value, 1 + 4 * index)
+ })
+
+ // First, send the path
+ await transport.send(CLA, INS.SIGN_TRANSACTION, 0x00, 0x00, pathBuffer)
+
+ // Send transaction data in chunks of 255 bytes
+ const MAX_CHUNK_SIZE = 255
+ let offset = 0
+
+ while (offset < transactionData.length) {
+ const chunkSize = Math.min(MAX_CHUNK_SIZE, transactionData.length - offset)
+ const p1 = offset + chunkSize === transactionData.length ? 0x80 : 0x00
+ const chunk = transactionData.slice(offset, offset + chunkSize)
+
+ const responseBuffer = await transport.send(CLA, INS.SIGN_TRANSACTION, p1, 0x00, chunk)
+
+ if (p1 === 0x80) {
+ // This is the last chunk, response contains the signature
+ const response = this.wrapResponse(responseBuffer)
+ const sigLength = response.data[0]
+ const signature = response.data.slice(1, 1 + sigLength).toString('hex')
+ return {signature: 'SIG_K1_' + signature}
+ }
+
+ offset += chunkSize
+ }
+
+ throw new Error('Failed to sign transaction')
+ }
+
+ /**
+ * Performs the wallet logic required to login and return the chain and permission level to use.
+ */
+ async login(context: LoginContext): Promise {
+ try {
+ // Get the transport instance
+ const transport = await this.getTransport()
+
+ // Check if the EOS app is open on the device
+ await this.getAppConfiguration(transport)
+
+ // BIP32 path for EOS (modify according to needed derivation path)
+ const path = "44'/194'/0'/0/0"
+
+ // Display public key on device and get it
+ const {publicKey} = await this.getPublicKey(transport, path, true)
+ console.log('Ledger publicKey:', publicKey)
+
+ // For simplicity, this example uses a placeholder chain and permission
+ // In a real implementation, you would:
+ // 1. Get the account associated with this public key from the blockchain
+ // 2. Let the user select the permission to use
+
+ // If a chain or actor is already provided in the context, use it
+ const chainId = '73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d'
+ const chain = context.chain
+ ? Checksum256.from(context.chain.id.toString())
+ : Checksum256.from(chainId)
+
+ // In a real implementation, you would determine the actual permission level
+ // associated with the public key on the blockchain
+ const permissionLevel = PermissionLevel.from('ledgeraccount@active')
+
+ // Close the transport
+ await transport.close()
+
+ return {
+ chain,
+ permissionLevel,
+ }
+ } catch (error) {
+ // Handle errors
+ if (error instanceof Error) {
+ throw error
+ }
+ throw new Error('Failed to login with Ledger device')
+ }
+ }
+
/**
* Performs the wallet logic required to sign a transaction and return the signature.
- *
- * @param chain ChainDefinition
- * @param resolved ResolvedSigningRequest
- * @returns Promise
*/
- // TODO: Remove these eslint rule modifiers when you are implementing this method.
- /* eslint-disable @typescript-eslint/no-unused-vars */
async sign(
resolved: ResolvedSigningRequest,
context: TransactContext
): Promise {
- // Example response...
- return {
- signatures: [
- Signature.from(
- 'SIG_K1_KfqBXGdSRnVgZbAXyL9hEYbAvrZjcaxUCenD7Z3aX6yzf6MEyc4Cy3ywToD4j3SKkzSg7L1uvRUirEPHwAwrbg5c9z27Z3'
- ),
- ],
+ try {
+ // Get the transport instance
+ const transport = await this.getTransport()
+
+ // Check if the EOS app is open on the device
+ await this.getAppConfiguration(transport)
+
+ // BIP32 path for EOS (modify according to needed derivation path)
+ const path = "44'/194'/0'/0/0"
+
+ // Convert transaction to binary format
+ const serializedTransaction = resolved.serializedTransaction
+ const transactionBuffer = Buffer.from(serializedTransaction)
+
+ // Sign the transaction
+ const {signature} = await this.signTransaction(transport, path, transactionBuffer)
+
+ // Close the transport
+ await transport.close()
+
+ return {
+ signatures: [Signature.from(signature)],
+ }
+ } catch (error) {
+ // Handle errors
+ if (error instanceof Error) {
+ throw error
+ }
+ throw new Error('Failed to sign transaction with Ledger device')
}
}
}
diff --git a/test/tests/common.ts b/test/tests/common.ts
index ebfe55e..27cf600 100644
--- a/test/tests/common.ts
+++ b/test/tests/common.ts
@@ -1,3 +1,5 @@
+///
+
import {assert} from 'chai'
import {PermissionLevel, SessionKit} from '@wharfkit/session'
import {
@@ -7,14 +9,54 @@ import {
mockSessionKitOptions,
} from '@wharfkit/mock-data'
-import {WalletPluginTEMPLATE} from '$lib'
+import {WalletPluginLedger, Transport} from '$lib'
+
+// Create a mock Transport to use in tests
+class MockTransport implements Transport {
+ async send(cla: number, ins: number, p1: number, p2: number, data?: Buffer): Promise<{ data: Buffer }> {
+ // Mock responses based on instruction code
+ switch (ins) {
+ case 0x01: // GET_APP_CONFIGURATION
+ return { data: Buffer.from([1, 0, 0]) } // Version 1.0.0
+ case 0x02: // GET_PUBLIC_KEY
+ {
+ // Return a sample EOS public key
+ const publicKey = 'PUB_K1_6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5BoDq63'
+ const keyBuffer = Buffer.from(publicKey)
+ const result = Buffer.alloc(1 + keyBuffer.length)
+ result[0] = keyBuffer.length
+ keyBuffer.copy(result, 1)
+ return { data: result }
+ }
+ case 0x04: // SIGN_TRANSACTION
+ if (p1 === 0x80) {
+ // Last chunk, return a mock signature
+ const signature = 'SIG_K1_KfqBXGdSRnVgZbAXyL9hEYbAvrZjcaxUCenD7Z3aX6yzf6MEyc4Cy3ywToD4j3SKkzSg7L1uvRUirEPHwAwrbg5c9z27Z3'
+ const sigBuffer = Buffer.from(signature.substring(7)) // Remove SIG_K1_ prefix
+ const result = Buffer.alloc(1 + sigBuffer.length)
+ result[0] = sigBuffer.length
+ sigBuffer.copy(result, 1)
+ return { data: result }
+ }
+ return { data: Buffer.from([]) } // Not the last chunk
+ default:
+ throw new Error(`Unsupported instruction: ${ins}`)
+ }
+ }
+
+ async close(): Promise {
+ // No-op for mock
+ }
+}
suite('wallet plugin', function () {
test('login and sign', async function () {
+ const mockTransport = new MockTransport()
+
const kit = new SessionKit(
{
...mockSessionKitArgs,
- walletPlugins: [new WalletPluginTEMPLATE()],
+ walletPlugins: [new WalletPluginLedger({ transport: mockTransport })],
},
mockSessionKitOptions
)
@@ -37,7 +79,7 @@ suite('wallet plugin', function () {
from: PermissionLevel.from(mockPermissionLevel).actor,
to: 'wharfkittest',
quantity: '0.0001 EOS',
- memo: 'wharfkit/session wallet plugin template',
+ memo: 'wharfkit/session wallet plugin ledger',
},
},
},
diff --git a/yarn.lock b/yarn.lock
index 17daf77..95fe5c9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -295,6 +295,92 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
+"@ledgerhq/devices@8.4.4", "@ledgerhq/devices@^8.4.4":
+ version "8.4.4"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-8.4.4.tgz#0d195c1650fe57da2fad7f0d9074a0190947cd6f"
+ integrity sha512-sz/ryhe/R687RHtevIE9RlKaV8kkKykUV4k29e7GAVwzHX1gqG+O75cu1NCJUHLbp3eABV5FdvZejqRUlLis9A==
+ dependencies:
+ "@ledgerhq/errors" "^6.19.1"
+ "@ledgerhq/logs" "^6.12.0"
+ rxjs "^7.8.1"
+ semver "^7.3.5"
+
+"@ledgerhq/errors@^6.19.1":
+ version "6.19.1"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.19.1.tgz#d9ac45ad4ff839e468b8f63766e665537aaede58"
+ integrity sha512-75yK7Nnit/Gp7gdrJAz0ipp31CCgncRp+evWt6QawQEtQKYEDfGo10QywgrrBBixeRxwnMy1DP6g2oCWRf1bjw==
+
+"@ledgerhq/hw-transport-node-hid-noevents@^6.30.5":
+ version "6.30.5"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-6.30.5.tgz#87feed538aa373a61e21e0c2849a5e4c9a07528b"
+ integrity sha512-nOPbhFU87LgLERVAQ+HhxV8E8c+7d8ptllkgiJUc4QwL2z9zkIOAEtgdvCaZ066Oi9XGnln/GF1oAgByYnYDPw==
+ dependencies:
+ "@ledgerhq/devices" "^8.4.4"
+ "@ledgerhq/errors" "^6.19.1"
+ "@ledgerhq/hw-transport" "^6.31.4"
+ "@ledgerhq/logs" "^6.12.0"
+ node-hid "2.1.2"
+
+"@ledgerhq/hw-transport-node-hid@^6.27.1":
+ version "6.29.5"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-6.29.5.tgz#4e140ba3fc152277ae8af2b133287fa803093fc9"
+ integrity sha512-2bAp4K50V1kdCufU9JdQPcw4aLyvA+yQRJU/X39B+PC+rnis40gEbqNh0henhzv876sXdbNk6G/MkDWXpwDIow==
+ dependencies:
+ "@ledgerhq/devices" "^8.4.4"
+ "@ledgerhq/errors" "^6.19.1"
+ "@ledgerhq/hw-transport" "^6.31.4"
+ "@ledgerhq/hw-transport-node-hid-noevents" "^6.30.5"
+ "@ledgerhq/logs" "^6.12.0"
+ lodash "^4.17.21"
+ node-hid "2.1.2"
+ usb "2.9.0"
+
+"@ledgerhq/hw-transport-web-ble@^6.27.1":
+ version "6.29.4"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-web-ble/-/hw-transport-web-ble-6.29.4.tgz#53807f804c55c6423bc3936fe4f440549e839625"
+ integrity sha512-OJyp6CryvyFlg1L9uifo5hYYdDt+WPw8/0ijBixYhYmGvlRz2W6/F2c5rG/zBQWcNnNydPOLjLJM0vR070RfCw==
+ dependencies:
+ "@ledgerhq/devices" "^8.4.4"
+ "@ledgerhq/errors" "^6.19.1"
+ "@ledgerhq/hw-transport" "^6.31.4"
+ "@ledgerhq/logs" "^6.12.0"
+ rxjs "^7.8.1"
+
+"@ledgerhq/hw-transport-webhid@^6.27.1":
+ version "6.30.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webhid/-/hw-transport-webhid-6.30.0.tgz#cd86b0055eb77276892024abbd38e6ed2471b59e"
+ integrity sha512-HoTzjmYwO7+TVwK+GNbglRepUoDywBL6vjhKnhGqJSUPqAqJJyEXcnKnFDBMN7Phqm55O+YHDYfpcHGBNg5XlQ==
+ dependencies:
+ "@ledgerhq/devices" "8.4.4"
+ "@ledgerhq/errors" "^6.19.1"
+ "@ledgerhq/hw-transport" "^6.31.4"
+ "@ledgerhq/logs" "^6.12.0"
+
+"@ledgerhq/hw-transport-webusb@^6.27.1":
+ version "6.29.4"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.29.4.tgz#5926421b8db4b474c7aba4851f21ddd4ad4bcc70"
+ integrity sha512-HoGF1LlBT9HEGBQy2XeCHrFdv/FEOZU0+J+yfKcgAQIAiASr2MLvdzwoJbUS8h6Gn+vc+/BjzBSO3JNn7Loqbg==
+ dependencies:
+ "@ledgerhq/devices" "^8.4.4"
+ "@ledgerhq/errors" "^6.19.1"
+ "@ledgerhq/hw-transport" "^6.31.4"
+ "@ledgerhq/logs" "^6.12.0"
+
+"@ledgerhq/hw-transport@^6.31.4":
+ version "6.31.4"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.31.4.tgz#9b23a6de4a4caaa5c24b149c2dea8adde46f0eb1"
+ integrity sha512-6c1ir/cXWJm5dCWdq55NPgCJ3UuKuuxRvf//Xs36Bq9BwkV2YaRQhZITAkads83l07NAdR16hkTWqqpwFMaI6A==
+ dependencies:
+ "@ledgerhq/devices" "^8.4.4"
+ "@ledgerhq/errors" "^6.19.1"
+ "@ledgerhq/logs" "^6.12.0"
+ events "^3.3.0"
+
+"@ledgerhq/logs@^6.12.0":
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.12.0.tgz#ad903528bf3687a44da435d7b2479d724d374f5d"
+ integrity sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA==
+
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -439,11 +525,18 @@
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4"
integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==
-"@types/node@*", "@types/node@^18.7.18":
+"@types/node@*":
version "18.11.18"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f"
integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==
+"@types/node@^22.15.12":
+ version "22.15.12"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.12.tgz#9ce54e51e09536faa94e4ec300c4728ee83bfa85"
+ integrity sha512-K0fpC/ZVeb8G9rm7bH7vI0KAec4XHEhBam616nVJCV51bKzJ6oA3luG4WdKoaztxe70QaNjS/xBmcDLmr4PiGw==
+ dependencies:
+ undici-types "~6.21.0"
+
"@types/resolve@1.17.1":
version "1.17.1"
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
@@ -456,6 +549,11 @@
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91"
integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==
+"@types/w3c-web-usb@^1.0.6":
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz#cf89cccd2d93b6245e784c19afe0a9f5038d4528"
+ integrity sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==
+
"@typescript-eslint/eslint-plugin@^5.20.0":
version "5.50.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz#fb48c31cadc853ffc1dc35373f56b5e2a8908fe9"
@@ -740,11 +838,32 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bl@^4.0.3:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
bn.js@^4.11.9:
version "4.12.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
@@ -797,6 +916,14 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+buffer@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
builtin-modules@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
@@ -882,6 +1009,11 @@ chokidar@3.5.3:
optionalDependencies:
fsevents "~2.3.2"
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
@@ -985,6 +1117,13 @@ decamelize@^4.0.0:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+decompress-response@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+ dependencies:
+ mimic-response "^3.1.0"
+
deep-eql@^4.1.2:
version "4.1.3"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d"
@@ -992,6 +1131,11 @@ deep-eql@^4.1.2:
dependencies:
type-detect "^4.0.0"
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -1009,6 +1153,11 @@ default-require-extensions@^3.0.0:
dependencies:
strip-bom "^4.0.0"
+detect-libc@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8"
+ integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==
+
diff@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
@@ -1061,6 +1210,13 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
es6-error@^4.0.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
@@ -1224,6 +1380,16 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+events@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+expand-template@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
+ integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
+
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -1269,6 +1435,11 @@ file-entry-cache@^6.0.1:
dependencies:
flat-cache "^3.0.4"
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
filename-reserved-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
@@ -1346,6 +1517,11 @@ fromentries@^1.2.0:
resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a"
integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -1403,6 +1579,11 @@ gh-pages@^4.0.0:
fs-extra "^8.1.0"
globby "^6.1.0"
+github-from-package@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
+ integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
+
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -1526,6 +1707,11 @@ html-escaper@^2.0.0:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
ignore@^5.2.0:
version "5.2.4"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
@@ -1562,6 +1748,11 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@@ -1810,7 +2001,7 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash@^4.17.14:
+lodash@^4.17.14, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -1905,6 +2096,11 @@ micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
+mimic-response@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
@@ -1936,11 +2132,21 @@ minimatch@^5.1.2:
dependencies:
brace-expansion "^2.0.1"
+minimist@^1.2.0, minimist@^1.2.3:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
minimist@^1.2.6:
version "1.2.7"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
+mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
+ integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
+
mocha@^10.0.0:
version "10.2.0"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8"
@@ -1983,6 +2189,11 @@ nanoid@3.3.3:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25"
integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==
+napi-build-utils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e"
+ integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==
+
natural-compare-lite@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4"
@@ -1993,6 +2204,23 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+node-abi@^3.3.0:
+ version "3.75.0"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.75.0.tgz#2f929a91a90a0d02b325c43731314802357ed764"
+ integrity sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==
+ dependencies:
+ semver "^7.3.5"
+
+node-addon-api@^3.0.2:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
+ integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
+
+node-addon-api@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76"
+ integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==
+
node-fetch@^2.6.1:
version "2.6.9"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
@@ -2000,6 +2228,20 @@ node-fetch@^2.6.1:
dependencies:
whatwg-url "^5.0.0"
+node-gyp-build@^4.5.0:
+ version "4.8.4"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8"
+ integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==
+
+node-hid@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-2.1.2.tgz#3145fa86ed4336a402a71e9f372c54213b88797c"
+ integrity sha512-qhCyQqrPpP93F/6Wc/xUR7L8mAJW0Z6R7HMQV8jCHHksAxNDe/4z4Un/H9CpLOT+5K39OPyt9tIQlavxWES3lg==
+ dependencies:
+ bindings "^1.5.0"
+ node-addon-api "^3.0.2"
+ prebuild-install "^7.1.1"
+
node-preload@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301"
@@ -2055,7 +2297,7 @@ object-assign@^4.0.1:
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
-once@^1.3.0:
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
@@ -2200,6 +2442,24 @@ pkg-dir@^4.1.0:
dependencies:
find-up "^4.0.0"
+prebuild-install@^7.1.1:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec"
+ integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==
+ dependencies:
+ detect-libc "^2.0.0"
+ expand-template "^2.0.3"
+ github-from-package "0.0.0"
+ minimist "^1.2.3"
+ mkdirp-classic "^0.5.3"
+ napi-build-utils "^2.0.0"
+ node-abi "^3.3.0"
+ pump "^3.0.0"
+ rc "^1.2.7"
+ simple-get "^4.0.0"
+ tar-fs "^2.0.0"
+ tunnel-agent "^0.6.0"
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -2224,6 +2484,14 @@ process-on-spawn@^1.0.0:
dependencies:
fromentries "^1.2.0"
+pump@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+ integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
punycode@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
@@ -2241,6 +2509,25 @@ randombytes@^2.1.0:
dependencies:
safe-buffer "^5.1.0"
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+readable-stream@^3.1.1, readable-stream@^3.4.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@@ -2334,7 +2621,14 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
-safe-buffer@^5.1.0:
+rxjs@^7.8.1:
+ version "7.8.2"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b"
+ integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==
+ dependencies:
+ tslib "^2.1.0"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -2344,6 +2638,11 @@ semver@^6.0.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+semver@^7.3.5:
+ version "7.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
+ integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
+
semver@^7.3.7, semver@^7.3.8:
version "7.3.8"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
@@ -2396,6 +2695,20 @@ signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
+ integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
+ dependencies:
+ decompress-response "^6.0.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -2445,6 +2758,13 @@ string-width@^4.1.0, string-width@^4.2.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -2467,6 +2787,11 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
+
strip-outer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
@@ -2500,6 +2825,27 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+tar-fs@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5"
+ integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==
+ dependencies:
+ chownr "^1.1.1"
+ mkdirp-classic "^0.5.2"
+ pump "^3.0.0"
+ tar-stream "^2.1.4"
+
+tar-stream@^2.1.4:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
+ integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
+ dependencies:
+ bl "^4.0.3"
+ end-of-stream "^1.4.1"
+ fs-constants "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.1.1"
+
terser@^5.0.0:
version "5.16.2"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.2.tgz#8f495819439e8b5c150e7530fc434a6e70ea18b2"
@@ -2593,6 +2939,13 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
+ dependencies:
+ safe-buffer "^5.0.1"
+
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -2637,6 +2990,11 @@ typescript@^4.1.2:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
+undici-types@~6.21.0:
+ version "6.21.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb"
+ integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
+
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@@ -2657,6 +3015,20 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
+usb@2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/usb/-/usb-2.9.0.tgz#8ae3b175f93bee559400bff33491eee63406b6a2"
+ integrity sha512-G0I/fPgfHUzWH8xo2KkDxTTFruUWfppgSFJ+bQxz/kVY2x15EQ/XDB7dqD1G432G4gBG4jYQuF3U7j/orSs5nw==
+ dependencies:
+ "@types/w3c-web-usb" "^1.0.6"
+ node-addon-api "^6.0.0"
+ node-gyp-build "^4.5.0"
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"