diff --git a/.gitignore b/.gitignore index ab603c5..656741a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules coverage -.vscode \ No newline at end of file +.DS_Store +.vscode diff --git a/README.md b/README.md index bf57a36..e73c214 100644 --- a/README.md +++ b/README.md @@ -15,30 +15,288 @@ This module is part of the [**WDK (Wallet Development Kit)**](https://docs.wdk.t For detailed documentation about the complete WDK ecosystem, visit [docs.wdk.tether.io](https://docs.wdk.tether.io). -## Installation +## ⬇️ Installation + +To install the `@tetherto/wdk-wallet-evm` package, follow these instructions: + +You can install it using npm: ```bash npm install @tetherto/wdk-wallet-evm ``` -## Quick Start +## 🚀 Quick Start + +### Importing from `@tetherto/wdk-wallet-evm` + +```javascript +import WalletManagerEvm, { + WalletAccountEvm, + WalletAccountReadOnlyEvm, +} from '@tetherto/wdk-wallet-evm' + +// Signers are exported under the /signers subpath +import { + SeedSignerEvm, + PrivateKeySignerEvm, +} from '@tetherto/wdk-wallet-evm/signers' +``` + +### Create a Wallet Manager (seed-based) ```javascript import WalletManagerEvm from '@tetherto/wdk-wallet-evm' +import { SeedSignerEvm } from '@tetherto/wdk-wallet-evm/signers' + +// Use a BIP-39 seed phrase (replace with your own secure phrase) +const seedPhrase = + 'test only example nut use this real life secret phrase must random' + +// Create a root signer from the seed phrase +const root = new SeedSignerEvm(seedPhrase) -const seedPhrase = 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about' +// Create wallet manager with provider config (provider is required for chain ops) +const wallet = new WalletManagerEvm(root, { + // Option 1: Using RPC URL + provider: 'https://sepolia.drpc.org', // any EVM RPC + transferMaxFee: 100000000000000n, // Optional: max fee in wei (BigInt) +}) + +// OR -const wallet = new WalletManagerEvm(seedPhrase, { - provider: 'https://sepolia.drpc.org', +// Option 2: Using EIP-1193 provider (e.g., from browser wallet) +const wallet2 = new WalletManagerEvm(root, { + provider: window.ethereum, // EIP-1193 provider + transferMaxFee: 100000000000000n, // Optional }) -const account = await wallet.getAccount(0) -const address = await account.getAddress() -console.log('Address:', address) +// Get a full access account +const account0 = await wallet.getAccount(0) + +// Convert to a read-only account +const readOnlyAccount = await account0.toReadOnlyAccount() +``` + +### Single Account (no manager): Private key + +```javascript +import { WalletAccountEvm } from '@tetherto/wdk-wallet-evm' +import { PrivateKeySignerEvm } from '@tetherto/wdk-wallet-evm/signers' + +// From a raw private key (hex string or bytes) +const pkSigner = new PrivateKeySignerEvm('0x0123...abcd') +const pkAccount = new WalletAccountEvm(pkSigner, { + provider: 'https://eth-mainnet.g.alchemy.com/v2/your-api-key', +}) +``` + +### Managing Multiple Accounts (seed-based manager) + +```javascript +import WalletManagerEvm from '@tetherto/wdk-wallet-evm' +import { SeedSignerEvm } from '@tetherto/wdk-wallet-evm/signers' + +const root = new SeedSignerEvm(mnemonic) +const wallet = new WalletManagerEvm(root, { + provider: 'https://eth-mainnet.g.alchemy.com/v2/your-api-key', +}) + +// Get the first account (index 0) +const account = await wallet.getAccount(0) // m/44'/60'/0'/0/0 +const address = await account.getAddress() // 0x... +console.log('Account 0 address:', address) + +// Get the second account (index 1) +const account1 = await wallet.getAccount(1) // m/44'/60'/0'/0/1 +const address1 = await account1.getAddress() // 0x... +console.log('Account 1 address:', address1) + +// Get account by custom derivation path +// Full path will be m/44'/60'/0'/0/5 +const customAccount = await wallet.getAccountByPath('0\'/0/5') +const customAddress = await customAccount.getAddress() +console.log('Custom account address:', customAddress) + +// Note: All addresses are checksummed Ethereum addresses (0x...) +// All accounts inherit the provider configuration from the wallet manager +``` + +### Checking Balances + +#### Owned Account + +For accounts where you have the seed phrase and full access: + +```javascript +// Assume wallet and account are already created +// Get native token balance (in wei) +const balance = await account.getBalance() +console.log('Native balance:', balance, 'wei') // 1 ETH = 1000000000000000000 wei + +// Get ERC20 token balance +const tokenContract = '0x...' // ERC20 contract address +const tokenBalance = await account.getTokenBalance(tokenContract) +console.log('Token balance:', tokenBalance) + +// Note: Provider is required for balance checks +// Make sure wallet was created with a provider configuration +``` + +#### Read-Only Account + +For addresses where you don't have the seed phrase: + +```javascript +import { WalletAccountReadOnlyEvm } from '@tetherto/wdk-wallet-evm' + +// Create a read-only account +const readOnlyAccount = new WalletAccountReadOnlyEvm('0x...', { + // Ethereum address + provider: 'https://sepolia.drpc.org', // Required for balance checks +}) + +// Check native token balance +const balance = await readOnlyAccount.getBalance() +console.log('Native balance:', balance, 'wei') + +// Check ERC20 token balance using contract +const tokenBalance = await readOnlyAccount.getTokenBalance('0x...') // ERC20 contract address +console.log('Token balance:', tokenBalance) + +// Note: ERC20 balance checks use the standard balanceOf(address) function +// Make sure the contract address is correct and implements the ERC20 standard +``` +### Sending Transactions + +Send native tokens and estimate fees using `WalletAccountEvm`. Supports EIP-1559 and auto-populates gas/fee fields where possible. + +```javascript +// Send native tokens +// Modern EIP-1559 style transaction (recommended) +const result = await account.sendTransaction({ + to: '0x...', // Recipient address + value: 1000000000000000000n, // 1 ETH in wei + maxFeePerGas: 30000000000n, // Optional: max fee per gas (in wei) + maxPriorityFeePerGas: 2000000000n, // Optional: max priority fee per gas (in wei) +}) +console.log('Transaction hash:', result.hash) +console.log('Transaction fee:', result.fee, 'wei') + +// OR Legacy style transaction +const legacyResult = await account.sendTransaction({ + to: '0x...', + value: 1000000000000000000n, + gasPrice: 20000000000n, // Optional: legacy gas price (in wei) + gasLimit: 21000, // Optional: gas limit +}) + +// Get transaction fee estimate +const quote = await account.quoteSendTransaction({ + to: '0x...', + value: 1000000000000000000n, +}) +console.log('Estimated fee:', quote.fee, 'wei') +``` + +### Token Transfers + +Transfer ERC20 tokens and estimate fees using `WalletAccountEvm`. Uses standard ERC20 `transfer` function. + +```javascript +// Transfer ERC20 tokens +const transferResult = await account.transfer({ + token: '0x...', // ERC20 contract address + recipient: '0x...', // Recipient's address + amount: 1000000n, // Amount in token's base units (use BigInt for large numbers) +}) +console.log('Transfer hash:', transferResult.hash) +console.log('Transfer fee:', transferResult.fee, 'wei') + +// Quote token transfer fee +const transferQuote = await account.quoteTransfer({ + token: '0x...', // ERC20 contract address + recipient: '0x...', // Recipient's address + amount: 1000000n, // Amount in token's base units +}) +console.log('Transfer fee estimate:', transferQuote.fee, 'wei') +``` + +### Token Approvals + +Approve a spender for a specific amount (uses ERC20 `approve`): + +```javascript +const approval = await account.approve({ + token: '0x...', // ERC20 contract + spender: '0x...', // Spender address + amount: 1000000n, // Allowance amount in base units +}) +console.log('Approval tx hash:', approval.hash) +``` + +### Message Signing and Verification + +Sign messages using `WalletAccountEvm` and verify signatures using `WalletAccountReadOnlyEvm`. + +```javascript +// Sign a message +const message = 'Hello, Ethereum!' +const signature = await account.sign(message) +console.log('Signature:', signature) + +// Verify a signature (can use read-only account) +const isValid = await readOnlyAccount.verify(message, signature) +console.log('Signature valid:', isValid) +``` + +### Fee Management + +Retrieve current fee rates using `WalletManagerEvm`. Supports EIP-1559 fee model. + +```javascript +// Get current fee rates +const feeRates = await wallet.getFeeRates() +console.log('Normal fee rate:', feeRates.normal, 'wei') // 1.1x base fee +console.log('Fast fee rate:', feeRates.fast, 'wei') // 2.0x base fee +``` + +### Memory Management + +Clear sensitive data from memory using `dispose` methods in `WalletAccountEvm` and `WalletManagerEvm`. + +```javascript +// Dispose wallet accounts to clear private keys from memory +account.dispose() + +// Dispose entire wallet manager wallet.dispose() ``` +## 🔐 Signers + +Signers provide the cryptographic primitives for accounts. There are two signer implementations: + +- **SeedSignerEvm (root + child)**: Derives accounts from a BIP-39 seed using the BIP-44 Ethereum path. Can act as a root (for `WalletManagerEvm`) and derive children (for `WalletAccountEvm`). +- **PrivateKeySignerEvm (child only)**: Wraps a raw private key in a memory-safe buffer. Cannot derive. Use directly with `WalletAccountEvm`. Not supported by `WalletManagerEvm`. + +Examples: + +```javascript +// Root + manager (seed) +import WalletManagerEvm from '@tetherto/wdk-wallet-evm' +import { SeedSignerEvm } from '@tetherto/wdk-wallet-evm/signers' +const root = new SeedSignerEvm(mnemonic) +const wallet = new WalletManagerEvm(root, { provider: 'https://...' }) +const account0 = await wallet.getAccount(0) + +// Single account from a private key +import { WalletAccountEvm } from '@tetherto/wdk-wallet-evm' +import { PrivateKeySignerEvm } from '@tetherto/wdk-wallet-evm/signers' +const signer = new PrivateKeySignerEvm('0x0123...') +const account = new WalletAccountEvm(signer, { provider: 'https://...' }) +``` + ## Key Capabilities - **BIP-39 Seed Phrase Support**: Generate and validate mnemonic seed phrases @@ -49,6 +307,8 @@ wallet.dispose() - **Message Signing**: Sign and verify messages (EIP-191 and EIP-712) - **Fee Estimation**: Real-time network fee rates with normal/fast tiers - **Secure Memory Disposal**: Clear private keys from memory when done +- **Signer Submodule**: Create your own signer from ISignerEvm, support for Seed and Private key signers +- **EIP-7702 Delegation**: Delegate EOAs to smart contracts, sign authorizations, and send type 4 transactions ## Compatibility @@ -58,26 +318,26 @@ wallet.dispose() ## Documentation -| Topic | Description | Link | -|-------|-------------|------| -| Overview | Module overview and feature summary | [Wallet EVM Overview](https://docs.wdk.tether.io/sdk/wallet-modules/wallet-evm) | -| Usage | End-to-end integration walkthrough | [Wallet EVM Usage](https://docs.wdk.tether.io/sdk/wallet-modules/wallet-evm/usage) | +| Topic | Description | Link | +| ------------- | ----------------------------------------- | -------------------------------------------------------------------------------------------------- | +| Overview | Module overview and feature summary | [Wallet EVM Overview](https://docs.wdk.tether.io/sdk/wallet-modules/wallet-evm) | +| Usage | End-to-end integration walkthrough | [Wallet EVM Usage](https://docs.wdk.tether.io/sdk/wallet-modules/wallet-evm/usage) | | Configuration | Provider, fees, and network configuration | [Wallet EVM Configuration](https://docs.wdk.tether.io/sdk/wallet-modules/wallet-evm/configuration) | -| API Reference | Complete class and type reference | [Wallet EVM API Reference](https://docs.wdk.tether.io/sdk/wallet-modules/wallet-evm/api-reference) | +| API Reference | Complete class and type reference | [Wallet EVM API Reference](https://docs.wdk.tether.io/sdk/wallet-modules/wallet-evm/api-reference) | ## Examples -| Example | Description | -|---------|-------------| -| [Create Wallet](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/create-wallet.ts) | Initialize a wallet manager and derive accounts from a seed phrase | -| [Manage Accounts](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/manage-accounts.ts) | Work with multiple accounts and custom derivation paths | -| [Check Balances](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/check-balances.ts) | Query native token and ERC-20 balances for owned accounts | -| [Read-Only Account](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/read-only-account.ts) | Monitor balances for any address without a private key | -| [Send Transaction](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/send-transaction.ts) | Estimate fees and send native token transactions (EIP-1559 + legacy) | -| [Token Transfer](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/token-transfer.ts) | Transfer ERC-20 tokens and estimate transfer fees | -| [Sign & Verify Message](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/sign-verify-message.ts) | Sign messages and verify signatures | -| [Fee Management](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/fee-management.ts) | Retrieve current network fee rates | -| [Memory Management](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/memory-management.ts) | Securely dispose wallets and clear private keys from memory | +| Example | Description | +| ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | +| [Create Wallet](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/create-wallet.ts) | Initialize a wallet manager and derive accounts from a seed phrase | +| [Manage Accounts](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/manage-accounts.ts) | Work with multiple accounts and custom derivation paths | +| [Check Balances](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/check-balances.ts) | Query native token and ERC-20 balances for owned accounts | +| [Read-Only Account](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/read-only-account.ts) | Monitor balances for any address without a private key | +| [Send Transaction](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/send-transaction.ts) | Estimate fees and send native token transactions (EIP-1559 + legacy) | +| [Token Transfer](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/token-transfer.ts) | Transfer ERC-20 tokens and estimate transfer fees | +| [Sign & Verify Message](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/sign-verify-message.ts) | Sign messages and verify signatures | +| [Fee Management](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/fee-management.ts) | Retrieve current network fee rates | +| [Memory Management](https://github.com/tetherto/wdk-examples/blob/main/wallet-evm/memory-management.ts) | Securely dispose wallets and clear private keys from memory | > For detailed walkthroughs, see the [Usage Guide](https://docs.wdk.tether.io/sdk/wallet-modules/wallet-evm/usage). > See all runnable examples in the [wdk-examples](https://github.com/tetherto/wdk-examples) repository. diff --git a/index.js b/index.js index ee3d1dc..12898d4 100644 --- a/index.js +++ b/index.js @@ -33,6 +33,8 @@ /** @typedef {import('./src/wallet-account-evm.js').ApproveOptions} ApproveOptions */ +/** @typedef {import('./src/utils/tx-populator-evm.js').UnsignedEvmTransaction} UnsignedEvmTransaction */ + export { default } from './src/wallet-manager-evm.js' export { default as WalletAccountReadOnlyEvm } from './src/wallet-account-read-only-evm.js' diff --git a/package-lock.json b/package-lock.json index cea18de..6eec2f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,10 @@ "version": "1.0.0-beta.14", "license": "Apache-2.0", "dependencies": { - "@noble/curves": "1.9.2", "@noble/hashes": "1.8.0", "@noble/secp256k1": "2.2.3", "@tetherto/wdk-failover-provider": "1.0.0-beta.2", - "@tetherto/wdk-wallet": "1.0.0-beta.11", + "@tetherto/wdk-wallet": "1.0.0-beta.12", "bare-node-runtime": "^1.5.0", "bip39": "3.1.0", "ethers": "6.14.4", @@ -167,7 +166,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", "engines": { @@ -236,6 +237,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", "dependencies": { @@ -247,6 +250,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", "dependencies": { @@ -258,6 +263,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", "dependencies": { @@ -269,6 +276,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", "dependencies": { @@ -282,11 +291,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -297,6 +308,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", "dependencies": { @@ -308,6 +321,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { @@ -318,11 +333,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -333,6 +350,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", "dependencies": { @@ -344,6 +363,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -355,6 +376,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { @@ -366,6 +389,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { @@ -377,6 +402,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -388,6 +415,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { @@ -399,6 +428,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { @@ -413,6 +444,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { @@ -426,11 +459,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -489,11 +524,15 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -511,6 +550,8 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -519,6 +560,8 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -541,13 +584,15 @@ }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, "funding": [ { @@ -569,6 +614,8 @@ }, "node_modules/@eslint/js": { "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", "engines": { @@ -1082,6 +1129,9 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1095,6 +1145,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1107,11 +1159,16 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1127,6 +1184,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -1135,6 +1194,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -1147,6 +1208,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -1158,6 +1221,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -1172,6 +1237,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -1182,7 +1249,9 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -1191,6 +1260,8 @@ }, "node_modules/@jest/console": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { @@ -1207,6 +1278,8 @@ }, "node_modules/@jest/core": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { @@ -1253,6 +1326,8 @@ }, "node_modules/@jest/core/node_modules/ci-info": { "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -1267,6 +1342,8 @@ }, "node_modules/@jest/environment": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1281,6 +1358,8 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1293,6 +1372,8 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { @@ -1304,6 +1385,8 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1320,6 +1403,8 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1334,6 +1419,8 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { @@ -1376,6 +1463,8 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { @@ -1387,6 +1476,8 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { @@ -1400,6 +1491,8 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", "dependencies": { @@ -1414,6 +1507,8 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { @@ -1428,6 +1523,8 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -1453,6 +1550,8 @@ }, "node_modules/@jest/types": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", "dependencies": { @@ -1469,6 +1568,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -1478,6 +1579,8 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1487,6 +1590,8 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -1495,11 +1600,15 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1508,15 +1617,24 @@ } }, "node_modules/@noble/curves": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.8.0" + "@noble/hashes": "1.3.2" }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1524,6 +1642,8 @@ }, "node_modules/@noble/hashes": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -1543,6 +1663,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -1555,6 +1677,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -1563,6 +1687,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1775,6 +1901,8 @@ }, "node_modules/@rtsao/scc": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, "license": "MIT" }, @@ -2014,12 +2142,16 @@ "license": "0BSD" }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2028,6 +2160,8 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2041,9 +2175,9 @@ "license": "Apache-2.0" }, "node_modules/@tetherto/wdk-wallet": { - "version": "1.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@tetherto/wdk-wallet/-/wdk-wallet-1.0.0-beta.11.tgz", - "integrity": "sha512-4KxZxIU3t7aQ7bdgB0UTM4LfLB/PvuLXqJ/AkTTP0MzhyJcJ8CtuYBT+fCnh4KNWSizPGmCqZNBGITYHyKwiug==", + "version": "1.0.0-beta.12", + "resolved": "https://registry.npmjs.org/@tetherto/wdk-wallet/-/wdk-wallet-1.0.0-beta.12.tgz", + "integrity": "sha512-mKMezkFwyoQ84vbnOlJ/zgSinU93Uvyu8wR4aqbcmZiFUTEdnHNV1rlv7h5LCMDS8mKI2EYaXQbw/nbqT3zJVg==", "license": "Apache-2.0", "dependencies": { "bare-node-runtime": "^1.4.0", @@ -2052,6 +2186,8 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -2064,6 +2200,8 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -2072,6 +2210,8 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2081,6 +2221,8 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2099,6 +2241,8 @@ }, "node_modules/@types/graceful-fs": { "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2107,11 +2251,15 @@ }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "license": "MIT", "dependencies": { @@ -2120,6 +2268,8 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2128,6 +2278,8 @@ }, "node_modules/@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, @@ -2140,6 +2292,8 @@ }, "node_modules/@types/node": { "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -2147,11 +2301,15 @@ }, "node_modules/@types/stack-utils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -2160,16 +2318,22 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", "dev": true, "license": "ISC" }, "node_modules/acorn": { - "version": "8.15.0", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", "bin": { @@ -2181,6 +2345,8 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2199,6 +2365,8 @@ }, "node_modules/aes-js": { "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "license": "MIT" }, "node_modules/agent-base": { @@ -2229,7 +2397,9 @@ } }, "node_modules/ajv": { - "version": "6.14.0", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -2265,6 +2435,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2279,6 +2451,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -2287,6 +2461,8 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -2301,6 +2477,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -2313,6 +2491,8 @@ }, "node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { @@ -2321,6 +2501,8 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { @@ -2336,6 +2518,8 @@ }, "node_modules/array-includes": { "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2357,6 +2541,8 @@ }, "node_modules/array.prototype.findlast": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2376,6 +2562,8 @@ }, "node_modules/array.prototype.findlastindex": { "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2396,6 +2584,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { @@ -2413,6 +2603,8 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { @@ -2430,6 +2622,8 @@ }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { @@ -2445,6 +2639,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2465,6 +2661,8 @@ }, "node_modules/async-function": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { @@ -2473,6 +2671,8 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2486,7 +2686,9 @@ } }, "node_modules/b4a": { - "version": "1.7.3", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", "license": "Apache-2.0", "peerDependencies": { "react-native-b4a": "*" @@ -2499,6 +2701,8 @@ }, "node_modules/babel-jest": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { @@ -2519,6 +2723,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2534,6 +2740,8 @@ }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2549,6 +2757,8 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", "dependencies": { @@ -2563,6 +2773,8 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", "dependencies": { @@ -2588,6 +2800,8 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", "dependencies": { @@ -2603,18 +2817,30 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, + "node_modules/bare-abort": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/bare-abort/-/bare-abort-2.0.13.tgz", + "integrity": "sha512-zdc8l88eB11Jsz5rDd6sCAgv2kUFXgdrZWoMlgU6JMkfAi1/uuGFC3IEHswKbIRQTk5H3T5CMuechsXYxiaHlQ==", + "license": "Apache-2.0" + }, "node_modules/bare-abort-controller": { - "version": "1.0.0", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bare-abort-controller/-/bare-abort-controller-1.1.2.tgz", + "integrity": "sha512-wk+JZGZEjm7RqaBAU1KuT8TxYYz7h/xxC7+4IVuDZFqK4dGqwrJ/1/yR8hNiSyaAAVHTTFNBJPH4Rzu+rI3IAg==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.7.0" } }, "node_modules/bare-addon-resolve": { - "version": "1.9.6", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.10.0.tgz", + "integrity": "sha512-sSd0jieRJlDaODOzj0oe0RjFVC1QI0ZIjGIdPkbrTXsdVVtENg14c+lHHAhHwmWCZ2nQlMhy8jA3Y5LYPc/isA==", "license": "Apache-2.0", "dependencies": { "bare-module-resolve": "^1.10.0", @@ -2631,6 +2857,8 @@ }, "node_modules/bare-ansi-escapes": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/bare-ansi-escapes/-/bare-ansi-escapes-2.2.3.tgz", + "integrity": "sha512-02ES4/E2RbrtZSnHJ9LntBhYkLA6lPpSEeP8iqS3MccBIVhVBlEmruF1I7HZqx5Q8aiTeYfQVeqmrU9YO2yYoQ==", "license": "Apache-2.0", "dependencies": { "bare-stream": "^2.6.5" @@ -2646,6 +2874,8 @@ }, "node_modules/bare-assert": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bare-assert/-/bare-assert-1.2.0.tgz", + "integrity": "sha512-c6uvgvTJBspTDxtVnPgrBKmLgcpW3Fp72NVKDLg6oT4QjQbhGtvrkHMhGYMK1sh4vjBHOBmuUalyt9hSzV37fQ==", "license": "Apache-2.0", "dependencies": { "bare-inspect": "^3.1.2" @@ -2653,8 +2883,21 @@ }, "node_modules/bare-async-hooks": { "version": "0.0.0", + "resolved": "https://registry.npmjs.org/bare-async-hooks/-/bare-async-hooks-0.0.0.tgz", + "integrity": "sha512-xNfGwUobaomCGMGAqohAekS3uMCj+4tvI4AoOaJnO7NfpN+dvFdkC5xkeQtmZzs2vxf2TR5J6i5FDd1ImCZERw==", "license": "Apache-2.0" }, + "node_modules/bare-broadcast-channel": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bare-broadcast-channel/-/bare-broadcast-channel-0.2.0.tgz", + "integrity": "sha512-MuAwdKWr4cSjNwqvbE3tA9Wn6w69q6iXYnP2Wb0nlDa6sKNSMSfY7LXkV4FzWlq9JFP9d0HkCAKPboTLKnUfWQ==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.0.0", + "bare-stream": "^2.7.0", + "bare-structured-clone": "^1.4.0" + } + }, "node_modules/bare-buffer": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/bare-buffer/-/bare-buffer-3.6.1.tgz", @@ -2666,6 +2909,8 @@ }, "node_modules/bare-bundle": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/bare-bundle/-/bare-bundle-1.10.0.tgz", + "integrity": "sha512-4LVlnJAHr00Hh6Vu6ZUJS38rcEtJT3b3vChXSsBsJ2mk1TN0lQ+gzd+Dw5L0aV7uqDZv84smuwW+O02X7PfDlw==", "license": "Apache-2.0", "peerDependencies": { "bare-buffer": "*", @@ -2681,7 +2926,9 @@ } }, "node_modules/bare-channel": { - "version": "5.2.2", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/bare-channel/-/bare-channel-5.2.4.tgz", + "integrity": "sha512-enkaOtvXUiZsLBSbataxV/QBjehCOK+SUTd2JQWUYW2iIOufpPu9jyZ9bqJqkEquktrK/rpEMVEmKsPzoci/sA==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.0.0", @@ -2693,12 +2940,16 @@ } }, "node_modules/bare-console": { - "version": "6.1.0", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/bare-console/-/bare-console-6.2.0.tgz", + "integrity": "sha512-qQ+Vasa3NwNdVDcUWKIIEG5p7MKO7uABcV/xBR9MDwQg3QklC5ayemaHzBa/ER4h6TKN2PRQN5IppNwUAMtb8Q==", "license": "Apache-2.0", "dependencies": { + "bare-format": "^1.0.2", "bare-hrtime": "^2.0.0", "bare-logger": "^2.0.0", - "bare-system-logger": "^1.0.2" + "bare-system-logger": "^1.0.2", + "bare-type": "^1.1.0" } }, "node_modules/bare-crypto": { @@ -2721,6 +2972,8 @@ }, "node_modules/bare-debug-log": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bare-debug-log/-/bare-debug-log-2.0.0.tgz", + "integrity": "sha512-Vi42PkMQsNV9PUpx2Gl1hikshx5O9FzMJ6o9Nnopseg7qLBBK7Nl31d0RHcfwLEAfmcPApytpc0ZFfq68u22FQ==", "license": "Apache-2.0", "dependencies": { "bare-os": "^3.0.1" @@ -2728,6 +2981,8 @@ }, "node_modules/bare-dgram": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bare-dgram/-/bare-dgram-1.0.1.tgz", + "integrity": "sha512-EdsyRErrkWgN8fENdrDdXFEE9HAuJ/m6ehXz13fVj9JhdCaLWIA+L8o5aYNRLt66x08RlyG2vbrRAZoxGfcdlg==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.5.0", @@ -2736,6 +2991,8 @@ }, "node_modules/bare-diagnostics-channel": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bare-diagnostics-channel/-/bare-diagnostics-channel-1.1.0.tgz", + "integrity": "sha512-Reu+EQo+eLpB+a5p8UykFEdXndFaRaSgKV38uAMh/qhE2eTeJcdwAwo74hKYyeN8GD3DIFqC9ZlM4bnDc03CIg==", "license": "Apache-2.0" }, "node_modules/bare-dns": { @@ -2748,7 +3005,9 @@ } }, "node_modules/bare-encoding": { - "version": "1.0.0", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bare-encoding/-/bare-encoding-1.0.3.tgz", + "integrity": "sha512-Kqf+t/azs13lUeyK4Tb7ha4wdLRXKWCXQ8w1rVmt7KtoPCPdHD/Xwt7LBIsCSwwGglrcmblo5VOLa5avkJqULA==", "license": "Apache-2.0", "peerDependencies": { "bare-buffer": "*" @@ -2761,13 +3020,17 @@ }, "node_modules/bare-env": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-env/-/bare-env-3.0.0.tgz", + "integrity": "sha512-0u964P5ZLAxTi+lW4Kjp7YRJQ5gZr9ycYOtjLxsSrupgMz3sn5Z9n4SH/JIifHwvadsf1brA2JAjP+9IOWwTiw==", "license": "Apache-2.0", "dependencies": { "bare-os": "^3.0.1" } }, "node_modules/bare-events": { - "version": "2.8.2", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", + "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", "license": "Apache-2.0", "peerDependencies": { "bare-abort-controller": "*" @@ -2816,14 +3079,18 @@ } }, "node_modules/bare-format": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bare-format/-/bare-format-1.0.2.tgz", + "integrity": "sha512-GswdhnOnP9QtwRbrf4wLApw5widkaLMsLe2XOs35fQD2YfEN1ApoGka+cZ7PfvzxMgfYXmMhj/2OGlVn5/Dxgw==", "license": "Apache-2.0", "dependencies": { "bare-inspect": "^3.0.0" } }, "node_modules/bare-fs": { - "version": "4.5.2", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.2.tgz", + "integrity": "sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.5.4", @@ -2846,6 +3113,8 @@ }, "node_modules/bare-hrtime": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bare-hrtime/-/bare-hrtime-2.1.1.tgz", + "integrity": "sha512-VMb3tHo05gsnbu3OXTmkDiwTjMlOsbQmKoysKqKEyR09m77TuDrYFbj3Q5GGk10dAKsUHrnXmwCaeJqzVpB5ZA==", "license": "Apache-2.0" }, "node_modules/bare-http-parser": { @@ -2891,6 +3160,8 @@ }, "node_modules/bare-inspect": { "version": "3.1.4", + "resolved": "https://registry.npmjs.org/bare-inspect/-/bare-inspect-3.1.4.tgz", + "integrity": "sha512-jfW5KRA84o3REpI6Vr4nbvMn+hqVAw8GU1mMdRwUsY5yJovQamxYeKGVKGqdzs+8ZbG4jRzGUXP/3Ji/DnqfPg==", "license": "Apache-2.0", "dependencies": { "bare-ansi-escapes": "^2.1.0", @@ -2901,9 +3172,9 @@ } }, "node_modules/bare-inspector": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/bare-inspector/-/bare-inspector-6.0.1.tgz", - "integrity": "sha512-rL+aKJ74FhF+6iJS2cV3C8js8nGF37H05ldiyMojgFP/N5eYShZ/mhSbTcDh1yriW5jndYd6xWQU0E/CE14Tiw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/bare-inspector/-/bare-inspector-6.1.0.tgz", + "integrity": "sha512-PRxmZ4gF+K3TLzGubgRFvzdECybTCSKackgNsAdd4e7SdvICxMkGj+p5iX7bSKYSmgDnxgCR+2Z6UXmWykKhvw==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.1.0", @@ -2913,7 +3184,7 @@ "bare-ws": "^3.0.0" }, "engines": { - "bare": ">=1.25.0" + "bare": ">=1.29.0" }, "peerDependencies": { "bare-tcp": "*" @@ -2925,7 +3196,9 @@ } }, "node_modules/bare-logger": { - "version": "2.0.0", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bare-logger/-/bare-logger-2.0.3.tgz", + "integrity": "sha512-U6K7NxHdeAHxEgHFDV8zXvgjgDZKQO6LlCrxQvUvlrZEVTnoezSImMWizi85rbZpVsbeI1ZWcLCRGnoIf5EV8Q==", "license": "Apache-2.0", "dependencies": { "bare-format": "^1.0.0" @@ -2938,17 +3211,20 @@ "license": "Apache-2.0" }, "node_modules/bare-module": { - "version": "6.1.3", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/bare-module/-/bare-module-6.4.0.tgz", + "integrity": "sha512-Yn4V5g5EqGQL4LYUOmt7fjKzj2JPWyJOqE3lPoeZwfUH5rk4CKUfZj6JhDwbzhBYCqqmUgjgQ5aY8cihAPILLA==", "license": "Apache-2.0", "dependencies": { "bare-bundle": "^1.3.0", "bare-module-lexer": "^1.0.0", "bare-module-resolve": "^1.8.0", "bare-path": "^3.0.0", + "bare-type-stripper": "^0.1.2", "bare-url": "^2.0.1" }, "engines": { - "bare": ">=1.23.0" + "bare": ">=1.29.4" }, "peerDependencies": { "bare-buffer": "*" @@ -2960,7 +3236,9 @@ } }, "node_modules/bare-module-lexer": { - "version": "1.4.7", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/bare-module-lexer/-/bare-module-lexer-1.5.3.tgz", + "integrity": "sha512-URLPza0jP3aVzeIX5MDKAl5tGH7zLW1dNCVmSvg3so6PM0/HhoDk2AfVQVeTFJ1xZaxFfaLuGa43q8uC1MmY1g==", "license": "Apache-2.0", "dependencies": { "require-addon": "^1.0.2" @@ -2975,7 +3253,9 @@ } }, "node_modules/bare-module-resolve": { - "version": "1.12.1", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.12.2.tgz", + "integrity": "sha512-j+hiD5k99qec4KjJvYsI67q5AOBifmy9JG3oeMVxTmvrhn2sIdp8StrUvZu4YNgwTpO+NhniQG16N1ETDe1k5w==", "license": "Apache-2.0", "dependencies": { "bare-semver": "^1.0.0" @@ -2990,7 +3270,9 @@ } }, "node_modules/bare-module-traverse": { - "version": "2.0.1", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bare-module-traverse/-/bare-module-traverse-2.1.2.tgz", + "integrity": "sha512-AXpbip2YkkDPqlLlZTKjEjfHpjcjOJB+x0BGw0upCchka1lklnYxUmCaPreRzyFzkYuEUBMeIQ4hEAkHZXgQ6g==", "license": "Apache-2.0", "dependencies": { "bare-addon-resolve": "^1.5.0", @@ -3070,14 +3352,18 @@ } }, "node_modules/bare-os": { - "version": "3.6.2", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.3.tgz", + "integrity": "sha512-fF4Q7QsyKVF5Rj0qvI8BgUNjqzC2JvQlpTaPLjVJVxYVUX5Zr9un+y3w1HmA4nNKdFmRBT8z/WmrjvXzXVerKQ==", "license": "Apache-2.0", "engines": { "bare": ">=1.14.0" } }, "node_modules/bare-path": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz", + "integrity": "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==", "license": "Apache-2.0", "dependencies": { "bare-os": "^3.0.1" @@ -3093,9 +3379,9 @@ } }, "node_modules/bare-pipe": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bare-pipe/-/bare-pipe-4.2.1.tgz", - "integrity": "sha512-il5ssf8MGPHtuaHnqjAiJHUzNQ3dahjkIMAo1k+7+zxdqscZZf8gLyptjFGQHVNHb24z8zwmAXpMBeNcFjwMBA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/bare-pipe/-/bare-pipe-4.2.2.tgz", + "integrity": "sha512-Wkf6//CmKS8inHrkgi3X/xNMeaGfs2I0ayLM0B8cbPB4DxYHcoes6Ng+muCBfXNIJ9qmEjwDDJjAUz7nRxxjgQ==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.0.0", @@ -3105,32 +3391,47 @@ "bare": ">=1.16.0" } }, + "node_modules/bare-posix": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bare-posix/-/bare-posix-1.0.1.tgz", + "integrity": "sha512-b4quA8dyRVvX0aFIAIiev5zFATHwIUGr42Gmt+CqiBNg/bdsNkrj4bbkeotMOMiljJS4DCME5kywJO/TFwKo1A==", + "license": "Apache-2.0" + }, "node_modules/bare-process": { - "version": "4.2.2", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/bare-process/-/bare-process-4.5.0.tgz", + "integrity": "sha512-NTtYDiwleJjWWNg4+yzS6B/RovL/LLPHVvoOM+18W+dYAXCmky0zFfN66hqqBbrlGAlb52/QgKrdzPR3x1QyHA==", "license": "Apache-2.0", "dependencies": { + "bare-abort": "^2.0.13", "bare-env": "^3.0.0", "bare-events": "^2.3.1", "bare-hrtime": "^2.0.0", - "bare-os": "^3.5.0", - "bare-pipe": "^4.0.0", + "bare-os": "^3.7.1", + "bare-posix": "^1.0.1", "bare-signals": "^4.0.0", - "bare-tty": "^5.0.0" + "bare-stdio": "^1.0.1" } }, "node_modules/bare-punycode": { "version": "0.0.0", + "resolved": "https://registry.npmjs.org/bare-punycode/-/bare-punycode-0.0.0.tgz", + "integrity": "sha512-PC2Y6mGLytZPJCB9M7CvO5Zb6uWYVUZ+5t3L6vePFuFM6tdC6SsQ+sIsuf0Sa6LHBoWURX7I9yMMbPXMv7TIdQ==", "license": "Apache-2.0", "dependencies": { "punycode": "^2.3.1" } }, "node_modules/bare-querystring": { - "version": "1.0.0", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bare-querystring/-/bare-querystring-1.1.0.tgz", + "integrity": "sha512-pUtEM6JrX53MbEJFwO92F0Ch7BwZ67KD7LyglcB8/tvkkVdwTgN1f7oIklRe+NTT/WCYZgwjDFYS9efBxDSq8g==", "license": "Apache-2.0" }, "node_modules/bare-readline": { - "version": "1.2.1", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/bare-readline/-/bare-readline-1.3.1.tgz", + "integrity": "sha512-QtSU4ZfgQcDI6AQssjDFqTiRe4rCiciMn+Yqx6siMJZBIftAIFrNSOK0sa5SBrmNv/a7CD9Dm0onUDCRyn5Fdg==", "license": "Apache-2.0", "dependencies": { "bare-ansi-escapes": "^2.0.0", @@ -3138,18 +3439,22 @@ } }, "node_modules/bare-realm": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bare-realm/-/bare-realm-2.0.1.tgz", + "integrity": "sha512-kQbYU6AAQu4XBTQesuz2+PpjBx7MJzf5Qw3nSLzQCzbVglx7Ml85MtWEjUe1AeslXqrd+nFPHMEbL55ouISscA==", "license": "Apache-2.0", "engines": { "bare": ">=1.5.0" } }, "node_modules/bare-repl": { - "version": "6.0.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/bare-repl/-/bare-repl-6.1.0.tgz", + "integrity": "sha512-pVTbak3RQCUxC0Z4kiMjS0S+P5wJedU5947yV6rTtOmhmQ62GYdoruPMJGTcSONsX2KJd+lHzxVipoIXSfvfIw==", "license": "Apache-2.0", "dependencies": { "bare-inspect": "^3.0.0", - "bare-module": "^6.0.1", + "bare-module": "^6.4.0", "bare-os": "^3.0.1", "bare-path": "^3.0.0", "bare-pipe": "^4.0.0", @@ -3159,11 +3464,15 @@ } }, "node_modules/bare-semver": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.1.0.tgz", + "integrity": "sha512-1Hw5qJ7hXdVt3uPUqjeFTuxyvBUJauvz5A1I2jk8gzjZMHp04n//6nV9MDbG9CMw78JHY2lGV0w6s//LrASm2w==", "license": "Apache-2.0" }, "node_modules/bare-signals": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/bare-signals/-/bare-signals-4.2.0.tgz", + "integrity": "sha512-fNHMOdQIlYuTvMB3Oh9Apk99hLKn351+Ir8vz+khiPTcOqIyGG4uWWjdLTzxWdYGsA0eT+We3y0K74hjj2nq7A==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.5.3", @@ -3187,12 +3496,24 @@ } } }, + "node_modules/bare-stdio": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bare-stdio/-/bare-stdio-1.0.2.tgz", + "integrity": "sha512-3WJDqtvVGP4f+j68kyEC05umOYNwKJ1xG+YAXL8yZ605WgNqiRhVaFq+mVIhBt2eKNp7pa5vCQdhOt1pNh79SA==", + "license": "Apache-2.0", + "dependencies": { + "bare-fs": "^4.5.2", + "bare-pipe": "^4.1.5", + "bare-tty": "^5.0.3" + } + }, "node_modules/bare-stream": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.1.tgz", - "integrity": "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==", + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", + "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==", "license": "Apache-2.0", "dependencies": { + "b4a": "^1.8.1", "streamx": "^2.25.0", "teex": "^1.0.1" }, @@ -3215,6 +3536,8 @@ }, "node_modules/bare-string-decoder": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bare-string-decoder/-/bare-string-decoder-1.0.0.tgz", + "integrity": "sha512-FjFvfHo88U7borNQSj9ijP2JTb1asqY6K28OZrix4dF9iZf5D2wi1+99CgLlHT3HtYqdwxRhDAiKu8rVstt5rQ==", "license": "Apache-2.0", "dependencies": { "text-decoder": "^1.2.3" @@ -3229,26 +3552,28 @@ } }, "node_modules/bare-structured-clone": { - "version": "1.5.2", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/bare-structured-clone/-/bare-structured-clone-1.6.0.tgz", + "integrity": "sha512-AZjEERyqF7kAuudlmgrweT2KwwWM0LsGG4Gx/bWyFwJrKU7E3wNG8c09z2DIrdw93p3vDtfOX8fyHOcXfy5m+g==", "license": "Apache-2.0", "dependencies": { + "bare-buffer": "^3.6.0", "bare-type": "^1.1.0", - "compact-encoding": "^2.15.0" + "bare-url": "^2.4.0", + "compact-encoding": "^3.0.1" }, "engines": { "bare": ">=1.2.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-url": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-url": { - "optional": true - } + } + }, + "node_modules/bare-stylize": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/bare-stylize/-/bare-stylize-0.0.1.tgz", + "integrity": "sha512-l3MjmIl476bWijYWf3RbE+osl4iuXSOMudzp0vAqzIK7gPgn/+G3oAxp8Oin9CFF911KBP0LO9kts8Ci8mGZaQ==", + "license": "Apache-2.0", + "dependencies": { + "bare-ansi-escapes": "^2.2.3", + "bare-process": "^4.2.1" } }, "node_modules/bare-subprocess": { @@ -3278,16 +3603,18 @@ } }, "node_modules/bare-system-logger": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bare-system-logger/-/bare-system-logger-1.0.3.tgz", + "integrity": "sha512-HXTXZyhIIS4ZDYun4J9zKNQZDfLgEkkK8wy9nrTFJE5xq8APsOhDxuEsxP0YcNwC23DW1jaNpqD51zDeXPzIdg==", "license": "Apache-2.0", "dependencies": { "bare-logger": "^2.0.0" } }, "node_modules/bare-tcp": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-tcp/-/bare-tcp-2.5.0.tgz", - "integrity": "sha512-lwUy3jSVoloVBbCCyPFmmqT1KaeBk/XEkpLMHU+BCap8WNXc48iQfiWEQYgJkCRYuP6vnkZ0XHCLY222TJ29Wg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/bare-tcp/-/bare-tcp-2.5.1.tgz", + "integrity": "sha512-N32OosAegmGzksr/huxIYLU/uaUARte6utO+vAu/EPQztMM7iAC55VeQSfzr2/XBJoz2OIETMvmU7/sdfiOGjw==", "license": "Apache-2.0", "dependencies": { "bare-dns": "^2.0.4", @@ -3307,16 +3634,21 @@ } }, "node_modules/bare-thread": { - "version": "1.1.6", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/bare-thread/-/bare-thread-1.2.4.tgz", + "integrity": "sha512-MnqMCGVp2JJJNXgwUBC8hw+J4FrTeLkLgfCPPl5tQK6MbtV2Efi6LKK5v819VRY0da+AXlCbgssbAVge31NfRg==", "license": "Apache-2.0", "dependencies": { "bare-bundle": "^1.9.0", "bare-module-resolve": "^1.11.2", - "bare-module-traverse": "^2.0.0" + "bare-module-traverse": "^2.0.0", + "bare-url": "^2.4.2" } }, "node_modules/bare-timers": { - "version": "3.2.0", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/bare-timers/-/bare-timers-3.2.1.tgz", + "integrity": "sha512-O+9e6Jol/BoYsQUzAFXG0gWUW1GWryFMblGcNBfi3smPrD3rJIKQwpw2FJARl2j/1VHne4a8YaHPK1cxDKfiYQ==", "license": "Apache-2.0", "engines": { "bare": ">=1.7.0" @@ -3344,7 +3676,9 @@ } }, "node_modules/bare-tty": { - "version": "5.0.3", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bare-tty/-/bare-tty-5.1.1.tgz", + "integrity": "sha512-cXCMAlcLCFTCWwCtXBIhDuXa4hutTEbrHHIK5pvSSb4BLaSGJ9tvxVN3mvGOvXXqONS7l04mTiP+eIUlZKI92g==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.2.0", @@ -3357,11 +3691,30 @@ }, "node_modules/bare-type": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bare-type/-/bare-type-1.1.0.tgz", + "integrity": "sha512-LdtnnEEYldOc87Dr4GpsKnStStZk3zfgoEMXy8yvEZkXrcCv9RtYDrUYWFsBQHtaB0s1EUWmcvS6XmEZYIj3Bw==", "license": "Apache-2.0", "engines": { "bare": ">=1.2.0" } }, + "node_modules/bare-type-stripper": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/bare-type-stripper/-/bare-type-stripper-0.1.2.tgz", + "integrity": "sha512-ArhqyRF9PramHfuSkZHp6DeMg8UdXWN2vjH0dvJ8PNJW15UDM6X/cSeT40R1IsKbyFgpM6+lZd2ZBlAKmKaGyg==", + "license": "Apache-2.0", + "dependencies": { + "require-addon": "^1.0.2" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, "node_modules/bare-url": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz", @@ -3372,35 +3725,46 @@ } }, "node_modules/bare-utils": { - "version": "1.5.1", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/bare-utils/-/bare-utils-1.6.0.tgz", + "integrity": "sha512-WhQEIkkAxkSnW7u1QgrI0AfNm5JpMruETXeYsb5qnkBJ0TTfNKygZmsh6rkoHBANaV+C/7Jed7bJP9OmEHG7rQ==", "license": "Apache-2.0", "dependencies": { "bare-debug-log": "^2.0.0", "bare-encoding": "^1.0.0", "bare-format": "^1.0.0", "bare-inspect": "^3.0.0", + "bare-stylize": "^0.0.1", "bare-type": "^1.0.6" } }, "node_modules/bare-v8": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bare-v8/-/bare-v8-1.0.1.tgz", + "integrity": "sha512-/cR5ZvFWQRdtTZ4tx0j7TKvTWce8UnnLqm88fwHtJmfM7HODIBVjQGDT7KkDLeD2d/eHP2pzB71Y8/QyiMMKrQ==", "license": "Apache-2.0" }, "node_modules/bare-vm": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bare-vm/-/bare-vm-1.0.1.tgz", + "integrity": "sha512-yLnbRvKt3AhRTmtfTIrYfdTHqGEfIJc+Fgb2DcHejE0HJ+p5adGxxPMvd3893Z7iXVYnalxukNARn4oJSZELHQ==", "license": "Apache-2.0", "dependencies": { "bare-realm": "^2.0.0" } }, "node_modules/bare-worker": { - "version": "4.1.6", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/bare-worker/-/bare-worker-4.3.0.tgz", + "integrity": "sha512-aWwGexQlMqXWHH7GjvWrLUKI4o5ZPfNQVCr0QdY79JBu0hKLaRXvwos80YpCgKxl8eSaQtCEQHR0qRAxPvs8zA==", "license": "Apache-2.0", "dependencies": { + "bare-broadcast-channel": "^0.2.0", "bare-channel": "^5.1.5", "bare-events": "^2.2.1", - "bare-module": "^6.0.1", - "bare-thread": "^1.1.3" + "bare-module": "^6.4.0", + "bare-stream": "^2.13.3", + "bare-thread": "^1.2.2" } }, "node_modules/bare-ws": { @@ -3446,9 +3810,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.38", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", - "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "version": "2.10.40", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", + "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3473,15 +3837,17 @@ }, "node_modules/bip39": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", "license": "ISC", "dependencies": { "@noble/hashes": "^1.2.0" } }, "node_modules/bn.js": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", - "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.4.tgz", + "integrity": "sha512-QL7sb18rJ1PbdsKsqPA0guxL563vIMwRHgzNrW/uzQuRGN1Cjqd/wonUBAVqHox9KwzHA6vCbM0lXx3k4iQMow==", "dev": true, "license": "MIT" }, @@ -3534,6 +3900,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -3593,6 +3961,8 @@ }, "node_modules/bser": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3601,11 +3971,15 @@ }, "node_modules/buffer-from": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/builtins": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "license": "MIT", "dependencies": { @@ -3613,7 +3987,9 @@ } }, "node_modules/builtins/node_modules/semver": { - "version": "7.7.3", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -3634,13 +4010,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -3652,6 +4030,8 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3664,6 +4044,8 @@ }, "node_modules/call-bound": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { @@ -3679,6 +4061,8 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -3687,6 +4071,8 @@ }, "node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -3719,6 +4105,8 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -3734,6 +4122,8 @@ }, "node_modules/char-regex": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { @@ -3765,6 +4155,8 @@ }, "node_modules/cjs-module-lexer": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, "license": "MIT" }, @@ -3793,6 +4185,8 @@ }, "node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3806,6 +4200,8 @@ }, "node_modules/co": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { @@ -3815,11 +4211,15 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3831,6 +4231,8 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, @@ -3852,7 +4254,9 @@ } }, "node_modules/compact-encoding": { - "version": "2.18.0", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-3.3.0.tgz", + "integrity": "sha512-e64XyzlBvTRJ3iScuU/U2w25Dglkm7fhrRbrGaHIwuTlNnzjRKMaQBCVl7mJRvZg7wI5a9wX1IVTXCuaAANNkw==", "license": "Apache-2.0", "dependencies": { "b4a": "^1.3.0" @@ -3860,11 +4264,15 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, @@ -3884,6 +4292,8 @@ }, "node_modules/create-jest": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3904,6 +4314,8 @@ }, "node_modules/cross-env": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "license": "MIT", "dependencies": { @@ -3921,6 +4333,8 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -3934,6 +4348,8 @@ }, "node_modules/data-view-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3950,6 +4366,8 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3966,6 +4384,8 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3982,6 +4402,8 @@ }, "node_modules/debug": { "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -4010,7 +4432,9 @@ } }, "node_modules/dedent": { - "version": "1.7.1", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -4024,11 +4448,15 @@ }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -4037,6 +4465,8 @@ }, "node_modules/define-data-property": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { @@ -4053,6 +4483,8 @@ }, "node_modules/define-properties": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -4079,6 +4511,8 @@ }, "node_modules/detect-newline": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { @@ -4097,6 +4531,8 @@ }, "node_modules/diff-sequences": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { @@ -4105,6 +4541,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4116,6 +4554,8 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { @@ -4128,9 +4568,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.377", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.377.tgz", - "integrity": "sha512-cH1jZgJHoezfTnKfKwnScpHywTFVnJUNITDPREFdhNjiuD502+QFpG0Qk7G8jhsV/f+CEAFlIrzP1fT+IMb92g==", + "version": "1.5.381", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.381.tgz", + "integrity": "sha512-n9Wa6yB+vDsGuA8AKbl/0z7HbvWqt5jxIdvr1IUicd0ryPrk7/xzwqLv8D9AbbvZ6avVNtXYLTfmgFHkwkyelg==", "dev": true, "license": "ISC" }, @@ -4151,14 +4591,16 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.4.tgz", + "integrity": "sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==", "dev": true, "license": "MIT" }, "node_modules/emittery": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { @@ -4170,6 +4612,8 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, @@ -4199,6 +4643,8 @@ }, "node_modules/error-ex": { "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4206,7 +4652,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.1", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -4272,8 +4720,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { @@ -4282,6 +4751,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { @@ -4289,14 +4760,16 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.2", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.3.tgz", + "integrity": "sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.24.1", + "es-abstract": "^1.24.2", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", @@ -4308,14 +4781,16 @@ "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", - "safe-array-concat": "^1.1.3" + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { - "version": "1.1.1", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -4327,6 +4802,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -4341,6 +4818,8 @@ }, "node_modules/es-shim-unscopables": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { @@ -4351,13 +4830,18 @@ } }, "node_modules/es-to-primitive": { - "version": "1.3.0", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -4368,6 +4852,8 @@ }, "node_modules/escalade": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -4376,6 +4862,8 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -4387,6 +4875,9 @@ }, "node_modules/eslint": { "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { @@ -4441,6 +4932,8 @@ }, "node_modules/eslint-config-standard": { "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "funding": [ { @@ -4469,6 +4962,8 @@ }, "node_modules/eslint-config-standard-jsx": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", "dev": true, "funding": [ { @@ -4491,17 +4986,21 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4509,11 +5008,16 @@ } }, "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.11", + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.1", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4528,7 +5032,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.1", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", + "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4545,6 +5051,8 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4553,6 +5061,8 @@ }, "node_modules/eslint-plugin-es": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4571,6 +5081,8 @@ }, "node_modules/eslint-plugin-es/node_modules/eslint-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -4585,6 +5097,8 @@ }, "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4593,6 +5107,8 @@ }, "node_modules/eslint-plugin-import": { "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { @@ -4625,6 +5141,8 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4633,6 +5151,8 @@ }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4644,6 +5164,8 @@ }, "node_modules/eslint-plugin-n": { "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4667,10 +5189,13 @@ } }, "node_modules/eslint-plugin-n/node_modules/resolve": { - "version": "1.22.11", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -4686,7 +5211,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.7.3", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -4698,6 +5225,8 @@ }, "node_modules/eslint-plugin-promise": { "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, "license": "ISC", "engines": { @@ -4712,6 +5241,8 @@ }, "node_modules/eslint-plugin-react": { "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", "dependencies": { @@ -4743,6 +5274,8 @@ }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4753,23 +5286,33 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/eslint-scope": { "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4785,6 +5328,8 @@ }, "node_modules/eslint-utils": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "license": "MIT", "dependencies": { @@ -4802,6 +5347,8 @@ }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4810,6 +5357,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4821,13 +5370,15 @@ }, "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/eslint/node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, "funding": [ { @@ -4849,6 +5400,8 @@ }, "node_modules/espree": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4865,6 +5418,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -4877,6 +5432,8 @@ }, "node_modules/esquery": { "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4888,6 +5445,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4899,6 +5458,8 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -4907,6 +5468,8 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -4980,18 +5543,10 @@ "node": ">=14.0.0" } }, - "node_modules/ethers/node_modules/@noble/curves": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/ethers/node_modules/@noble/hashes": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "license": "MIT", "engines": { "node": ">= 16" @@ -5002,6 +5557,8 @@ }, "node_modules/events-universal": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", "license": "Apache-2.0", "dependencies": { "bare-events": "^2.7.0" @@ -5009,6 +5566,8 @@ }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { @@ -5031,6 +5590,8 @@ }, "node_modules/exit": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -5038,6 +5599,8 @@ }, "node_modules/expect": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { @@ -5053,25 +5616,35 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-fifo": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -5080,6 +5653,8 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5088,6 +5663,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { @@ -5099,6 +5676,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -5110,6 +5689,8 @@ }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -5135,6 +5716,8 @@ }, "node_modules/flat-cache": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { @@ -5176,6 +5759,8 @@ }, "node_modules/for-each": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { @@ -5212,12 +5797,17 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -5229,6 +5819,8 @@ }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", "funding": { @@ -5236,16 +5828,21 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.8", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5256,6 +5853,8 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { @@ -5264,6 +5863,8 @@ }, "node_modules/generator-function": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", "engines": { @@ -5272,6 +5873,8 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -5280,6 +5883,8 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -5288,6 +5893,8 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5311,6 +5918,8 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -5319,6 +5928,8 @@ }, "node_modules/get-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { @@ -5331,6 +5942,8 @@ }, "node_modules/get-stdin": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true, "license": "MIT", "engines": { @@ -5342,6 +5955,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", "engines": { @@ -5353,6 +5968,8 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { @@ -5369,6 +5986,9 @@ }, "node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -5388,6 +6008,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -5399,6 +6021,8 @@ }, "node_modules/globals": { "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5413,6 +6037,8 @@ }, "node_modules/globals/node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -5424,6 +6050,8 @@ }, "node_modules/globalthis": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5439,6 +6067,8 @@ }, "node_modules/gopd": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { @@ -5450,11 +6080,15 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, @@ -5547,6 +6181,8 @@ }, "node_modules/has-bigints": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { @@ -5558,6 +6194,8 @@ }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -5566,6 +6204,8 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { @@ -5577,6 +6217,8 @@ }, "node_modules/has-proto": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5591,6 +6233,8 @@ }, "node_modules/has-symbols": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -5602,6 +6246,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -5626,7 +6272,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -5660,6 +6308,8 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, @@ -5700,6 +6350,8 @@ }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5721,6 +6373,8 @@ }, "node_modules/ignore": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -5736,6 +6390,8 @@ }, "node_modules/import-fresh": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5751,6 +6407,8 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -5759,6 +6417,8 @@ }, "node_modules/import-local": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -5777,6 +6437,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -5795,6 +6457,9 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -5804,11 +6469,15 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/internal-slot": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { @@ -5832,6 +6501,8 @@ }, "node_modules/is-array-buffer": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { @@ -5848,11 +6519,15 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5871,6 +6546,8 @@ }, "node_modules/is-bigint": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5898,6 +6575,8 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { @@ -5913,6 +6592,8 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -5923,11 +6604,13 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -5938,6 +6621,8 @@ }, "node_modules/is-data-view": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { @@ -5954,6 +6639,8 @@ }, "node_modules/is-date-object": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { @@ -5967,8 +6654,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -5977,6 +6682,8 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { @@ -5991,6 +6698,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -5999,6 +6708,8 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { @@ -6007,6 +6718,8 @@ }, "node_modules/is-generator-function": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { @@ -6025,6 +6738,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -6036,6 +6751,8 @@ }, "node_modules/is-map": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -6047,6 +6764,8 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { @@ -6058,6 +6777,8 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -6066,6 +6787,8 @@ }, "node_modules/is-number-object": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -6081,6 +6804,8 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", "engines": { @@ -6099,6 +6824,8 @@ }, "node_modules/is-regex": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { @@ -6116,6 +6843,8 @@ }, "node_modules/is-set": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -6127,6 +6856,8 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { @@ -6141,6 +6872,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { @@ -6152,6 +6885,8 @@ }, "node_modules/is-string": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { @@ -6167,6 +6902,8 @@ }, "node_modules/is-symbol": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { @@ -6183,6 +6920,8 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6210,6 +6949,8 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -6221,6 +6962,8 @@ }, "node_modules/is-weakref": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { @@ -6235,6 +6978,8 @@ }, "node_modules/is-weakset": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6250,16 +6995,22 @@ }, "node_modules/isarray": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -6268,6 +7019,8 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6282,7 +7035,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.3", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -6294,6 +7049,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6307,6 +7064,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6320,6 +7079,8 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6332,6 +7093,8 @@ }, "node_modules/iterator.prototype": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, "license": "MIT", "dependencies": { @@ -6348,6 +7111,8 @@ }, "node_modules/jest": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -6373,6 +7138,8 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { @@ -6386,6 +7153,8 @@ }, "node_modules/jest-circus": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { @@ -6416,6 +7185,8 @@ }, "node_modules/jest-cli": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { @@ -6448,6 +7219,8 @@ }, "node_modules/jest-config": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6492,6 +7265,8 @@ }, "node_modules/jest-config/node_modules/ci-info": { "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -6506,6 +7281,8 @@ }, "node_modules/jest-diff": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { @@ -6520,6 +7297,8 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { @@ -6531,6 +7310,8 @@ }, "node_modules/jest-each": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6546,6 +7327,8 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "dependencies": { @@ -6562,6 +7345,8 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", "engines": { @@ -6570,6 +7355,8 @@ }, "node_modules/jest-haste-map": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { @@ -6594,6 +7381,8 @@ }, "node_modules/jest-leak-detector": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { @@ -6606,6 +7395,8 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { @@ -6620,6 +7411,8 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { @@ -6639,6 +7432,8 @@ }, "node_modules/jest-mock": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", "dependencies": { @@ -6652,6 +7447,8 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { @@ -6668,6 +7465,8 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", "engines": { @@ -6676,6 +7475,8 @@ }, "node_modules/jest-resolve": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { @@ -6695,6 +7496,8 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { @@ -6706,10 +7509,13 @@ } }, "node_modules/jest-resolve/node_modules/resolve": { - "version": "1.22.11", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -6726,6 +7532,8 @@ }, "node_modules/jest-runner": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6757,6 +7565,8 @@ }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { @@ -6766,6 +7576,8 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6798,6 +7610,8 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { @@ -6827,7 +7641,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.3", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -6839,6 +7655,8 @@ }, "node_modules/jest-util": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { @@ -6855,6 +7673,8 @@ }, "node_modules/jest-util/node_modules/ci-info": { "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -6869,6 +7689,8 @@ }, "node_modules/jest-validate": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", "dependencies": { @@ -6885,6 +7707,8 @@ }, "node_modules/jest-watcher": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { @@ -6903,6 +7727,8 @@ }, "node_modules/jest-worker": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { @@ -6917,6 +7743,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6938,11 +7766,15 @@ }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.2", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", + "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", "dev": true, "license": "MIT", "dependencies": { @@ -6955,6 +7787,8 @@ }, "node_modules/jsesc": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -6966,26 +7800,36 @@ }, "node_modules/json-buffer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, @@ -7001,6 +7845,8 @@ }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -7022,6 +7868,8 @@ }, "node_modules/jsx-ast-utils": { "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7052,6 +7900,8 @@ }, "node_modules/keyv": { "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -7060,6 +7910,8 @@ }, "node_modules/kleur": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", "engines": { @@ -7068,6 +7920,8 @@ }, "node_modules/leven": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", "engines": { @@ -7076,6 +7930,8 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7088,11 +7944,15 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/load-json-file": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", "dev": true, "license": "MIT", "dependencies": { @@ -7108,6 +7968,8 @@ }, "node_modules/load-json-file/node_modules/parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", "dependencies": { @@ -7120,6 +7982,8 @@ }, "node_modules/load-json-file/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -7128,6 +7992,8 @@ }, "node_modules/load-json-file/node_modules/type-fest": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -7136,6 +8002,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -7157,11 +8025,16 @@ }, "node_modules/lodash.isequal": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, @@ -7184,6 +8057,8 @@ }, "node_modules/loose-envify": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7212,6 +8087,8 @@ }, "node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -7225,7 +8102,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.7.3", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -7237,6 +8116,8 @@ }, "node_modules/makeerror": { "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7245,6 +8126,8 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { @@ -7262,6 +8145,8 @@ }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, @@ -7331,6 +8216,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -7343,6 +8230,8 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { @@ -7365,6 +8254,8 @@ }, "node_modules/minimatch": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -7376,6 +8267,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", "funding": { @@ -7507,9 +8400,9 @@ } }, "node_modules/mocha/node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, "funding": [ { @@ -7592,11 +8485,15 @@ }, "node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, @@ -7607,6 +8504,25 @@ "dev": true, "license": "MIT" }, + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", @@ -7621,13 +8537,15 @@ }, "node_modules/node-int64": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.48", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz", - "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", "dev": true, "license": "MIT", "engines": { @@ -7636,6 +8554,8 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -7644,6 +8564,8 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { @@ -7655,6 +8577,8 @@ }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { @@ -7663,6 +8587,8 @@ }, "node_modules/object-inspect": { "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -7674,6 +8600,8 @@ }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { @@ -7682,6 +8610,8 @@ }, "node_modules/object.assign": { "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { @@ -7701,6 +8631,8 @@ }, "node_modules/object.entries": { "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "license": "MIT", "dependencies": { @@ -7715,6 +8647,8 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7732,6 +8666,8 @@ }, "node_modules/object.groupby": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7745,6 +8681,8 @@ }, "node_modules/object.values": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -7769,6 +8707,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", "dependencies": { @@ -7777,6 +8717,8 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { @@ -7791,6 +8733,8 @@ }, "node_modules/optionator": { "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -7807,6 +8751,8 @@ }, "node_modules/own-keys": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", "dependencies": { @@ -7823,6 +8769,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7837,6 +8785,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -7867,6 +8817,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -7875,6 +8827,8 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -7886,6 +8840,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { @@ -7903,6 +8859,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -7911,6 +8869,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { @@ -7919,6 +8879,8 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -7927,16 +8889,22 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -7948,6 +8916,8 @@ }, "node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "license": "MIT", "engines": { @@ -7956,6 +8926,8 @@ }, "node_modules/pirates": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", "engines": { @@ -7964,6 +8936,8 @@ }, "node_modules/pkg-conf": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7976,6 +8950,8 @@ }, "node_modules/pkg-conf/node_modules/find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "license": "MIT", "dependencies": { @@ -7987,6 +8963,8 @@ }, "node_modules/pkg-conf/node_modules/locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "license": "MIT", "dependencies": { @@ -7999,6 +8977,8 @@ }, "node_modules/pkg-conf/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -8013,6 +8993,8 @@ }, "node_modules/pkg-conf/node_modules/p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8024,6 +9006,8 @@ }, "node_modules/pkg-conf/node_modules/path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", "engines": { @@ -8032,6 +9016,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8043,6 +9029,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -8055,6 +9043,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -8066,6 +9056,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -8080,6 +9072,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -8091,6 +9085,8 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -8099,6 +9095,8 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -8107,6 +9105,8 @@ }, "node_modules/pretty-format": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8120,6 +9120,8 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { @@ -8131,6 +9133,8 @@ }, "node_modules/prompts": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8143,6 +9147,8 @@ }, "node_modules/prop-types": { "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "license": "MIT", "dependencies": { @@ -8153,11 +9159,15 @@ }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -8165,6 +9175,8 @@ }, "node_modules/pure-rand": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -8180,6 +9192,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -8215,6 +9229,8 @@ }, "node_modules/react-is": { "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, @@ -8249,6 +9265,8 @@ }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { @@ -8270,6 +9288,8 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { @@ -8289,6 +9309,8 @@ }, "node_modules/regexpp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "license": "MIT", "engines": { @@ -8300,6 +9322,8 @@ }, "node_modules/require-addon": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/require-addon/-/require-addon-1.2.0.tgz", + "integrity": "sha512-VNPDZlYgIYQwWp9jMTzljx+k0ZtatKlcvOhktZ/anNPI3dQ9NXk7cq2U4iJ1wd9IrytRnYhyEocFWbkdPb+MYA==", "license": "Apache-2.0", "dependencies": { "bare-addon-resolve": "^1.3.0" @@ -8310,6 +9334,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -8331,6 +9357,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -8342,6 +9370,8 @@ }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -8350,6 +9380,8 @@ }, "node_modules/resolve.exports": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", "engines": { @@ -8358,6 +9390,8 @@ }, "node_modules/reusify": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -8367,6 +9401,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -8381,6 +9418,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -8402,13 +9441,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -8442,6 +9483,8 @@ }, "node_modules/safe-push-apply": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { @@ -8457,6 +9500,8 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { @@ -8480,6 +9525,8 @@ }, "node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -8498,6 +9545,8 @@ }, "node_modules/set-function-length": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { @@ -8514,6 +9563,8 @@ }, "node_modules/set-function-name": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8528,6 +9579,8 @@ }, "node_modules/set-proto": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", "dependencies": { @@ -8548,6 +9601,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -8559,6 +9614,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -8566,13 +9623,15 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -8584,12 +9643,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -8600,6 +9661,8 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { @@ -8617,6 +9680,8 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { @@ -8635,16 +9700,22 @@ }, "node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/sisteransi": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { @@ -8652,9 +9723,12 @@ } }, "node_modules/sodium-native": { - "version": "5.0.10", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-5.1.0.tgz", + "integrity": "sha512-3RxgyWyJlhTsABPnJVpCI5CoTDANZTqqFrEPqr+kjfnRaBihpVtMUE3yTF40ukdoB1APXeoBNKF3MzZAIHg39g==", "license": "MIT", "dependencies": { + "bare-assert": "^1.2.0", "require-addon": "^1.1.0", "which-runtime": "^1.2.1" }, @@ -8664,6 +9738,8 @@ }, "node_modules/sodium-universal": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-5.0.1.tgz", + "integrity": "sha512-rv+aH+tnKB5H0MAc2UadHShLMslpJsc4wjdnHRtiSIEYpOetCgu8MS4ExQRia+GL/MK3uuCyZPeEsi+J3h+Q+Q==", "license": "MIT", "dependencies": { "sodium-native": "^5.0.1" @@ -8711,6 +9787,8 @@ }, "node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -8730,11 +9808,15 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8746,6 +9828,8 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", "engines": { @@ -8777,6 +9861,8 @@ }, "node_modules/standard": { "version": "17.1.2", + "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz", + "integrity": "sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==", "dev": true, "funding": [ { @@ -8813,6 +9899,8 @@ }, "node_modules/standard-engine": { "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", "dev": true, "funding": [ { @@ -8851,6 +9939,8 @@ }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8862,9 +9952,9 @@ } }, "node_modules/streamx": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.27.0.tgz", - "integrity": "sha512-WZ189TKnHoAokYHvwzaAQMpd55cgUmFIcJFzBSgGcb886jau5DL+XdDhTWV4ps3FLvk+OORp0dLRTPsLZ21CSA==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", + "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", "license": "MIT", "dependencies": { "events-universal": "^1.0.0", @@ -8884,6 +9974,8 @@ }, "node_modules/string-length": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8896,6 +9988,8 @@ }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -8909,6 +10003,8 @@ }, "node_modules/string.prototype.matchall": { "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "license": "MIT", "dependencies": { @@ -8935,6 +10031,8 @@ }, "node_modules/string.prototype.repeat": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "license": "MIT", "dependencies": { @@ -8943,17 +10041,20 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.10", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8963,14 +10064,16 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.2" }, "engines": { "node": ">= 0.4" @@ -8981,6 +10084,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { @@ -8997,6 +10102,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -9008,6 +10115,8 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -9016,6 +10125,8 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { @@ -9024,6 +10135,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -9035,6 +10148,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -9046,6 +10161,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -9066,6 +10183,8 @@ }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", "dependencies": { @@ -9078,7 +10197,9 @@ } }, "node_modules/text-decoder": { - "version": "1.2.3", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" @@ -9086,6 +10207,8 @@ }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, @@ -9149,11 +10272,15 @@ }, "node_modules/tmpl": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9175,6 +10302,8 @@ }, "node_modules/tsconfig-paths": { "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "dependencies": { @@ -9186,6 +10315,8 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { @@ -9197,6 +10328,8 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -9205,6 +10338,8 @@ }, "node_modules/tslib": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, "node_modules/tsort": { @@ -9216,6 +10351,8 @@ }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -9227,6 +10364,8 @@ }, "node_modules/type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", "engines": { @@ -9235,6 +10374,8 @@ }, "node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -9246,6 +10387,8 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { @@ -9259,6 +10402,8 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { @@ -9277,6 +10422,8 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9296,16 +10443,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -9329,7 +10478,9 @@ } }, "node_modules/udx-native": { - "version": "1.19.2", + "version": "1.20.7", + "resolved": "https://registry.npmjs.org/udx-native/-/udx-native-1.20.7.tgz", + "integrity": "sha512-FNG0QpnSt0us2xbLP5mmG5Q0UKdLYjKHuh2eR9VrJSFmoZMzeszYLLhK12+iq5x3eq/rgoGG/lLwPn7IDAr6pg==", "license": "Apache-2.0", "dependencies": { "b4a": "^1.5.0", @@ -9343,6 +10494,8 @@ }, "node_modules/unbox-primitive": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { @@ -9370,6 +10523,8 @@ }, "node_modules/undici-types": { "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, "node_modules/universalify": { @@ -9425,6 +10580,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9454,6 +10611,8 @@ }, "node_modules/v8-to-istanbul": { "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { @@ -9467,6 +10626,8 @@ }, "node_modules/version-guard": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz", + "integrity": "sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==", "dev": true, "license": "0BSD", "engines": { @@ -9475,6 +10636,8 @@ }, "node_modules/walker": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9483,6 +10646,8 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -9497,6 +10662,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { @@ -9515,6 +10682,8 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9541,6 +10710,8 @@ }, "node_modules/which-collection": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { @@ -9557,16 +10728,20 @@ } }, "node_modules/which-runtime": { - "version": "1.3.2", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/which-runtime/-/which-runtime-1.4.0.tgz", + "integrity": "sha512-0ugbP4CJW4e2D20jvEcC4973dCgIaHI4Rw1PT+26U9zEve7FyYdWAIwUnoeOYvoCfn+wXHoHTKb1KhkYlb60Pw==", "license": "Apache-2.0" }, "node_modules/which-typed-array": { - "version": "1.1.20", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -9595,6 +10770,8 @@ }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -9610,6 +10787,8 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9626,11 +10805,15 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", "dependencies": { @@ -9664,6 +10847,8 @@ }, "node_modules/xdg-basedir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true, "license": "MIT", "engines": { @@ -9672,6 +10857,8 @@ }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -9686,7 +10873,9 @@ "license": "ISC" }, "node_modules/yargs": { - "version": "17.7.2", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, "license": "MIT", "dependencies": { @@ -9730,6 +10919,8 @@ }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { @@ -9738,6 +10929,8 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 3c985c1..3b082fd 100644 --- a/package.json +++ b/package.json @@ -27,11 +27,10 @@ "test:integration:coverage": "cross-env NODE_OPTIONS=--experimental-vm-modules jest tests/integration --coverage" }, "dependencies": { - "@noble/curves": "1.9.2", "@noble/hashes": "1.8.0", "@noble/secp256k1": "2.2.3", + "@tetherto/wdk-wallet": "1.0.0-beta.12", "@tetherto/wdk-failover-provider": "1.0.0-beta.2", - "@tetherto/wdk-wallet": "1.0.0-beta.11", "bare-node-runtime": "^1.5.0", "bip39": "3.1.0", "ethers": "6.14.4", @@ -61,6 +60,10 @@ "bare": "./bare.js", "default": "./index.js" }, + "./signers": { + "types": "./types/src/signers/index.d.ts", + "default": "./src/signers/index.js" + }, "./package": { "default": "./package.json" } diff --git a/src/memory-safe/hd-node-wallet.js b/src/memory-safe/hd-node-wallet.js index 87058cf..9ac5069 100644 --- a/src/memory-safe/hd-node-wallet.js +++ b/src/memory-safe/hd-node-wallet.js @@ -156,14 +156,15 @@ export default class MemorySafeHDNodeWallet extends BaseWallet { } const { IR, IL } = serI(index, this.chainCode, this.publicKey, this.privateKeyBuffer) + const childPriv = new Uint8Array(this.privateKeyBuffer) - const overflow = addToPrivateKey(this.privateKeyBuffer, IL) + const overflow = addToPrivateKey(childPriv, IL) - if (overflow || compareWithCurveOrder(this.privateKeyBuffer) >= 0) { - subtractCurveOrderFromPrivateKey(this.privateKeyBuffer) + if (overflow || compareWithCurveOrder(childPriv) >= 0) { + subtractCurveOrderFromPrivateKey(childPriv) } - const ki = new MemorySafeSigningKey(this.privateKeyBuffer) + const ki = new MemorySafeSigningKey(childPriv) return new MemorySafeHDNodeWallet(_guard, ki, this.fingerprint, hexlify(IR), path, index, this.depth + 1, this.mnemonic, this.provider) diff --git a/src/memory-safe/signing-key.js b/src/memory-safe/signing-key.js index 10444bc..1a7bb7a 100644 --- a/src/memory-safe/signing-key.js +++ b/src/memory-safe/signing-key.js @@ -70,8 +70,9 @@ export default class MemorySafeSigningKey extends SigningKey { } dispose () { - sodium_memzero(this._privateKeyBuffer) - - this._privateKeyBuffer = undefined + if (this._privateKeyBuffer) { + sodium_memzero(this._privateKeyBuffer) + this._privateKeyBuffer = undefined + } } } diff --git a/src/signers/index.js b/src/signers/index.js new file mode 100644 index 0000000..244c5ba --- /dev/null +++ b/src/signers/index.js @@ -0,0 +1,25 @@ +// Copyright 2024 Tether Operations Limited +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// src/signers/index.js +/** + * Barrel exports for EVM signers. + * + * - `SeedSignerEvm`: derives accounts from a BIP-39 seed (BIP-44 path). + * - `PrivateKeySignerEvm`: memory-safe wrapper around a raw private key. + */ + +/** @typedef {import('../utils/tx-populator-evm.js').UnsignedEvmTransaction} UnsignedEvmTransaction */ + +export { default, default as SeedSignerEvm } from './seed-signer-evm.js' +export { default as PrivateKeySignerEvm } from './private-key-signer-evm.js' diff --git a/src/signers/private-key-signer-evm.js b/src/signers/private-key-signer-evm.js new file mode 100644 index 0000000..9aead87 --- /dev/null +++ b/src/signers/private-key-signer-evm.js @@ -0,0 +1,156 @@ +// Copyright 2024 Tether Operations Limited +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +'use strict' + +import { BaseWallet } from 'ethers' + +import { SignerError } from '@tetherto/wdk-wallet' + +import MemorySafeSigningKey from '../memory-safe/signing-key.js' +import { ISignerEvm } from './seed-signer-evm.js' + +/** @typedef {import('../utils/tx-populator-evm.js').UnsignedEvmTransaction} UnsignedEvmTransaction */ +/** @typedef {import('@tetherto/wdk-wallet').KeyPair} KeyPair */ +/** @typedef {import('ethers').AuthorizationRequest} AuthorizationRequest */ +/** @typedef {import('ethers').Authorization} Authorization */ +/** @typedef {import('../wallet-account-read-only-evm.js').TypedData} TypedData */ + +/** + * @extends {ISignerEvm} + * Signer that wraps a raw private key in a memory-safe buffer, exposing a minimal + * interface for signing messages, transactions and typed data. This signer does + * not support derivation and always represents a single account. + */ +export default class PrivateKeySignerEvm extends ISignerEvm { + /** + * Create a signer from a raw private key. + * + * @param {string|Uint8Array} privateKey - Hex string (with/without 0x) or raw key bytes. + */ + constructor (privateKey) { + super() + + // Expect a Uint8Array buffer; accept hex string as convenience + let privateKeyBuffer = privateKey + if (typeof privateKey === 'string') { + const hex = privateKey.startsWith('0x') ? privateKey.slice(2) : privateKey + privateKeyBuffer = new Uint8Array(Buffer.from(hex, 'hex')) + } + + /** @private */ + this._signingKey = new MemorySafeSigningKey(privateKeyBuffer) + /** @private */ + this._wallet = new BaseWallet(this._signingKey, null) + /** @private */ + this._address = this._wallet.address + /** @private */ + this._path = undefined + } + + /** + * Whether this signer can derive child signers. Always false: a private-key signer is a + * single standalone account and is bound directly to a wallet account. + * @type {boolean} + */ + get isDerivable () { return false } + + /** + * The account index. Always undefined for private key signers: a raw key has no + * BIP-44 position, so reporting an index would be misleading. + * @type {number|undefined} + */ + get index () { return undefined } + + /** + * The derivation path. Always undefined for private key signers. + * @type {string|undefined} + */ + get path () { return this._path } + + /** + * The account's address. + * @type {string} + */ + get address () { return this._address } + /** + * The account's key pair (private and public key buffers). + * @type {KeyPair} + */ + get keyPair () { + return { + privateKey: this._signingKey ? this._signingKey.privateKeyBuffer : null, + publicKey: this._signingKey ? this._signingKey.publicKeyBuffer : null + } + } + + /** + * PrivateKeySignerEvm is not a hierarchical signer and cannot derive. + * @returns {Promise} + * @throws {SignerError} Always — private-key signers do not support derivation. + */ + async derive () { + throw new SignerError('PrivateKeySignerEvm does not support derivation.') + } + + /** @returns {Promise} */ + async getAddress () { + return this._address + } + + /** + * Signs a message. + * + * @param {string} message - The message to sign. + * @returns {Promise} The message's signature. + */ + async sign (message) { + return this._wallet.signMessage(message) + } + + /** + * Signs a transaction and returns the serialized signed transaction hex. + * + * @param {UnsignedEvmTransaction} unsignedTx - The unsigned transaction object. + * @returns {Promise} + */ + async signTransaction (unsignedTx) { + return this._wallet.signTransaction(unsignedTx) + } + + /** + * Signs typed data according to EIP-712. + * + * @param {TypedData} typedData - The typed data to sign. + * @returns {Promise} The typed data signature. + */ + async signTypedData ({ domain, types, message }) { + return this._wallet.signTypedData(domain, types, message) + } + + /** + * Sign an ERC-7702 authorization tuple. + * @param {AuthorizationRequest} auth + * @returns {Promise} + */ + async signAuthorization (auth) { + return this._wallet.authorizeSync(auth) + } + + /** Dispose secrets from memory. */ + dispose () { + if (this._signingKey) this._signingKey.dispose() + this._signingKey = undefined + this._wallet = undefined + } +} diff --git a/src/signers/seed-signer-evm.js b/src/signers/seed-signer-evm.js new file mode 100644 index 0000000..158d770 --- /dev/null +++ b/src/signers/seed-signer-evm.js @@ -0,0 +1,313 @@ +// Copyright 2024 Tether Operations Limited +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +'use strict' + +import * as bip39 from 'bip39' + +import MemorySafeHDNodeWallet from '../memory-safe/hd-node-wallet.js' +import { ISigner, NotImplementedError } from '@tetherto/wdk-wallet' + +const BIP_44_ETH_DERIVATION_PATH_PREFIX = "m/44'/60'" + +// Relative path of the account derived when none is provided. +const DEFAULT_ACCOUNT_PATH = "0'/0/0" + +/** @typedef {import('../utils/tx-populator-evm.js').UnsignedEvmTransaction} UnsignedEvmTransaction */ +/** @typedef {import('@tetherto/wdk-wallet').ISigner} ISigner */ +/** @typedef {import('@tetherto/wdk-wallet').SignerError} SignerError */ +/** @typedef {import('@tetherto/wdk-wallet').KeyPair} KeyPair */ +/** @typedef {import('ethers').AuthorizationRequest} AuthorizationRequest */ +/** @typedef {import('ethers').Authorization} Authorization */ +/** @typedef {import('../wallet-account-read-only-evm.js').TypedData} TypedData */ +/** @typedef {import('../memory-safe/hd-node-wallet.js').default} MemorySafeHDNodeWallet */ + +/** + * @typedef {Object} SeedSignerEvmOpts + * @property {MemorySafeHDNodeWallet} [root] - An existing HD node wallet root to derive from. + * @property {string} [path] - Relative BIP-44 path segment (e.g. "0'/0/0"). Defaults to the account at index 0. + * @property {boolean} [isChild] - When true, the signer is a derived child and does not retain the root. + */ + +/** + * Interface for EVM signers, extending the base `ISigner` from `@tetherto/wdk-wallet`. + * + * @extends {ISigner} + * @interface + */ +export class ISignerEvm extends ISigner { + /** + * Whether this signer can derive child signers (i.e. it holds an HD root). Non-derivable + * signers (e.g. private-key signers) are bound directly to an account; derivable signers + * derive child accounts and keep the root for management only. + * @type {boolean} + */ + get isDerivable () { + throw new NotImplementedError('isDerivable') + } + + /** + * The last component index for the derivation path of this signer, when applicable. + * @type {number|undefined} + */ + get index () { + throw new NotImplementedError('index') + } + + /** + * The full derivation path if this is a child signer. + * @type {string|undefined} + */ + get path () { + throw new NotImplementedError('path') + } + + /** + * The account's address, if available. + * @type {string|undefined} + */ + get address () { + throw new NotImplementedError('address') + } + + /** + * The account's key pair. + * @type {KeyPair} + */ + get keyPair () { + throw new NotImplementedError('keyPair') + } + + /** + * Derive a child signer from this signer using a relative path (e.g. "0'/0/0"). + * + * @param {string} relPath - The relative BIP-44 path segment. + * @returns {Promise} The derived child signer. + * @throws {SignerError} If the signer does not support derivation (e.g. private-key signers). + */ + async derive (relPath) { + throw new NotImplementedError('derive(relPath)') + } + + /** + * Returns the account's address. + * @returns {Promise} + */ + async getAddress () { + throw new NotImplementedError('getAddress()') + } + + /** + * Sign a plain message. + * @param {string} message + * @returns {Promise} + */ + async sign (message) { + throw new NotImplementedError('sign(message)') + } + + /** + * Sign a transaction-like object compatible with ethers Transaction.from. + * @param {UnsignedEvmTransaction} unsignedTx + * @returns {Promise} The serialized signed transaction hex. + */ + async signTransaction (unsignedTx) { + throw new NotImplementedError('signTransaction(unsignedTx)') + } + + /** + * Signs typed data according to EIP-712. + * + * @param {TypedData} typedData - The typed data to sign. + * @returns {Promise} The typed data signature. + */ + async signTypedData ({ domain, types, message }) { + throw new NotImplementedError('signTypedData(typedData)') + } + + /** + * Sign an ERC-7702 authorization tuple. + * @param {AuthorizationRequest} auth + * @returns {Promise} + */ + async signAuthorization (auth) { + throw new NotImplementedError('signAuthorization(auth)') + } + + /** Clear any secret material from memory. */ + dispose () { + throw new NotImplementedError('dispose()') + } +} + +/** + * @extends {ISignerEvm} + * Signer implementation that derives keys from a BIP-39 seed using the BIP-44 Ethereum path. + * Always holds a derived account (index 0 by default). A root signer also retains the HD root + * and can derive child signers; a derived child holds only its own account. + */ +export default class SeedSignerEvm extends ISignerEvm { + /** + * Create a SeedSignerEvm. + * Provide either a mnemonic/seed or an existing root via opts.root (for children root is not stored internally) + * + * @param {string|Uint8Array|null} seed - BIP-39 mnemonic or seed bytes. Omit when providing `opts.root`. + * @param {SeedSignerEvmOpts} [opts] - Construction options for root reuse, direct child derivation or path definition (default is index 0). + * @throws {Error} If neither a seed nor a root is provided, or if both are provided. + * @throws {Error} If a seed is provided but is not a valid BIP-39 mnemonic. + */ + constructor (seed, opts = {}) { + super() + + // If a root is provided, do not expect a seed + if (opts.root && seed) { + throw new Error('Provide either a seed or a root, not both.') + } + + if (!opts.root && !seed) { + throw new Error('Seed or root is required.') + } + + if (typeof seed === 'string') { + if (!bip39.validateMnemonic(seed)) { + throw new Error('The seed phrase is invalid.') + } + seed = bip39.mnemonicToSeedSync(seed) + } + + const root = opts.root || (seed ? MemorySafeHDNodeWallet.fromSeed(seed) : undefined) + + const fullPath = `${BIP_44_ETH_DERIVATION_PATH_PREFIX}/${opts.path || DEFAULT_ACCOUNT_PATH}` + const account = root.derivePath(fullPath) + + /** @private */ + this._account = account + /** @private */ + this._address = account.address + /** @private */ + this._path = fullPath + /** @private */ + this._root = opts.isChild ? undefined : root + } + + /** + * Whether this signer can derive child signers. True for a root signer (which holds the + * HD root); false for a derived child, which does not retain the root. + * @type {boolean} + */ + get isDerivable () { + return Boolean(this._root) + } + + /** + * The last component index of the derivation path, if available. + * @type {number|undefined} + */ + get index () { + if (!this._path) return undefined + return +this._path.split('/').pop() + } + + /** + * The full derivation path of this signer's account. + * @type {string|undefined} + */ + get path () { + return this._path + } + + /** + * The account's derived address. + * @type {string} + */ + get address () { + return this._address + } + + /** + * The account's key pair (private and public key buffers). + * @type {KeyPair} + */ + get keyPair () { + return { + privateKey: this._account ? this._account.privateKeyBuffer : null, + publicKey: this._account ? this._account.publicKeyBuffer : null + } + } + + /** + * Derive a child signer using the provided relative path (e.g. "0'/0/0"). + * @param {string} relPath + * @returns {Promise} + * @throws {Error} If called on a derived child signer, which does not retain the root. + */ + async derive (relPath) { + if (!this._root) { + throw new Error('Cannot derive: this signer has no root (it is a derived child or has been disposed).') + } + return new SeedSignerEvm(null, { root: this._root, path: relPath, isChild: true }) + } + + /** + * Returns the account's derived address. + * @returns {Promise} + */ + async getAddress () { + return this._address + } + + /** + * Sign a plain message string. + * @param {string} message + * @returns {Promise} + */ + async sign (message) { + return this._account.signMessage(message) + } + + /** + * Sign a transaction object and return its serialized form. + * @param {UnsignedEvmTransaction} unsignedTx + * @returns {Promise} + */ + async signTransaction (unsignedTx) { + return this._account.signTransaction(unsignedTx) + } + + /** + * Signs typed data according to EIP-712. + * + * @param {TypedData} typedData - The typed data to sign. + * @returns {Promise} The typed data signature. + */ + async signTypedData ({ domain, types, message }) { + return this._account.signTypedData(domain, types, message) + } + + /** + * Sign an ERC-7702 authorization tuple. + * @param {AuthorizationRequest} auth + * @returns {Promise} + */ + async signAuthorization (auth) { + return this._account.authorizeSync(auth) + } + + /** Disposes secrets from memory. */ + dispose () { + if (this._account) this._account.dispose() + this._account = undefined + if (this._root) this._root.dispose() + this._root = undefined + } +} diff --git a/src/utils/tx-populator-evm.js b/src/utils/tx-populator-evm.js new file mode 100644 index 0000000..8f500af --- /dev/null +++ b/src/utils/tx-populator-evm.js @@ -0,0 +1,187 @@ +// Copyright 2024 Tether Operations Limited +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +'use strict' + +import { Signature, toQuantity } from 'ethers' + +/** @typedef {import('ethers').Provider} Provider */ +/** @typedef {import('ethers').AuthorizationLike} AuthorizationLike */ + +/** + * A fully or partially specified EVM transaction, prior to signing. + * + * @typedef {Object} UnsignedEvmTransaction + * @property {number} chainId - The id of the chain the transaction targets. + * @property {number} nonce - The sender's transaction count, used to order transactions. + * @property {string} from - The sender's address. + * @property {string|null} to - The recipient's address, or null for contract creation. + * @property {string} data - The transaction's calldata as a hex string. + * @property {number|bigint} value - The amount of native currency (in wei) to transfer. + * @property {number} type - The EIP-2718 transaction type (0/1 legacy, 2 EIP-1559, 3 EIP-4844, 4 EIP-7702). + * @property {number|bigint} gasLimit - The maximum amount of gas the transaction may consume. + * @property {number|bigint} [gasPrice] - The gas price (in wei) for legacy (type 0/1) transactions. + * @property {number|bigint} [maxFeePerGas] - The maximum total fee (in wei) per gas for EIP-1559 transactions. + * @property {number|bigint} [maxPriorityFeePerGas] - The maximum priority fee (in wei) per gas for EIP-1559 transactions. + * @property {any[]} [accessList] - The EIP-2930 access list of addresses and storage keys. + * @property {number|bigint} [maxFeePerBlobGas] - The maximum fee (in wei) per blob gas for EIP-4844 transactions. + * @property {any[]} [blobs] - The blobs to include in an EIP-4844 transaction. + * @property {string[]} [blobVersionedHashes] - The versioned hashes of the EIP-4844 blobs. + * @property {AuthorizationLike[]} [authorizationList] - The EIP-7702 authorization tuples. + */ + +/** + * Build a fully populated unsigned transaction ready for signing. + * + * Resolves chain ID, nonce, gas limit and fee fields from the provider when not + * explicitly supplied in `tx`. Supports legacy (type 0/1), EIP-1559 (type 2), + * EIP-4844 (type 3) and EIP-7702 (type 4) transaction styles. + * + * @param {Provider} provider - An ethers-compatible JSON-RPC provider. + * @param {string} from - The sender address. + * @param {UnsignedEvmTransaction} tx - The partial transaction to populate. + * @returns {Promise} The fully populated unsigned transaction. + */ +export async function populateTransactionEvm (provider, from, tx) { + const net = await provider.getNetwork() + const chainId = Number(net.chainId) + + const has1559 = (tx.maxFeePerGas != null || tx.maxPriorityFeePerGas != null) + const hasLegacy = (tx.gasPrice != null) + const hasAccessList = (tx.accessList != null && Array.isArray(tx.accessList)) + const hasBlobs = (tx.blobs != null || tx.blobVersionedHashes != null || tx.maxFeePerBlobGas != null) + const hasAuthList = (tx.authorizationList != null && Array.isArray(tx.authorizationList)) + + const explicitType = (tx.type != null) ? Number(tx.type) : null + + if ((explicitType === 2 || (explicitType == null && has1559)) && hasLegacy) { + throw new Error('eip-1559 transaction does not support gasPrice') + } + if ((explicitType === 0 || explicitType === 1) && has1559) { + throw new Error('pre-eip-1559 transaction does not support maxFeePerGas/maxPriorityFeePerGas') + } + if ((explicitType === 3 || hasBlobs) && hasLegacy) { + throw new Error('blob transaction does not support gasPrice') + } + + const feeData = await provider.getFeeData() + + let type = explicitType + if (type == null) { + if (hasAuthList) { + type = 4 + } else if (hasBlobs) { + type = 3 + } else if (feeData.maxFeePerGas != null && feeData.maxPriorityFeePerGas != null) { + type = 2 + } else { + type = 0 + } + } + + let gasLimit + if (tx.gasLimit != null) { + gasLimit = tx.gasLimit + } else if (hasAuthList) { + gasLimit = await _estimateGasWithAuthList(provider, { from, ...tx }) + } else { + gasLimit = await provider.estimateGas({ from, to: tx.to ?? null, data: tx.data ?? '0x', value: tx.value ?? 0 }) + } + + const populated = { + from, + to: tx.to ?? null, + data: tx.data ?? '0x', + value: tx.value ?? 0, + chainId, + nonce: (tx.nonce != null) ? Number(tx.nonce) : Number(await provider.getTransactionCount(from, 'pending')), + gasLimit + } + + if (type === 0 || type === 1) { + populated.type = type + populated.gasPrice = tx.gasPrice ?? feeData.gasPrice ?? feeData.maxFeePerGas + if (type === 1 && hasAccessList) populated.accessList = tx.accessList + return populated + } + + if (type === 2) { + populated.type = 2 + if (tx.gasPrice != null) { + populated.maxFeePerGas = tx.gasPrice + populated.maxPriorityFeePerGas = tx.gasPrice + } else { + populated.maxFeePerGas = tx.maxFeePerGas ?? feeData.maxFeePerGas + populated.maxPriorityFeePerGas = tx.maxPriorityFeePerGas ?? feeData.maxPriorityFeePerGas + } + if (hasAccessList) populated.accessList = tx.accessList + return populated + } + + if (type === 3) { + populated.type = 3 + populated.maxFeePerGas = tx.maxFeePerGas ?? feeData.maxFeePerGas + populated.maxPriorityFeePerGas = tx.maxPriorityFeePerGas ?? feeData.maxPriorityFeePerGas + if (tx.maxFeePerBlobGas == null) throw new Error('maxFeePerBlobGas is required for type 3 transactions') + populated.maxFeePerBlobGas = tx.maxFeePerBlobGas + if (tx.blobs != null) populated.blobs = tx.blobs + if (tx.blobVersionedHashes != null) populated.blobVersionedHashes = tx.blobVersionedHashes + if (hasAccessList) populated.accessList = tx.accessList + return populated + } + + // Type 4 (EIP-7702) and future types; pass-through + populated.type = type + if (hasAccessList) populated.accessList = tx.accessList + if (hasLegacy) { + populated.gasPrice = tx.gasPrice + } else { + populated.maxFeePerGas = tx.maxFeePerGas ?? feeData.maxFeePerGas + populated.maxPriorityFeePerGas = tx.maxPriorityFeePerGas ?? feeData.maxPriorityFeePerGas + } + if (hasBlobs) { + populated.maxFeePerBlobGas = tx.maxFeePerBlobGas + if (tx.blobs != null) populated.blobs = tx.blobs + if (tx.blobVersionedHashes != null) populated.blobVersionedHashes = tx.blobVersionedHashes + } + if (tx.authorizationList != null) populated.authorizationList = tx.authorizationList + + return populated +} + +async function _estimateGasWithAuthList (provider, { from, to, value, data, authorizationList }) { + const formatAuth = (auth) => { + const { address, nonce, chainId } = auth + const signature = auth.signature instanceof Signature + ? auth.signature + : Signature.from(auth.signature) + return { + address, + nonce: toQuantity(nonce), + chainId: toQuantity(chainId), + r: toQuantity(signature.r), + s: toQuantity(signature.s), + yParity: toQuantity(signature.yParity) + } + } + const rpcTx = { + from, + to, + value: toQuantity(value ?? 0), + data: data ?? '0x', + type: '0x04', + authorizationList: authorizationList.map(formatAuth) + } + const result = await provider.send('eth_estimateGas', [rpcTx]) + return BigInt(result) +} diff --git a/src/wallet-account-evm.js b/src/wallet-account-evm.js index 7abe439..3dda74c 100644 --- a/src/wallet-account-evm.js +++ b/src/wallet-account-evm.js @@ -16,12 +16,13 @@ import { Contract, ZeroAddress } from 'ethers' -import * as bip39 from 'bip39' - import WalletAccountReadOnlyEvm from './wallet-account-read-only-evm.js' -import MemorySafeHDNodeWallet from './memory-safe/hd-node-wallet.js' +import SeedSignerEvm from './signers/seed-signer-evm.js' +import PrivateKeySignerEvm from './signers/private-key-signer-evm.js' +import { populateTransactionEvm } from './utils/tx-populator-evm.js' +/** @typedef {import('./signers/seed-signer-evm.js').ISignerEvm} ISignerEvm */ /** @typedef {import('ethers').HDNodeWallet} HDNodeWallet */ /** @typedef {import('ethers').AuthorizationRequest} AuthorizationRequest */ /** @typedef {import('ethers').Authorization} Authorization */ @@ -45,8 +46,6 @@ import MemorySafeHDNodeWallet from './memory-safe/hd-node-wallet.js' * @property {number | bigint} amount - The amount of tokens to approve to the spender. */ -const BIP_44_ETH_DERIVATION_PATH_PREFIX = "m/44'/60'" - const USDT_MAINNET_ADDRESS = '0xdAC17F958D2ee523a2206206994597C13D831ec7' const DELEGATION_TX_GAS_LIMIT = 100_000 @@ -54,27 +53,13 @@ const DELEGATION_TX_GAS_LIMIT = 100_000 /** @implements {IWalletAccount} */ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { /** - * Creates a new evm wallet account. + * Creates a new evm wallet account using a signer. * - * @param {string | Uint8Array} seed - The wallet's [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) seed phrase. - * @param {string} path - The BIP-44 derivation path (e.g. "0'/0/0"). + * @param {ISignerEvm} signer - A signer implementing the EVM signer interface. * @param {EvmWalletConfig} [config] - The configuration object. */ - constructor (seed, path, config = {}) { - if (typeof seed === 'string') { - if (!bip39.validateMnemonic(seed)) { - throw new Error('The seed phrase is invalid.') - } - - seed = bip39.mnemonicToSeedSync(seed) - } - - path = BIP_44_ETH_DERIVATION_PATH_PREFIX + '/' + path - - const account = MemorySafeHDNodeWallet.fromSeed(seed) - .derivePath(path) - - super(account.address, config) + constructor (signer, config = {}) { + super(signer.address, config) /** * The wallet account configuration. @@ -84,17 +69,8 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { */ this._config = config - /** - * The account. - * - * @protected - * @type {HDNodeWallet} - */ - this._account = account - - if (this._provider) { - this._account = this._account.connect(this._provider) - } + /** @private */ + this._signer = signer } /** @@ -103,7 +79,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @type {number} */ get index () { - return this._account.index + return this._signer.index } /** @@ -112,7 +88,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @type {string} */ get path () { - return this._account.path + return this._signer.path } /** @@ -125,10 +101,49 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @type {KeyPair} */ get keyPair () { - return { - privateKey: this._account.privateKeyBuffer ?? null, - publicKey: this._account.publicKeyBuffer - } + return this._signer.keyPair + } + + /** + * Legacy helper to create an account from seed + path. + * Creates a root signer from the seed and derives a child for the given path. + * + * @param {string | Uint8Array} seed - The wallet's BIP-39 seed phrase or seed bytes. + * @param {string} path - The BIP-44 derivation path (e.g. "0'/0/0"). + * @param {EvmWalletConfig} [config] - The configuration object. + * @returns {Promise} + */ + static async fromSeed (seed, path, config = {}) { + const root = new SeedSignerEvm(seed) + const signer = await root.derive(path) + // The derived child holds its own account key and does not retain the root + root.dispose() + return new WalletAccountEvm(signer, config) + } + + /** + * Creates a new evm wallet account from a raw private key. + * + * @param {string | Uint8Array} privateKey - The raw private key (hex string with or without 0x, or 32 bytes). + * @param {EvmWalletConfig} [config] - The configuration object. + * @returns {WalletAccountEvm} The wallet account. + */ + static fromPrivateKey (privateKey, config = {}) { + const signer = new PrivateKeySignerEvm(privateKey) + return new WalletAccountEvm(signer, config) + } + + /** + * Returns the account's address. If it wasn't resolved at construction time (e.g hardware signers), it asks the + * underlying signer to resolve it, then caches it locally. + * + * @returns {Promise} The account's address. + */ + async getAddress () { + if (this._address) return this._address + const addr = await this._signer.getAddress() + this.__address = addr + return addr } /** @@ -138,7 +153,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @returns {Promise} The message's signature. */ async sign (message) { - return await this._account.signMessage(message) + return await this._signer.sign(message) } /** @@ -148,7 +163,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @returns {Promise} The typed data signature. */ async signTypedData ({ domain, types, message }) { - return await this._account.signTypedData(domain, types, message) + return await this._signer.signTypedData({ domain, types, message }) } /** @@ -161,15 +176,14 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @throws {Error} If a provider is set, and the transaction's cost surpasses the transaction max. fee option. */ async signTransaction (tx) { - if (this._account.provider && this._config.transactionMaxFee !== undefined) { + if (this._provider && this._config.transactionMaxFee !== undefined) { const { fee } = await this.quoteSendTransaction(tx) if (fee > this._config.transactionMaxFee) { throw new Error('Exceeded maximum fee cost for transaction operation.') } } - - return await this._account.signTransaction({ + return await this._signer.signTransaction({ from: await this.getAddress(), ...tx }) @@ -183,21 +197,18 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @throws {Error} If the transaction's cost exceeds the maximum transaction fee option. */ async sendTransaction (tx) { - if (!this._account.provider) { + if (!this._provider) { throw new Error('The wallet must be connected to a provider to send transactions.') } - const { fee } = await this.quoteSendTransaction(tx) - if (this._config.transactionMaxFee !== undefined && fee > this._config.transactionMaxFee) { throw new Error('Exceeded maximum fee cost for transaction operation.') } - - const { hash } = await this._account.sendTransaction({ - from: await this.getAddress(), - ...tx - }) - + // Build, sign and broadcast raw transaction using the signer + const from = await this.getAddress() + const unsignedTx = await populateTransactionEvm(this._provider, from, tx) + const signed = await this._signer.signTransaction(unsignedTx) + const hash = await this._provider.send('eth_sendRawTransaction', [signed]) return { hash, fee } } @@ -209,7 +220,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @throws {Error} If the transfer's cost exceeds the maximum transfer fee option. */ async transfer (options) { - if (!this._account.provider) { + if (!this._provider) { throw new Error('The wallet must be connected to a provider to transfer tokens.') } @@ -221,7 +232,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { throw new Error('Exceeded maximum fee cost for transfer operation.') } - const { hash } = await this._account.sendTransaction(tx) + const { hash } = await this.sendTransaction(tx) return { hash, fee } } @@ -234,7 +245,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @throws {Error} If trying to approve usdts on ethereum with allowance not equal to zero (due to the usdt allowance reset requirement). */ async approve (options) { - if (!this._account.provider) { + if (!this._provider) { throw new Error('The wallet must be connected to a provider to approve funds.') } @@ -269,7 +280,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { */ async toReadOnlyAccount () { if (!this._evmReadOnlyAccount) { - this._evmReadOnlyAccount = new WalletAccountReadOnlyEvm(this._account.address, this._config) + this._evmReadOnlyAccount = new WalletAccountReadOnlyEvm(await this.getAddress(), this._config) } return this._evmReadOnlyAccount @@ -282,7 +293,18 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @returns {Promise} The signed authorization. */ async signAuthorization (auth) { - return await this._account.authorize(auth) + const populated = { ...auth } + if (this._provider) { + if (populated.chainId == null) { + const { chainId } = await this._provider.getNetwork() + populated.chainId = chainId + } + if (populated.nonce == null) { + const address = await this.getAddress() + populated.nonce = await this._provider.getTransactionCount(address) + } + } + return await this._signer.signAuthorization(populated) } /** @@ -296,7 +318,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * @returns {Promise} The transaction result. */ async delegate (delegateAddress) { - if (!this._account.provider) { + if (!this._provider) { throw new Error('The wallet must be connected to a provider to delegate.') } @@ -332,6 +354,6 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm { * Disposes the wallet account, erasing the private key from the memory. */ dispose () { - this._account.dispose() + this._signer.dispose() } } diff --git a/src/wallet-account-read-only-evm.js b/src/wallet-account-read-only-evm.js index 3aef641..610137a 100644 --- a/src/wallet-account-read-only-evm.js +++ b/src/wallet-account-read-only-evm.js @@ -47,7 +47,7 @@ import FailoverProvider from '@tetherto/wdk-failover-provider' /** * @typedef {Object} EvmTransaction - * @property {string} to - The transaction's recipient. + * @property {string | null} [to] - The transaction's recipient. Omit or pass null to deploy a contract. * @property {number | bigint} value - The amount of ethers to send to the recipient (in weis). * @property {string} [data] - The transaction's data in hex format. * @property {number | bigint} [gasLimit] - The maximum amount of gas this transaction is permitted to use. diff --git a/src/wallet-manager-evm.js b/src/wallet-manager-evm.js index 686724f..60a89da 100644 --- a/src/wallet-manager-evm.js +++ b/src/wallet-manager-evm.js @@ -21,10 +21,13 @@ import { BrowserProvider, JsonRpcProvider } from 'ethers' import FailoverProvider from '@tetherto/wdk-failover-provider' import WalletAccountEvm from './wallet-account-evm.js' +import SeedSignerEvm from './signers/seed-signer-evm.js' +/** @typedef {import('./signers/seed-signer-evm.js').ISignerEvm} ISignerEvm */ /** @typedef {import('ethers').Provider} Provider */ /** @typedef {import("@tetherto/wdk-wallet").FeeRates} FeeRates */ +/** @typedef {import("@tetherto/wdk-wallet").SignerError} SignerError */ /** @typedef {import('./wallet-account-evm.js').EvmWalletConfig} EvmWalletConfig */ @@ -48,11 +51,23 @@ export default class WalletManagerEvm extends WalletManager { /** * Creates a new wallet manager for evm blockchains. * - * @param {string | Uint8Array} seed - The wallet's [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) seed phrase. + * Accepts either a BIP-39 seed (string/Uint8Array) for backwards compatibility, or a + * pre-built root signer object. The default signer must be derivable (it must be able to + * derive child accounts); non-derivable signers (e.g. private-key signers) are not allowed + * as the default but may be registered by name via {@link addSigner} - If not adding to your global account managment for using just one non derivable signer create a standalone account. + * + * @param {string|Uint8Array|ISignerEvm} seedOrSigner - A BIP-39 seed phrase, seed bytes, or a root signer. * @param {EvmWalletConfig} [config] - The configuration object. */ - constructor (seed, config = {}) { - super(seed, config) + constructor (seedOrSigner, config = {}) { + let signer = seedOrSigner + if (typeof seedOrSigner === 'string' || seedOrSigner instanceof Uint8Array) { + signer = new SeedSignerEvm(seedOrSigner) + } + if (!signer.isDerivable) { + throw new Error('The default signer must be derivable. Non-derivable signers (e.g. private-key signers) can only be registered by name via addSigner.') + } + super(signer, config) /** * The evm wallet configuration. @@ -94,35 +109,68 @@ export default class WalletManagerEvm extends WalletManager { } /** - * Returns the wallet account at a specific index (see [BIP-44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki)). + * Returns the wallet account at a specific index. * - * @example - * // Returns the account with derivation path m/44'/60'/0'/0/1 - * const account = await wallet.getAccount(1); + * @overload * @param {number} [index] - The index of the account to get (default: 0). + * @param {Object} [options] - Account options. + * @param {string} [options.signerName] - The signer name. Omit to use the default signer. * @returns {Promise} The account. + * @throws {Error} If a signer name is given but no signer exists with that name. + * @throws {SignerError} If the signer doesn't support account derivation. */ - async getAccount (index = 0) { - return await this.getAccountByPath(`0'/0/${index}`) - } /** - * Returns the wallet account at a specific BIP-44 derivation path. + * Returns the wallet account associated with a registered signer. Non-derivable + * signers (e.g. private-key signers) return the signer's single account; derivable signers + * derive a detached child at the signer's own account (the root is never handed out). * - * @example - * // Returns the account with derivation path m/44'/60'/0'/0/1 - * const account = await wallet.getAccountByPath("0'/0/1"); - * @param {string} path - The derivation path (e.g. "0'/0/0"). + * @overload + * @param {string} signerName - The signer name registered via {@link addSigner}. * @returns {Promise} The account. + * @throws {Error} If no signer exists with the given name. */ - async getAccountByPath (path) { - if (!this._accounts[path]) { - const account = new WalletAccountEvm(this.seed, path, this._config) - this._accounts[path] = account + async getAccount (indexOrSignerName = 0, options = {}) { + if (typeof indexOrSignerName === 'string') { + const key = `${indexOrSignerName}#self` + if (this._accounts[key]) { + return this._accounts[key] + } + const signer = this.getSigner(indexOrSignerName) + const accountSigner = signer.isDerivable + ? await signer.derive(signer.path.split('/').slice(-3).join('/')) + : signer + const account = new WalletAccountEvm(accountSigner, this._config) + this._accounts[key] = account + return account } - return this._accounts[path] + const { signerName } = options + return await this.getAccountByPath(`0'/0/${indexOrSignerName}`, { signerName }) + } + + /** + * Returns the wallet account at a specific derivation path. + * + * @param {string} path - The derivation path (e.g. "0'/0/0"). + * @param {Object} [options] - Account options. + * @param {string} [options.signerName] - The signer name. Omit to use the default signer. + * @returns {Promise} The account. + * @throws {Error} If a signer name is given but no signer exists with that name. + * @throws {SignerError} If the signer doesn't support account derivation. + */ + async getAccountByPath (path, options = {}) { + const { signerName } = options + const key = `${signerName ?? ''}:${path}` + if (this._accounts[key]) { + return this._accounts[key] + } + const signer = this.getSigner(signerName) + const childSigner = await signer.derive(path) + const account = new WalletAccountEvm(childSigner, this._config) + this._accounts[key] = account + return account } /** diff --git a/tests/integration/module.test.js b/tests/integration/module.test.js index 889fd1d..34b8aca 100644 --- a/tests/integration/module.test.js +++ b/tests/integration/module.test.js @@ -5,6 +5,7 @@ import { ContractFactory } from 'ethers' import { describe, expect, test, beforeEach, afterEach } from '@jest/globals' import WalletManagerEvm from '../../index.js' +import SeedSignerEvm from '../../src/signers/seed-signer-evm.js' import TestToken from './../artifacts/TestToken.json' with { type: 'json' } @@ -69,12 +70,11 @@ describe('@tetherto/wdk-wallet-evm', () => { await sendTestTokensTo(account.address, INITIAL_TOKEN_BALANCE) } - wallet = new WalletManagerEvm(SEED_PHRASE, { - provider: hre.network.provider - }) + wallet = new WalletManagerEvm(new SeedSignerEvm(SEED_PHRASE), { provider: hre.network.provider }) }) afterEach(async () => { + wallet.dispose() await hre.network.provider.send('hardhat_reset') }) @@ -282,17 +282,19 @@ describe('@tetherto/wdk-wallet-evm', () => { for (const account of [account0, account1]) { expect(account.keyPair.privateKey).toBe(null) - await expect(account.sign(MESSAGE)).rejects.toThrow('Uint8Array expected') - await expect(account.sendTransaction(TRANSACTION)).rejects.toThrow('Uint8Array expected') - await expect(account.transfer(TRANSFER)).rejects.toThrow('Uint8Array expected') + // Once disposed, the underlying signer is cleared, so any signing operation + // fails when it reaches the now-undefined signer rather than for some other reason. + await expect(account.sign(MESSAGE)) + .rejects.toThrow(/Cannot read properties of undefined \(reading 'signMessage'\)/) + await expect(account.sendTransaction(TRANSACTION)) + .rejects.toThrow(/Cannot read properties of undefined \(reading 'signTransaction'\)/) + await expect(account.transfer(TRANSFER)) + .rejects.toThrow(/Cannot read properties of undefined \(reading 'signTransaction'\)/) } }) test('should create a wallet with a low transfer max fee, derive an account, try to transfer some tokens and gracefully fail', async () => { - const wallet = new WalletManagerEvm(SEED_PHRASE, { - provider: hre.network.provider, - transferMaxFee: 0 - }) + const wallet = new WalletManagerEvm(new SeedSignerEvm(SEED_PHRASE), { provider: hre.network.provider, transferMaxFee: 0 }) const account = await wallet.getAccount(0) diff --git a/tests/signers.test.js b/tests/signers.test.js new file mode 100644 index 0000000..627b1aa --- /dev/null +++ b/tests/signers.test.js @@ -0,0 +1,197 @@ +import * as bip39 from 'bip39' + +import { describe, expect, test } from '@jest/globals' + +import SeedSignerEvm from '../src/signers/seed-signer-evm.js' +import PrivateKeySignerEvm from '../src/signers/private-key-signer-evm.js' + +const VALID_SEED_PHRASE = 'cook voyage document eight skate token alien guide drink uncle term abuse' +const VALID_SEED = bip39.mnemonicToSeedSync(VALID_SEED_PHRASE) +const VALID_PRIVATE_KEY = '260905feebf1ec684f36f1599128b85f3a26c2b817f2065a2fc278398449c41f' +const EXPECTED_PUBLIC_KEY = '036c082582225926b9356d95b91a4acffa3511b7cc2a14ef5338c090ea2cc3d0aa' + +const MESSAGE = 'Dummy message to sign.' +const EXPECTED_SIGNATURE = '0xd130f94c52bf393206267278ac0b6009e14f11712578e5c1f7afe4a12685c5b96a77a0832692d96fc51f4bd403839572c55042ecbcc92d215879c5c8bb5778c51c' + +const EXPECTED_ADDRESS = '0x405005C7c4422390F4B334F64Cf20E0b767131d0' + +describe('SeedSignerEvm', () => { + test('should throw if the seed phrase is invalid', () => { + expect(() => { new SeedSignerEvm('invalid seed phrase') }) // eslint-disable-line no-new + .toThrow('The seed phrase is invalid.') + }) + + test('should throw if the path is invalid', async () => { + await expect(new SeedSignerEvm(VALID_SEED_PHRASE).derive("a'/b/c")) + .rejects.toThrow('invalid path component') + }) + + test('should throw if both seed and root are provided', async () => { + const root = new SeedSignerEvm(VALID_SEED_PHRASE) + const child = await root.derive("0'/0/0") + expect(() => { new SeedSignerEvm(VALID_SEED_PHRASE, { root: child }) }) // eslint-disable-line no-new + .toThrow('Provide either a seed or a root, not both.') + child.dispose() + root.dispose() + }) + + test('should create a signer with the account at index 0 by default', () => { + const signer = new SeedSignerEvm(VALID_SEED_PHRASE) + + expect(signer.isDerivable).toBe(true) + expect(signer.address).toBe(EXPECTED_ADDRESS) + expect(signer.path).toBe("m/44'/60'/0'/0/0") + expect(signer.index).toBe(0) + + signer.dispose() + }) + + test('should derive a child signer with the correct address and path', async () => { + const root = new SeedSignerEvm(VALID_SEED_PHRASE) + const child = await root.derive("0'/0/0") + + expect(child.isDerivable).toBe(false) + expect(child.address).toBe(EXPECTED_ADDRESS) + expect(child.path).toBe("m/44'/60'/0'/0/0") + expect(child.index).toBe(0) + expect(Buffer.from(child.keyPair.privateKey).toString('hex')).toBe(VALID_PRIVATE_KEY) + expect(Buffer.from(child.keyPair.publicKey).toString('hex')).toBe(EXPECTED_PUBLIC_KEY) + + child.dispose() + root.dispose() + }) + + test('should derive the same address from raw seed bytes', async () => { + const root = new SeedSignerEvm(VALID_SEED) + const child = await root.derive("0'/0/0") + + expect(child.address).toBe(EXPECTED_ADDRESS) + + child.dispose() + root.dispose() + }) + + test('should derive the same address when path is provided via constructor opts', () => { + const signer = new SeedSignerEvm(VALID_SEED_PHRASE, { path: "0'/0/0" }) + + expect(signer.address).toBe(EXPECTED_ADDRESS) + + signer.dispose() + }) + + test('should throw when deriving from a disposed signer', async () => { + const root = new SeedSignerEvm(VALID_SEED_PHRASE) + root.dispose() + + await expect(root.derive("0'/0/0")).rejects.toThrow('Cannot derive: this signer has no root') + }) + + test('should return the correct signature', async () => { + const child = await new SeedSignerEvm(VALID_SEED_PHRASE).derive("0'/0/0") + + const signature = await child.sign(MESSAGE) + expect(signature).toBe(EXPECTED_SIGNATURE) + + child.dispose() + }) + + test('should return the address via getAddress()', async () => { + const child = await new SeedSignerEvm(VALID_SEED_PHRASE).derive("0'/0/0") + + const address = await child.getAddress() + expect(address).toBe(EXPECTED_ADDRESS) + + child.dispose() + }) + + test('should clear secrets on dispose', async () => { + const root = new SeedSignerEvm(VALID_SEED_PHRASE) + const child = await root.derive("0'/0/0") + + child.dispose() + + expect(child.keyPair.privateKey).toBeNull() + }) + + test('should not neuter the shared root when a derived child is disposed', async () => { + const root = new SeedSignerEvm(VALID_SEED_PHRASE) + const a = await root.derive("0'/0/0") + const b = await root.derive("0'/0/1") + + const signature = await b.sign(MESSAGE) + + a.dispose() + + // The sibling still signs and the root can still derive new children. + await expect(b.sign(MESSAGE)).resolves.toBe(signature) + await expect(root.derive("0'/0/2")).resolves.toBeInstanceOf(SeedSignerEvm) + + b.dispose() + root.dispose() + }) + + test('should not let a derived child derive further', async () => { + const root = new SeedSignerEvm(VALID_SEED_PHRASE) + const child = await root.derive("0'/0/0") + + await expect(child.derive("0'/0/1")).rejects.toThrow('Cannot derive: this signer has no root') + + child.dispose() + root.dispose() + }) +}) + +describe('PrivateKeySignerEvm', () => { + test('should create a signer from a hex string', () => { + const signer = new PrivateKeySignerEvm(VALID_PRIVATE_KEY) + + expect(signer.address).toBe(EXPECTED_ADDRESS) + expect(signer.isDerivable).toBe(false) + expect(signer.index).toBeUndefined() + + signer.dispose() + }) + + test('should create a signer from a Uint8Array', () => { + const keyBytes = new Uint8Array(Buffer.from(VALID_PRIVATE_KEY, 'hex')) + const signer = new PrivateKeySignerEvm(keyBytes) + + expect(signer.address).toBe(EXPECTED_ADDRESS) + + signer.dispose() + }) + + test('should return the correct signature', async () => { + const signer = new PrivateKeySignerEvm(VALID_PRIVATE_KEY) + + const signature = await signer.sign(MESSAGE) + expect(signature).toBe(EXPECTED_SIGNATURE) + + signer.dispose() + }) + + test('should throw when calling derive', async () => { + const signer = new PrivateKeySignerEvm(VALID_PRIVATE_KEY) + + await expect(signer.derive()).rejects.toThrow('PrivateKeySignerEvm does not support derivation.') + + signer.dispose() + }) + + test('should return the address via getAddress()', async () => { + const signer = new PrivateKeySignerEvm(VALID_PRIVATE_KEY) + + const address = await signer.getAddress() + expect(address).toBe(EXPECTED_ADDRESS) + + signer.dispose() + }) + + test('should clear secrets on dispose', () => { + const signer = new PrivateKeySignerEvm(VALID_PRIVATE_KEY) + + signer.dispose() + + expect(signer.keyPair.privateKey).toBeNull() + }) +}) diff --git a/tests/wallet-account-evm.test.js b/tests/wallet-account-evm.test.js index 2221be8..564004b 100644 --- a/tests/wallet-account-evm.test.js +++ b/tests/wallet-account-evm.test.js @@ -2,25 +2,22 @@ import hre from 'hardhat' import { ContractFactory, Contract } from 'ethers' -import * as bip39 from 'bip39' - import { afterEach, beforeEach, describe, expect, test, jest } from '@jest/globals' import { WalletAccountEvm, WalletAccountReadOnlyEvm } from '../index.js' +import SeedSignerEvm from '../src/signers/seed-signer-evm.js' +import PrivateKeySignerEvm from '../src/signers/private-key-signer-evm.js' import TestToken from './artifacts/TestToken.json' with { type: 'json' } import SimpleDelegateContract from './artifacts/SimpleDelegateContract.json' with { type: 'json' } + const USDT_MAINNET_ADDRESS = '0xdAC17F958D2ee523a2206206994597C13D831ec7' const DELEGATE_CONTRACT_ADDRESS = '0xbe08d4d81ebea77f6aa54b2067ea5f56005f98de' const SEED_PHRASE = 'cook voyage document eight skate token alien guide drink uncle term abuse' -const INVALID_SEED_PHRASE = 'invalid seed phrase' - -const SEED = bip39.mnemonicToSeedSync(SEED_PHRASE) - const ACCOUNT = { index: 0, path: "m/44'/60'/0'/0/0", @@ -82,9 +79,9 @@ describe('WalletAccountEvm', () => { await sendTestTokensTo(ACCOUNT.address, INITIAL_TOKEN_BALANCE) - account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0", { - provider: hre.network.provider - }) + const root = new SeedSignerEvm(SEED_PHRASE) + const signer = await root.derive("0'/0/0") + account = new WalletAccountEvm(signer, { provider: hre.network.provider }) }) afterEach(async () => { @@ -93,43 +90,35 @@ describe('WalletAccountEvm', () => { await hre.network.provider.send('hardhat_reset') }) - describe('constructor', () => { - test('should successfully initialize an account for the given seed phrase and path', async () => { - const account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0") - - expect(account.index).toBe(ACCOUNT.index) - - expect(account.path).toBe(ACCOUNT.path) - - expect(account.keyPair).toEqual({ - privateKey: new Uint8Array(Buffer.from(ACCOUNT.keyPair.privateKey, 'hex')), - publicKey: new Uint8Array(Buffer.from(ACCOUNT.keyPair.publicKey, 'hex')) + describe('fromSeed', () => { + test('should create the account at the given path from a seed phrase', async () => { + const seededAccount = await WalletAccountEvm.fromSeed(SEED_PHRASE, "0'/0/0", { + provider: hre.network.provider }) - }) - test('should successfully initialize an account for the given seed and path', async () => { - const account = new WalletAccountEvm(SEED, "0'/0/0") + expect(await seededAccount.getAddress()).toBe(ACCOUNT.address) + expect(seededAccount.path).toBe(ACCOUNT.path) + expect(seededAccount.index).toBe(ACCOUNT.index) + }) - expect(account.index).toBe(ACCOUNT.index) + test('should derive the same account as a manually derived signer', async () => { + const seededAccount = await WalletAccountEvm.fromSeed(SEED_PHRASE, "0'/0/0") + const signerAccount = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0")) - expect(account.path).toBe(ACCOUNT.path) + expect(await seededAccount.getAddress()).toBe(await signerAccount.getAddress()) + }) + }) - expect(account.keyPair).toEqual({ - privateKey: new Uint8Array(Buffer.from(ACCOUNT.keyPair.privateKey, 'hex')), - publicKey: new Uint8Array(Buffer.from(ACCOUNT.keyPair.publicKey, 'hex')) + describe('fromPrivateKey', () => { + test('should create the account from a raw private key', async () => { + const account = WalletAccountEvm.fromPrivateKey(ACCOUNT.keyPair.privateKey, { + provider: hre.network.provider }) - }) - test('should throw if the seed phrase is invalid', () => { - // eslint-disable-next-line no-new - expect(() => { new WalletAccountEvm(INVALID_SEED_PHRASE, "0'/0/0") }) - .toThrow('The seed phrase is invalid.') - }) + expect(account).toBeInstanceOf(WalletAccountEvm) + expect(await account.getAddress()).toBe(ACCOUNT.address) - test('should throw if the path is invalid', () => { - // eslint-disable-next-line no-new - expect(() => { new WalletAccountEvm(SEED_PHRASE, "a'/b/c") }) - .toThrow('invalid path component') + account.dispose() }) }) @@ -205,15 +194,25 @@ describe('WalletAccountEvm', () => { const SIGNED_TRANSACTION = '0x02f86e827a6980843b9aca00847735940082520894a460aebce0d3a4becad8ccf9d6d4861296c503bd8203e880c080a0189acf1d3170de712fd346182a77b08ccaa1317cdd13daf386f1405d52148171a04a83f7c7df7f258344e1726ac5b94f53fb415f0e41a58399b5031940b293b9ec' test('should sign a transaction and return a valid hex string', async () => { - const accountWithoutProvider = new WalletAccountEvm(SEED_PHRASE, "0'/0/0") + const accountWithoutProvider = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0")) + const TRANSACTION = { + to: '0xa460AEbce0d3A4BecAd8ccf9D6D4861296c503Bd', + value: 1_000n, + gasLimit: 21_000n, + maxFeePerGas: 2_000_000_000n, + maxPriorityFeePerGas: 1_000_000_000n, + nonce: 0, + chainId: 31_337n + } + const SIGNED_TRANSACTION = "0x02f86e827a6980843b9aca00847735940082520894a460aebce0d3a4becad8ccf9d6d4861296c503bd8203e880c080a0189acf1d3170de712fd346182a77b08ccaa1317cdd13daf386f1405d52148171a04a83f7c7df7f258344e1726ac5b94f53fb415f0e41a58399b5031940b293b9ec" const signedTx = await accountWithoutProvider.signTransaction(TRANSACTION) expect(signedTx).toBe(SIGNED_TRANSACTION) }) test('should throw if transaction fee exceeds the transaction max fee configuration', async () => { - const account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0", { + const account = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0"), { provider: hre.network.provider, transactionMaxFee: 0 }) @@ -223,7 +222,7 @@ describe('WalletAccountEvm', () => { }) test('should not enforce transaction max fee without a provider', async () => { - const account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0", { + const account = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0"), { transactionMaxFee: 0 }) @@ -235,7 +234,7 @@ describe('WalletAccountEvm', () => { test('should allow a fee exactly equal to transactionMaxFee', async () => { const { fee } = await account.quoteSendTransaction(TRANSACTION) - const accountAtLimit = new WalletAccountEvm(SEED_PHRASE, "0'/0/0", { + const accountAtLimit = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0"), { provider: hre.network.provider, transactionMaxFee: fee }) @@ -248,7 +247,7 @@ describe('WalletAccountEvm', () => { test('should allow a fee below transactionMaxFee', async () => { const { fee } = await account.quoteSendTransaction(TRANSACTION) - const accountBelowLimit = new WalletAccountEvm(SEED_PHRASE, "0'/0/0", { + const accountBelowLimit = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0"), { provider: hre.network.provider, transactionMaxFee: fee + 1n }) @@ -278,6 +277,23 @@ describe('WalletAccountEvm', () => { expect(fee).toBe(EXPECTED_FEE) }) + test('should successfully send a transaction with PrivateKeySignerEvm', async () => { + const pkSigner = new PrivateKeySignerEvm(ACCOUNT.keyPair.privateKey) + const pkAccount = new WalletAccountEvm(pkSigner, { provider: hre.network.provider }) + const TRANSACTION = { + to: '0xa460AEbce0d3A4BecAd8ccf9D6D4861296c503Bd', + value: 1_000 + } + const EXPECTED_FEE = 46_114_898_254_972n + const { hash, fee } = await pkAccount.sendTransaction(TRANSACTION) + const transaction = await hre.ethers.provider.getTransaction(hash) + expect(transaction.hash).toBe(hash) + expect(transaction.to).toBe(TRANSACTION.to) + expect(transaction.value).toBe(BigInt(TRANSACTION.value)) + expect(fee).toBe(EXPECTED_FEE) + pkAccount.dispose() + }) + test('should successfully send a transaction with arbitrary data', async () => { const TRANSACTION_WITH_DATA = { to: testToken.target, @@ -298,6 +314,22 @@ describe('WalletAccountEvm', () => { expect(fee).toBe(EXPECTED_FEE) }) + test('should deploy a contract when "to" is omitted', async () => { + const { hash } = await account.sendTransaction({ + value: 0, + data: SimpleDelegateContract.bytecode + }) + + const receipt = await hre.ethers.provider.getTransactionReceipt(hash) + + // A contract-creation transaction has no recipient and yields a contract address. + expect(receipt.to).toBeNull() + expect(receipt.contractAddress).toBeTruthy() + + const code = await hre.ethers.provider.getCode(receipt.contractAddress) + expect(code).not.toBe('0x') + }) + test('should successfully send a transaction with an authorization list', async () => { const auth = await account.signAuthorization({ address: DELEGATE_CONTRACT_ADDRESS @@ -341,7 +373,7 @@ describe('WalletAccountEvm', () => { value: 1_000 } - const account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0", { + const account = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0"), { provider: hre.network.provider, transactionMaxFee: 0 }) @@ -358,7 +390,7 @@ describe('WalletAccountEvm', () => { const { fee } = await account.quoteSendTransaction(TRANSACTION) - const accountAtLimit = new WalletAccountEvm(SEED_PHRASE, "0'/0/0", { + const accountAtLimit = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0"), { provider: hre.network.provider, transactionMaxFee: fee }) @@ -376,7 +408,7 @@ describe('WalletAccountEvm', () => { const { fee } = await account.quoteSendTransaction(TRANSACTION) - const accountBelowLimit = new WalletAccountEvm(SEED_PHRASE, "0'/0/0", { + const accountBelowLimit = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0"), { provider: hre.network.provider, transactionMaxFee: fee + 1n }) @@ -387,7 +419,7 @@ describe('WalletAccountEvm', () => { }) test('should throw if the account is not connected to a provider', async () => { - const account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0") + const account = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0")) await expect(account.sendTransaction({ })) .rejects.toThrow('The wallet must be connected to a provider to send transactions.') @@ -459,17 +491,17 @@ describe('WalletAccountEvm', () => { amount: 100 } - const account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0", { - provider: hre.network.provider, - transferMaxFee: 0 - }) + const account = new WalletAccountEvm( + await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0"), + { provider: hre.network.provider, transferMaxFee: 0 } + ) await expect(account.transfer(TRANSFER)) .rejects.toThrow('Exceeded maximum fee cost for transfer operation.') }) test('should throw if the account is not connected to a provider', async () => { - const account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0") + const account = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0")) await expect(account.transfer({ })) .rejects.toThrow('The wallet must be connected to a provider to transfer tokens.') @@ -565,7 +597,7 @@ describe('WalletAccountEvm', () => { }) test('should throw if the account is not connected to a provider', async () => { - const accountWithoutProvider = new WalletAccountEvm(SEED_PHRASE, "0'/0/0") + const accountWithoutProvider = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0")) const approveOptions = { token: testToken.target, spender: SPENDER, @@ -588,7 +620,7 @@ describe('WalletAccountEvm', () => { }) describe('signAuthorization', () => { - test('should succesfully sign an authorization', async () => { + test('should successfully sign an authorization', async () => { const auth = await account.signAuthorization({ address: delegateContract.target }) @@ -607,7 +639,7 @@ describe('WalletAccountEvm', () => { }) describe('delegate', () => { - test('should succesfully set delegation to a contract', async () => { + test('should successfully set delegation to a contract', async () => { const EXPECTED_FEE = 101_404_028_446_960n const { hash, fee } = await account.delegate(DELEGATE_CONTRACT_ADDRESS) @@ -633,7 +665,7 @@ describe('WalletAccountEvm', () => { }) test('should throw if the account is not connected to a provider', async () => { - const account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0") + const account = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0")) await expect(account.delegate(delegateContract.target)) .rejects.toThrow('The wallet must be connected to a provider to delegate.') @@ -667,7 +699,7 @@ describe('WalletAccountEvm', () => { }) test('should throw if the account is not connected to a provider', async () => { - const account = new WalletAccountEvm(SEED_PHRASE, "0'/0/0") + const account = new WalletAccountEvm(await new SeedSignerEvm(SEED_PHRASE).derive("0'/0/0")) await expect(account.revokeDelegation()) .rejects.toThrow('The wallet must be connected to a provider to delegate.') diff --git a/tests/wallet-account-read-only-evm.test.js b/tests/wallet-account-read-only-evm.test.js index 3270892..bf8cd65 100644 --- a/tests/wallet-account-read-only-evm.test.js +++ b/tests/wallet-account-read-only-evm.test.js @@ -8,7 +8,6 @@ import { WalletAccountReadOnlyEvm } from '../index.js' import TestToken from './artifacts/TestToken.json' with { type: 'json' } -const PRIVATE_KEY = '260905feebf1ec684f36f1599128b85f3a26c2b817f2065a2fc278398449c41f' const ADDRESS = '0x405005C7c4422390F4B334F64Cf20E0b767131d0' diff --git a/tests/wallet-manager-evm.test.js b/tests/wallet-manager-evm.test.js index 8a09ec7..05e117a 100644 --- a/tests/wallet-manager-evm.test.js +++ b/tests/wallet-manager-evm.test.js @@ -3,22 +3,34 @@ import hre from 'hardhat' import { afterEach, beforeEach, describe, expect, test } from '@jest/globals' import WalletManagerEvm, { WalletAccountEvm } from '../index.js' +import SeedSignerEvm from '../src/signers/seed-signer-evm.js' +import PrivateKeySignerEvm from '../src/signers/private-key-signer-evm.js' const SEED_PHRASE = 'cook voyage document eight skate token alien guide drink uncle term abuse' +// Derived independently of the wallet's seed; registered as a named signer in tests. +const PRIVATE_KEY = '260905feebf1ec684f36f1599128b85f3a26c2b817f2065a2fc278398449c41f' +const PRIVATE_KEY_ADDRESS = '0x405005C7c4422390F4B334F64Cf20E0b767131d0' + describe('WalletManagerEvm', () => { let wallet beforeEach(async () => { - wallet = new WalletManagerEvm(SEED_PHRASE, { - provider: hre.network.provider - }) + const root = new SeedSignerEvm(SEED_PHRASE) + wallet = new WalletManagerEvm(root, { provider: hre.network.provider }) }) afterEach(() => { wallet.dispose() }) + describe('constructor', () => { + test('should throw if the default signer is not derivable', () => { + expect(() => new WalletManagerEvm(new PrivateKeySignerEvm(PRIVATE_KEY))) // eslint-disable-line no-new + .toThrow('The default signer must be derivable.') + }) + }) + describe('getAccount', () => { test('should return the account at index 0 by default', async () => { const account = await wallet.getAccount() @@ -36,10 +48,67 @@ describe('WalletManagerEvm', () => { expect(account.path).toBe("m/44'/60'/0'/0/3") }) + test('should return the same cached account instance for the same index', async () => { + const first = await wallet.getAccount(1) + const second = await wallet.getAccount(1) + + expect(second).toBe(first) + }) + test('should throw if the index is a negative number', async () => { await expect(wallet.getAccount(-1)) .rejects.toThrow('invalid path component') }) + + test('should derive from a named signer via options.signerName', async () => { + wallet.addSigner('secondary', new SeedSignerEvm(SEED_PHRASE)) + + const account = await wallet.getAccount(2, { signerName: 'secondary' }) + + expect(account).toBeInstanceOf(WalletAccountEvm) + expect(account.path).toBe("m/44'/60'/0'/0/2") + }) + + test('should throw if the named signer does not exist', async () => { + await expect(wallet.getAccount(0, { signerName: 'missing' })) + .rejects.toThrow('No signer registered with name "missing".') + }) + + test('should return the account of a named private key signer (string overload)', async () => { + wallet.addSigner('hot', new PrivateKeySignerEvm(PRIVATE_KEY)) + + const account = await wallet.getAccount('hot') + + expect(account).toBeInstanceOf(WalletAccountEvm) + expect(await account.getAddress()).toBe(PRIVATE_KEY_ADDRESS) + }) + + test('should throw if the named signer does not exist (string overload)', async () => { + await expect(wallet.getAccount('missing')) + .rejects.toThrow('No signer registered with name "missing".') + }) + + test('should derive a detached account for a named derivable signer without handing out the root', async () => { + const named = new SeedSignerEvm(SEED_PHRASE) + wallet.addSigner('seed', named) + + const account = await wallet.getAccount('seed') + + expect(account).toBeInstanceOf(WalletAccountEvm) + expect(account.path).toBe("m/44'/60'/0'/0/0") + + // Disposing the account must not neuter the registered root. + account.dispose() + await expect(named.derive("0'/0/1")).resolves.toBeInstanceOf(SeedSignerEvm) + }) + + test('should mirror the registered signer\'s own (non-default) path', async () => { + wallet.addSigner('atFive', new SeedSignerEvm(SEED_PHRASE, { path: "0'/0/5" })) + + const account = await wallet.getAccount('atFive') + + expect(account.path).toBe("m/44'/60'/0'/0/5") + }) }) describe('getAccountByPath', () => { @@ -51,10 +120,25 @@ describe('WalletManagerEvm', () => { expect(account.path).toBe("m/44'/60'/1'/2/3") }) + test('should derive from a named signer via options.signerName', async () => { + wallet.addSigner('secondary', new SeedSignerEvm(SEED_PHRASE)) + + const account = await wallet.getAccountByPath("0'/0/0", { signerName: 'secondary' }) + + expect(account.path).toBe("m/44'/60'/0'/0/0") + }) + test('should throw if the path is invalid', async () => { await expect(wallet.getAccountByPath("a'/b/c")) .rejects.toThrow('invalid path component') }) + + test('should throw when deriving from a named private key signer', async () => { + wallet.addSigner('hot', new PrivateKeySignerEvm(PRIVATE_KEY)) + + await expect(wallet.getAccountByPath("0'/0/0", { signerName: 'hot' })) + .rejects.toThrow('PrivateKeySignerEvm does not support derivation.') + }) }) describe('getFeeRates', () => { @@ -67,7 +151,7 @@ describe('WalletManagerEvm', () => { }) test('should throw if the wallet is not connected to a provider', async () => { - const wallet = new WalletManagerEvm(SEED_PHRASE) + const wallet = new WalletManagerEvm(new SeedSignerEvm(SEED_PHRASE)) await expect(wallet.getFeeRates()) .rejects.toThrow('The wallet must be connected to a provider to get fee rates.') diff --git a/types/index.d.ts b/types/index.d.ts index bfe6884..dad3d51 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -17,3 +17,4 @@ export type EvmTransaction = import("./src/wallet-account-read-only-evm.js").Evm export type EvmTransferOptions = import("./src/wallet-account-read-only-evm.js").EvmTransferOptions; export type EvmWalletConfig = import("./src/wallet-account-read-only-evm.js").EvmWalletConfig; export type ApproveOptions = import("./src/wallet-account-evm.js").ApproveOptions; +export type UnsignedEvmTransaction = import("./src/utils/tx-populator-evm.js").UnsignedEvmTransaction; diff --git a/types/src/signers/index.d.ts b/types/src/signers/index.d.ts new file mode 100644 index 0000000..eb2de36 --- /dev/null +++ b/types/src/signers/index.d.ts @@ -0,0 +1,3 @@ +export { default as PrivateKeySignerEvm } from "./private-key-signer-evm.js"; +export { default, default as SeedSignerEvm } from "./seed-signer-evm.js"; +export type UnsignedEvmTransaction = import("../utils/tx-populator-evm.js").UnsignedEvmTransaction; diff --git a/types/src/signers/private-key-signer-evm.d.ts b/types/src/signers/private-key-signer-evm.d.ts new file mode 100644 index 0000000..0bf20bf --- /dev/null +++ b/types/src/signers/private-key-signer-evm.d.ts @@ -0,0 +1,81 @@ +import { ISignerEvm } from "./seed-signer-evm.js"; +/** @typedef {import('./seed-signer-evm.js').UnsignedEvmTransaction} UnsignedEvmTransaction */ +/** @typedef {import('../wallet-account-read-only-evm.js').TypedData} TypedData */ +/** @typedef {import('@tetherto/wdk-wallet').KeyPair} KeyPair */ +/** @typedef {import('ethers').AuthorizationRequest} AuthorizationRequest */ +/** @typedef {import('ethers').Authorization} Authorization */ +/** + * @extends {ISignerEvm} + * Signer that wraps a raw private key in a memory-safe buffer, exposing a minimal + * interface for signing messages, transactions and typed data. This signer does + * not support derivation and always represents a single account. + */ +export default class PrivateKeySignerEvm extends ISignerEvm { + /** + * @param {string|Uint8Array} privateKey - Hex string (with/without 0x) or raw key bytes. + */ + constructor(privateKey: string | Uint8Array); + /** @private */ + private _signingKey; + /** @private */ + private _wallet; + /** @private */ + private _address; + /** @private */ + private _path; + /** @type {boolean} */ + get isDerivable(): boolean; + /** @type {number|undefined} */ + get index(): number | undefined; + /** @type {string|undefined} */ + get path(): string | undefined; + /** @type {string} */ + get address(): string; + /** + * The account's key pair (private and public key buffers). + * @type {KeyPair} + */ + get keyPair(): KeyPair; + /** + * PrivateKeySignerEvm is not a hierarchical signer and cannot derive. + * @returns {Promise} + * @throws {SignerError} Always — private-key signers do not support derivation. + */ + derive(): Promise; + /** @returns {Promise} */ + getAddress(): Promise; + /** + * Signs a message. + * + * @param {string} message - The message to sign. + * @returns {Promise} The message's signature. + */ + sign(message: string): Promise; + /** + * Signs a transaction and returns the serialized signed transaction hex. + * + * @param {UnsignedEvmTransaction} unsignedTx - The unsigned transaction object. + * @returns {Promise} + */ + signTransaction(unsignedTx: UnsignedEvmTransaction): Promise; + /** + * Signs typed data according to EIP-712. + * + * @param {TypedData} typedData - The typed data to sign. + * @returns {Promise} The typed data signature. + */ + signTypedData({ domain, types, message }: TypedData): Promise; + /** + * Sign an ERC-7702 authorization tuple. + * @param {AuthorizationRequest} auth + * @returns {Promise} + */ + signAuthorization(auth: AuthorizationRequest): Promise; + /** Dispose secrets from memory. */ + dispose(): void; +} +export type UnsignedEvmTransaction = import("./seed-signer-evm.js").UnsignedEvmTransaction; +export type TypedData = import("../wallet-account-read-only-evm.js").TypedData; +export type KeyPair = import("@tetherto/wdk-wallet").KeyPair; +export type AuthorizationRequest = import("ethers").AuthorizationRequest; +export type Authorization = import("ethers").Authorization; diff --git a/types/src/signers/seed-signer-evm.d.ts b/types/src/signers/seed-signer-evm.d.ts new file mode 100644 index 0000000..a50bb27 --- /dev/null +++ b/types/src/signers/seed-signer-evm.d.ts @@ -0,0 +1,187 @@ +import { ISigner } from "@tetherto/wdk-wallet"; +/** @typedef {import('../wallet-account-read-only-evm.js').TypedData} TypedData */ +/** @typedef {import('@tetherto/wdk-wallet').KeyPair} KeyPair */ +/** @typedef {import('ethers').AuthorizationRequest} AuthorizationRequest */ +/** @typedef {import('ethers').Authorization} Authorization */ +/** @typedef {import('ethers').AuthorizationLike} AuthorizationLike */ +/** + * A fully-populated unsigned EVM transaction suitable for signing. + * Produced by the internal transaction populator and consumed by signer implementations. + */ +export type UnsignedEvmTransaction = { + chainId: number; + nonce: number; + from: string; + to: string | null; + data: string; + value: number | bigint; + type: number; + gasLimit: number | bigint; + gasPrice?: number | bigint; + maxFeePerGas?: number | bigint; + maxPriorityFeePerGas?: number | bigint; + accessList?: any[]; + maxFeePerBlobGas?: number | bigint; + blobs?: any[]; + blobVersionedHashes?: string[]; + authorizationList?: AuthorizationLike[]; +}; +export type SeedSignerEvmOpts = { + /** + * An existing HD node wallet root to derive from (internal; set by {@link SeedSignerEvm#derive}). + */ + root?: object; + /** + * Relative BIP-44 path segment (e.g. "0'/0/0"). Defaults to the account at index 0. + */ + path?: string; + /** + * Internal. When true, the signer is a derived child and does not retain the root (set by {@link SeedSignerEvm#derive}). + */ + isChild?: boolean; +}; +/** + * Interface for EVM signers, extending the base `ISigner` from `@tetherto/wdk-wallet`. + * + * @extends {ISigner} + * @interface + */ +export class ISignerEvm extends ISigner { + /** + * Whether this signer can derive child signers (i.e. it holds an HD root). Non-derivable + * signers (e.g. private-key signers) are bound directly to an account; derivable signers + * derive child accounts and keep the root for management only. + * @type {boolean} + */ + get isDerivable(): boolean; + /** + * The last component index for the derivation path of this signer, when applicable. + * @type {number|undefined} + */ + get index(): number | undefined; + /** + * The full derivation path if this is a child signer. + * @type {string|undefined} + */ + get path(): string | undefined; + /** + * The account's address, if available. + * @type {string|undefined} + */ + get address(): string | undefined; + /** + * The account's key pair. + * @type {KeyPair} + */ + get keyPair(): KeyPair; + /** + * Derive a child signer from this signer using a relative path (e.g. "0'/0/0"). + * + * @param {string} relPath - The relative BIP-44 path segment. + * @returns {Promise} The derived child signer. + * @throws {SignerError} If the signer does not support derivation (e.g. private-key signers). + */ + derive(relPath: string): Promise; + /** + * Returns the account's address. + * @returns {Promise} + */ + getAddress(): Promise; + /** + * Sign a plain message. + * @param {string} message + * @returns {Promise} + */ + sign(message: string): Promise; + /** + * Sign a transaction-like object compatible with ethers Transaction.from. + * @param {UnsignedEvmTransaction} unsignedTx + * @returns {Promise} The serialized signed transaction hex. + */ + signTransaction(unsignedTx: UnsignedEvmTransaction): Promise; + /** + * Signs typed data according to EIP-712. + * + * @param {TypedData} typedData - The typed data to sign. + * @returns {Promise} The typed data signature. + */ + signTypedData({ domain, types, message }: TypedData): Promise; + /** + * Sign an ERC-7702 authorization tuple. + * @param {AuthorizationRequest} auth + * @returns {Promise} + */ + signAuthorization(auth: AuthorizationRequest): Promise; + /** Clear any secret material from memory. */ + dispose(): void; +} +/** + * @extends {ISignerEvm} + * Signer implementation that derives keys from a BIP-39 seed using the BIP-44 Ethereum path. + * Always holds a derived account (index 0 by default). A root signer also retains the HD root + * and can derive child signers; a derived child holds only its own account. + */ +export default class SeedSignerEvm extends ISignerEvm { + /** + * Create a SeedSignerEvm. + * Provide a mnemonic/seed (children built via {@link derive} pass a shared root internally). + * + * @param {string|Uint8Array|null} seed - BIP-39 mnemonic or seed bytes. Omit when providing `opts.root`. + * @param {SeedSignerEvmOpts} [opts] - Construction options for root reuse, direct child derivation or path definition (default is index 0). + * @throws {Error} If neither a seed nor a root is provided, or if both are provided. + * @throws {Error} If a seed is provided but is not a valid BIP-39 mnemonic. + */ + constructor(seed: string | Uint8Array | null, opts?: SeedSignerEvmOpts); + /** @private */ + private _account; + /** @private */ + private _address; + /** @private */ + private _path; + /** @private */ + private _root; + get isDerivable(): boolean; + get index(): number | undefined; + get path(): string | undefined; + get address(): string; + get keyPair(): KeyPair; + /** + * Derive a child signer using the provided relative path (e.g. "0'/0/0"). + * @param {string} relPath + * @returns {Promise} + * @throws {Error} If called on a derived child signer, which does not retain the root. + */ + derive(relPath: string): Promise; + /** + * Sign a plain message string. + * @param {string} message + * @returns {Promise} + */ + sign(message: string): Promise; + /** + * Sign a transaction object and return its serialized form. + * @param {UnsignedEvmTransaction} unsignedTx + * @returns {Promise} + */ + signTransaction(unsignedTx: UnsignedEvmTransaction): Promise; + /** + * Signs typed data according to EIP-712. + * + * @param {TypedData} typedData - The typed data to sign. + * @returns {Promise} The typed data signature. + */ + signTypedData({ domain, types, message }: TypedData): Promise; + /** + * Sign an ERC-7702 authorization tuple. + * @param {AuthorizationRequest} auth + * @returns {Promise} + */ + signAuthorization(auth: AuthorizationRequest): Promise; + /** Disposes secrets from memory. */ + dispose(): void; +} +export type TypedData = import("../wallet-account-read-only-evm.js").TypedData; +export type KeyPair = import("@tetherto/wdk-wallet").KeyPair; +export type AuthorizationRequest = import("ethers").AuthorizationRequest; +export type Authorization = import("ethers").Authorization; +export type AuthorizationLike = import("ethers").AuthorizationLike; diff --git a/types/src/utils/tx-populator-evm.d.ts b/types/src/utils/tx-populator-evm.d.ts new file mode 100644 index 0000000..d64f14d --- /dev/null +++ b/types/src/utils/tx-populator-evm.d.ts @@ -0,0 +1,84 @@ +/** + * A fully or partially specified EVM transaction, prior to signing. + */ +export type UnsignedEvmTransaction = { + /** + * - The id of the chain the transaction targets. + */ + chainId: number; + /** + * - The sender's transaction count, used to order transactions. + */ + nonce: number; + /** + * - The sender's address. + */ + from: string; + /** + * - The recipient's address, or null for contract creation. + */ + to: string | null; + /** + * - The transaction's calldata as a hex string. + */ + data: string; + /** + * - The amount of native currency (in wei) to transfer. + */ + value: number | bigint; + /** + * - The EIP-2718 transaction type (0/1 legacy, 2 EIP-1559, 3 EIP-4844, 4 EIP-7702). + */ + type: number; + /** + * - The maximum amount of gas the transaction may consume. + */ + gasLimit: number | bigint; + /** + * - The gas price (in wei) for legacy (type 0/1) transactions. + */ + gasPrice?: number | bigint; + /** + * - The maximum total fee (in wei) per gas for EIP-1559 transactions. + */ + maxFeePerGas?: number | bigint; + /** + * - The maximum priority fee (in wei) per gas for EIP-1559 transactions. + */ + maxPriorityFeePerGas?: number | bigint; + /** + * - The EIP-2930 access list of addresses and storage keys. + */ + accessList?: any[]; + /** + * - The maximum fee (in wei) per blob gas for EIP-4844 transactions. + */ + maxFeePerBlobGas?: number | bigint; + /** + * - The blobs to include in an EIP-4844 transaction. + */ + blobs?: any[]; + /** + * - The versioned hashes of the EIP-4844 blobs. + */ + blobVersionedHashes?: string[]; + /** + * - The EIP-7702 authorization tuples. + */ + authorizationList?: AuthorizationLike[]; +}; +export type Provider = import("ethers").Provider; +export type AuthorizationLike = import("ethers").AuthorizationLike; +/** + * Build a fully populated unsigned transaction ready for signing. + * + * Resolves chain ID, nonce, gas limit and fee fields from the provider when not + * explicitly supplied in `tx`. Supports legacy (type 0/1), EIP-1559 (type 2), + * EIP-4844 (type 3) and EIP-7702 (type 4) transaction styles. + * + * @param {Provider} provider - An ethers-compatible JSON-RPC provider. + * @param {string} from - The sender address. + * @param {UnsignedEvmTransaction} tx - The partial transaction to populate. + * @returns {Promise} The fully populated unsigned transaction. + */ +export function populateTransactionEvm(provider: Provider, from: string, tx: UnsignedEvmTransaction): Promise; diff --git a/types/src/wallet-account-evm.d.ts b/types/src/wallet-account-evm.d.ts index 7f4d586..9ff6476 100644 --- a/types/src/wallet-account-evm.d.ts +++ b/types/src/wallet-account-evm.d.ts @@ -1,27 +1,39 @@ /** @implements {IWalletAccount} */ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm implements IWalletAccount { /** - * Creates a new evm wallet account. + * Legacy helper to create an account from seed + path. + * Creates a root signer from the seed and derives a child for the given path. * - * @param {string | Uint8Array} seed - The wallet's [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) seed phrase. + * @param {string | Uint8Array} seed - The wallet's BIP-39 seed phrase or seed bytes. * @param {string} path - The BIP-44 derivation path (e.g. "0'/0/0"). * @param {EvmWalletConfig} [config] - The configuration object. + * @returns {Promise} */ - constructor(seed: string | Uint8Array, path: string, config?: EvmWalletConfig); + static fromSeed(seed: string | Uint8Array, path: string, config?: EvmWalletConfig): Promise; /** - * The wallet account configuration. + * Creates a new evm wallet account from a raw private key. * - * @protected - * @type {EvmWalletConfig} + * @param {string | Uint8Array} privateKey - The raw private key (hex string with or without 0x, or 32 bytes). + * @param {EvmWalletConfig} [config] - The configuration object. + * @returns {WalletAccountEvm} The wallet account. */ - protected _config: EvmWalletConfig; + static fromPrivateKey(privateKey: string | Uint8Array, config?: EvmWalletConfig): WalletAccountEvm; /** - * The account. + * Creates a new evm wallet account using a signer. + * + * @param {ISignerEvm} signer - A signer implementing the EVM signer interface. + * @param {EvmWalletConfig} [config] - The configuration object. + */ + constructor(signer: ISignerEvm, config?: EvmWalletConfig); + /** + * The wallet account configuration. * * @protected - * @type {HDNodeWallet} + * @type {EvmWalletConfig} */ - protected _account: HDNodeWallet; + protected _config: EvmWalletConfig; + /** @private */ + private _signer; /** * The derivation path's index of this account. * @@ -44,6 +56,13 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm implement * @type {KeyPair} */ get keyPair(): KeyPair; + /** + * Returns the account's address. If it wasn't resolved at construction time (e.g hardware signers), it asks the + * underlying signer to resolve it, then caches it locally. + * + * @returns {Promise} The account's address. + */ + getAddress(): Promise; /** * Signs a message. * @@ -127,6 +146,7 @@ export default class WalletAccountEvm extends WalletAccountReadOnlyEvm implement */ dispose(): void; } +export type ISignerEvm = import("./signers/seed-signer-evm.js").ISignerEvm; export type HDNodeWallet = import("ethers").HDNodeWallet; export type AuthorizationRequest = import("ethers").AuthorizationRequest; export type Authorization = import("ethers").Authorization; diff --git a/types/src/wallet-account-read-only-evm.d.ts b/types/src/wallet-account-read-only-evm.d.ts index 2a5a1d9..6cbe8fd 100644 --- a/types/src/wallet-account-read-only-evm.d.ts +++ b/types/src/wallet-account-read-only-evm.d.ts @@ -141,9 +141,9 @@ export type DelegationInfo = { }; export type EvmTransaction = { /** - * - The transaction's recipient. + * - The transaction's recipient. Omit or pass null to deploy a contract. */ - to: string; + to?: string | null; /** * - The amount of ethers to send to the recipient (in weis). */ diff --git a/types/src/wallet-manager-evm.d.ts b/types/src/wallet-manager-evm.d.ts index 37638c4..183bb1c 100644 --- a/types/src/wallet-manager-evm.d.ts +++ b/types/src/wallet-manager-evm.d.ts @@ -1,3 +1,6 @@ +/** @typedef {import('ethers').Provider} Provider */ +/** @typedef {import("@tetherto/wdk-wallet").FeeRates} FeeRates */ +/** @typedef {import('./wallet-account-evm.js').EvmWalletConfig} EvmWalletConfig */ export default class WalletManagerEvm extends WalletManager { /** * Multiplier for normal fee rate calculations (in %). @@ -16,17 +19,15 @@ export default class WalletManagerEvm extends WalletManager { /** * Creates a new wallet manager for evm blockchains. * - * @param {string | Uint8Array} seed - The wallet's [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) seed phrase. - * @param {EvmWalletConfig} [config] - The configuration object. - */ - constructor(seed: string | Uint8Array, config?: EvmWalletConfig); - /** - * The evm wallet configuration. + * Accepts either a BIP-39 seed (string/Uint8Array) for backwards compatibility, or a + * pre-built root signer object. The default signer must be derivable (it must be able to + * derive child accounts); non-derivable signers (e.g. private-key signers) are not allowed + * as the default but may be registered by name via {@link addSigner} - If not adding to your global account managment for using just one non derivable signer create a standalone account. * - * @protected - * @type {EvmWalletConfig} + * @param {string|Uint8Array|ISignerEvm} seedOrSigner - A BIP-39 seed phrase, seed bytes, or a root signer. + * @param {EvmWalletConfig} [config] - The configuration object. */ - protected _config: EvmWalletConfig; + constructor(seedOrSigner: string | Uint8Array | ISignerEvm, config?: EvmWalletConfig); /** * An ethers provider to interact with a node of the blockchain. * @@ -35,25 +36,41 @@ export default class WalletManagerEvm extends WalletManager { */ protected _provider: Provider | undefined; /** - * Returns the wallet account at a specific index (see [BIP-44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki)). + * Returns the wallet account at a specific index. * - * @example - * // Returns the account with derivation path m/44'/60'/0'/0/1 - * const account = await wallet.getAccount(1); * @param {number} [index] - The index of the account to get (default: 0). + * @param {Object} [options] - Account options. + * @param {string} [options.signerName] - The signer name. Omit to use the default signer. + * @returns {Promise} The account. + * @throws {Error} If a signer name is given but no signer exists with that name. + * @throws {SignerError} If the signer doesn't support account derivation. + */ + getAccount(index?: number, options?: { + signerName?: string; + }): Promise; + /** + * Returns the wallet account associated with a registered signer. Non-derivable + * signers (e.g. private-key signers) return the signer's single account; derivable signers + * derive a detached child at the signer's own account (the root is never handed out). + * + * @param {string} signerName - The signer name registered via {@link addSigner}. * @returns {Promise} The account. + * @throws {Error} If no signer exists with the given name. */ - getAccount(index?: number): Promise; + getAccount(signerName: string): Promise; /** - * Returns the wallet account at a specific BIP-44 derivation path. + * Returns the wallet account at a specific derivation path. * - * @example - * // Returns the account with derivation path m/44'/60'/0'/0/1 - * const account = await wallet.getAccountByPath("0'/0/1"); * @param {string} path - The derivation path (e.g. "0'/0/0"). + * @param {Object} [options] - Account options. + * @param {string} [options.signerName] - The signer name. Omit to use the default signer. * @returns {Promise} The account. + * @throws {Error} If a signer name is given but no signer exists with that name. + * @throws {SignerError} If the signer doesn't support account derivation. */ - getAccountByPath(path: string): Promise; + getAccountByPath(path: string, options?: { + signerName?: string; + }): Promise; /** * Returns the current fee rates. * @@ -61,6 +78,7 @@ export default class WalletManagerEvm extends WalletManager { */ getFeeRates(): Promise; } +export type ISignerEvm = import("./signers/seed-signer-evm.js").ISignerEvm; export type Provider = import("ethers").Provider; export type FeeRates = import("@tetherto/wdk-wallet").FeeRates; export type EvmWalletConfig = import("./wallet-account-evm.js").EvmWalletConfig;