diff --git a/.c8rc b/.c8rc index 083c51e7..8e21c13f 100644 --- a/.c8rc +++ b/.c8rc @@ -1,7 +1,7 @@ { "extension": [".ts"], "include": ["src/**/*.ts"], - "exclude": ["**/*.d.ts", "**/*.test.ts"], + "exclude": ["**/*.d.ts", "**/*.test.ts", "src/types/**/*.ts"], "all": true, "coverage": true, "reporter": ["text", "html"] diff --git a/.mocharc b/.mocharc index 9c230ab0..1f8a9636 100644 --- a/.mocharc +++ b/.mocharc @@ -1,7 +1,14 @@ { - "extension": ["ts"], - "spec": ["tests/**/*.test.ts", "src/**/*.test.ts"], - "require": ["ts-node/register/transpile-only"], + "extension": [ + "ts" + ], + "spec": [ + "tests/**/*.test.ts" + ], + "require": [ + "ts-node/register/transpile-only", + "./mocha.setup.cjs" + ], "timeout": "10000", "parallel": false, "recursive": true, diff --git a/README.md b/README.md index fcbfa025..68be820e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,114 @@ -# turbo-sdk +# @ardriveapp/turbo-sdk 🚀 -Hello developer, welcome to this SDK!! +Welcome to the `@ardrive/turbo-sdk`! This SDK provides functionalities for interacting with the Turbo Upload and Payment Services. It is available in both NodeJS and Web environments. + +## Table of Contents + +- [Installation](#installation) +- [Usage](#usage): + + - [NodeJS Environments](#nodejs) + - [CommonJS](#commonjs) + - [ESM](#esm) + - [Web Environments](#web) + - [Bundlers (Webpack, Rollup, ESbuild, etc.)](#bundlers-webpack-rollup-esbuild-etc) + - [Browser](#browser) + - [Typescript](#typescript) + - [Examples](./examples) + +- [Contributions](#contributions) + +# Installation + +```shell +npm install @ardrive/turbo-sdk +``` + +or + +```shell +yarn add @ardrive/turbo-sdk +``` + +# Usage + +The SDK is available in both CommonJS and ESM formats and is compatible with bundlers such as Webpack, Rollup, and ESbuild. + +## Web + +# Bundlers (Webpack, Rollup, ESbuild, etc.) + +```javascript +import { TurboFactory } from '@ardrive/turbo-sdk/web'; + +const turbo = TurboFactory.unauthenticated({}); +const rates = await turbo.getFiatRates(); +``` + +### Browser + +```html + + +``` + +## NodeJS + +### CommonJS + +```javascript +const { TurboFactory } = require('@ardrive/turbo-sdk/node'); + +const turbo = TurboFactory.unauthenticated({}); +const rates = await turbo.getFiatRates(); +``` + +### ESM + +```javascript +import { TurboFactory } from '@ardrive/turbo-sdk/node'; + +const turbo = TurboFactory.unauthenticated({}); +const rates = await turbo.getFiatRates(); +``` + +## Typescript + +The SDK provides TypeScript typings. When you import the SDK in a TypeScript project: + +```typescript +import Ardrive from '@ardrive/turbo-sdk/web'; + +// or '@ardrive/turbo-sdk/node' for Node.js projects +``` + +The provided typings (`./lib/types/index.d.ts`) will be automatically recognized, offering type checking and autocompletion benefits. + +# APIs (WIP) + +## TurboFactory + +- `public()` +- `private()` + +## TurboUnauthenticatedClient + +- `getFiatRates()` +- `getFiatToAR()` +- `getSupportedCountries()` +- `getSupportedCurrencies()` +- `getWincForFiat()` +- `getUploadCosts()` +- `uploadSignedDataItem()` + +## TurboAuthenticatedClient + +- `getBalance()` +- `uploadFile()` + +# Contributions + +If you encounter any issues or have feature requests, please file an issue on our GitHub repository. Contributions, pull requests, and feedback are welcome and encouraged. diff --git a/bundle.cjs b/bundle.cjs index 2714e2dd..610c0629 100644 --- a/bundle.cjs +++ b/bundle.cjs @@ -5,13 +5,14 @@ const stdLibBrowser = require('node-stdlib-browser'); const bundle = async () => { console.log('Building web bundle esm.'); const result = await build({ - entryPoints: ['./src/index.ts'], + entryPoints: ['./src/web/index.ts'], bundle: true, platform: 'browser', target: ['esnext'], format: 'esm', globalName: 'turbo', plugins: [plugin(stdLibBrowser)], + tsconfig: './tsconfig.web.json', outfile: './bundles/web.bundle.min.js', inject: [require.resolve('node-stdlib-browser/helpers/esbuild/shim')], define: { diff --git a/examples/node/files/0_kb.txt b/examples/node/files/0_kb.txt new file mode 100644 index 00000000..e69de29b diff --git a/examples/node/index.cjs b/examples/node/index.cjs index 4b51ac34..a2277a59 100644 --- a/examples/node/index.cjs +++ b/examples/node/index.cjs @@ -1,25 +1,40 @@ -const Arweave = require('arweave'); -const TurboFactory = require('../../lib/index.js'); - (async () => { + const { default: Arweave } = await import('arweave'); + const { TurboFactory, TurboUnauthenticatedPaymentService } = await import( + '../../lib/node/index.js' + ); + const path = require('path'); + const fs = require('fs'); /** * Fetching rates using an unauthenticated Turbo client. */ - const turbo = TurboFactory.init(); - const rates = await turbo.getRates(); + const turbo = TurboFactory.unauthenticated(); + const rates = await turbo.getFiatRates(); console.log('Fetched rates:', JSON.stringify(rates, null, 2)); + /** + * Alternatively instantiate your own clients independently. + */ + const paymentService = new TurboUnauthenticatedPaymentService({ + url: 'https://payment.ardrive.dev', + }); + const supportedCurrencies = await paymentService.getSupportedCurrencies(); + console.log( + 'Supported currencies:', + JSON.stringify(supportedCurrencies, null, 2), + ); + /** * Create a new arweave private key */ - const arweave = Arweave.init(); + const arweave = new Arweave({}); const jwk = await Arweave.crypto.generateJWK(); const address = await arweave.wallets.jwkToAddress(jwk); /** * Use the arweave key to create an authenticated turbo client */ - const turboAuthClient = TurboFactory.init({ privateKey: jwk }); + const turboAuthClient = TurboFactory.authenticated({ privateKey: jwk }); /** * Fetch the balance for the private key. @@ -38,11 +53,22 @@ const TurboFactory = require('../../lib/index.js'); ); /** - * Fetch the estimated amount of winc returned for $1 USD + * Fetch the estimated amount of winc returned for 10 USD (1000 cents). */ const estimatedWinc = await turboAuthClient.getWincForFiat({ amount: 1000, currency: 'usd', }); console.log('10 USD to winc:', estimatedWinc); + + /** + * Post local files to the Turbo service. + */ + console.log('Posting raw file to Turbo service...'); + const filePath = path.join(__dirname, './files/0_kb.txt'); + const uploadResult = await turboAuthClient.uploadFile({ + fileStreamFactory: () => fs.createReadStream(filePath), + signal: AbortSignal.timeout(10_000), // cancel the upload after 10 seconds + }); + console.log(JSON.stringify(uploadResult, null, 2)); })(); diff --git a/examples/node/index.mjs b/examples/node/index.mjs index f32de8f9..1dc5987b 100644 --- a/examples/node/index.mjs +++ b/examples/node/index.mjs @@ -1,22 +1,38 @@ import Arweave from 'arweave'; +import fs from 'fs'; -import { TurboFactory } from '../../lib/index.js'; +import { + TurboFactory, + TurboUnauthenticatedPaymentService, +} from '../../lib/node/index.js'; (async () => { /** * Fetching rates using an unauthenticated Turbo client. */ - const turbo = TurboFactory.init(); + const turbo = TurboFactory.unauthenticated(); const rates = await turbo.getFiatRates(); console.log('Fetched rates:', JSON.stringify(rates, null, 2)); + /* + * Alternatively instantiate your own clients independently. + */ + const paymentService = new TurboUnauthenticatedPaymentService({ + url: 'https://payment.ardrive.dev', + }); + const supportedCurrencies = await paymentService.getSupportedCurrencies(); + console.log( + 'Supported currencies:', + JSON.stringify(supportedCurrencies, null, 2), + ); + /** * Fetching balance using an authenticated Turbo client. */ - const arweave = Arweave.init(); + const arweave = new Arweave.init(); const jwk = await Arweave.crypto.generateJWK(); const address = await arweave.wallets.jwkToAddress(jwk); - const turboAuthClient = TurboFactory.init({ privateKey: jwk }); + const turboAuthClient = TurboFactory.authenticated({ privateKey: jwk }); const balance = await turboAuthClient.getBalance(); console.log( 'Balance:', @@ -31,11 +47,22 @@ import { TurboFactory } from '../../lib/index.js'; ); /** - * Fetch the estimated amount of winc returned for $1 USD + * Fetch the estimated amount of winc returned for 10 USD (1000 cents). */ const estimatedWinc = await turboAuthClient.getWincForFiat({ amount: 1000, currency: 'usd', }); console.log('10 USD to winc:', estimatedWinc); + + /** + * Post local files to the Turbo service. + */ + console.log('Posting raw files to Turbo service...'); + const filePath = new URL('files/0_kb.txt', import.meta.url).pathname; + const uploadResult = await turboAuthClient.uploadFile({ + fileStreamFactory: () => fs.createReadStream(filePath), + signal: AbortSignal.timeout(10_000), // cancel the upload after 10 second + }); + console.log(JSON.stringify(uploadResult, null, 2)); })(); diff --git a/examples/web/index.html b/examples/web/index.html index f4f53754..6f365fe0 100644 --- a/examples/web/index.html +++ b/examples/web/index.html @@ -18,15 +18,43 @@

Rates

Balance

Fetching balance for generated wallet... +
+

Upload File

+ +
+ + +

+ +

+ +
+
diff --git a/mocha.setup.cjs b/mocha.setup.cjs new file mode 100644 index 00000000..6d1410b9 --- /dev/null +++ b/mocha.setup.cjs @@ -0,0 +1 @@ +global.crypto = require('crypto').webcrypto; diff --git a/package.json b/package.json index 2b9ce2b4..3df886e3 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "@ardrive/turbo-sdk", "version": "0.0.1", - "main": "./lib/index.js", - "types": "./lib/index.d.ts", + "main": "./lib/node/index.js", + "types": "./lib/types/index.d.ts", "type": "module", "repository": { "type": "git", @@ -21,9 +21,20 @@ }, "exports": { ".": { - "import": "./lib/index.js", - "require": "./lib/index.js", - "types": "./lib/index.d.ts", + "import": "./lib/node/index.js", + "require": "./lib/node/index.js", + "types": "./lib/types/index.d.ts", + "browser": "./bundles/web.bundle.min.js" + }, + "./node": { + "import": "./lib/node/index.js", + "require": "./lib/node/index.js", + "types": "./lib/types/index.d.ts" + }, + "./web": { + "import": "./lib/web/index.js", + "require": "./lib/web/index.js", + "types": "./lib/types/index.d.ts", "browser": "./bundles/web.bundle.min.js" } }, @@ -33,7 +44,7 @@ "license": "AGPL-3.0-or-later", "scripts": { "build:web": "node bundle.cjs", - "build:esm": "yarn tsc -p tsconfig.json && cp package.json README.md LICENSE.md ./lib", + "build:esm": "yarn tsc -p tsconfig.node.json && yarn tsc -p tsconfig.web.json && cp package.json README.md LICENSE.md ./lib", "build": "yarn clean && yarn build:web && yarn build:esm", "clean": "rimraf [ lib coverage bundles ]", "postinstall": "husky install", @@ -41,13 +52,16 @@ "lint:fix": "eslint src --fix", "format": "prettier --check .", "format:fix": "prettier --write .", - "test": "c8 mocha --config .mocharc", + "test": "c8 mocha --config .mocharc --exit", + "test:web": "c8 mocha --config .mocharc --exclude tests/**/*.node.test.ts --exit", + "test:node": "c8 mocha --config .mocharc --exclude tests/**/*.web.test.ts --exit", "prepare": "husky install", "example:mjs": "yarn build:esm && node examples/node/index.mjs", - "example:cjs": "yarn build:esm && node examples/node/index.mjs", + "example:cjs": "yarn build:esm && node examples/node/index.cjs", "example:web": "yarn build:web && cp -r bundles/* examples/web && http-server --port 8080 --host -o examples/web" }, "dependencies": { + "arbundles": "^0.9.9", "arweave": "^1.14.4", "axios": "^1.4.0", "retry-axios": "^3.0.0", diff --git a/src/utils/jwk.ts b/src/common/factory.ts similarity index 51% rename from src/utils/jwk.ts rename to src/common/factory.ts index e9ea757a..7bbf2cfb 100644 --- a/src/utils/jwk.ts +++ b/src/common/factory.ts @@ -14,30 +14,25 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { KeyObject, createPrivateKey, createPublicKey } from 'crypto'; +import { TurboPublicConfiguration } from '../types/turbo.js'; +import { TurboUnauthenticatedPaymentService } from './payment.js'; +import { TurboUnauthenticatedClient } from './turbo.js'; +import { TurboUnauthenticatedUploadService } from './upload.js'; -import { JWKInterface } from '../types/index.js'; - -export function jwkInterfaceToPublicKey(jwk: JWKInterface): KeyObject { - const publicKey = createPublicKey({ - key: { - ...jwk, - kty: 'RSA', - }, - format: 'jwk', - }); - - return publicKey; -} - -export function jwkInterfaceToPrivateKey(jwk: JWKInterface): KeyObject { - const privateKey = createPrivateKey({ - key: { - ...jwk, - kty: 'RSA', - }, - format: 'jwk', - }); - - return privateKey; +export class TurboBaseFactory { + static unauthenticated({ + paymentServiceConfig = {}, + uploadServiceConfig = {}, + }: TurboPublicConfiguration = {}) { + const paymentService = new TurboUnauthenticatedPaymentService({ + ...paymentServiceConfig, + }); + const uploadService = new TurboUnauthenticatedUploadService({ + ...uploadServiceConfig, + }); + return new TurboUnauthenticatedClient({ + uploadService, + paymentService, + }); + } } diff --git a/src/common/http.ts b/src/common/http.ts new file mode 100644 index 00000000..a23eed2a --- /dev/null +++ b/src/common/http.ts @@ -0,0 +1,96 @@ +/** + * Copyright (C) 2022-2023 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { AxiosInstance } from 'axios'; +import { RetryConfig } from 'retry-axios'; +import { Readable } from 'stream'; +import { ReadableStream } from 'stream/web'; + +import { + TurboHTTPServiceInterface, + TurboSignedRequestHeaders, +} from '../types/turbo.js'; +import { createAxiosInstance } from '../utils/axiosClient.js'; +import { FailedRequestError } from '../utils/errors.js'; + +export class TurboHTTPService implements TurboHTTPServiceInterface { + protected axios: AxiosInstance; + constructor({ + url, + retryConfig, + }: { + url: string; + retryConfig?: RetryConfig; + }) { + this.axios = createAxiosInstance({ + axiosConfig: { + baseURL: url, + }, + retryConfig, + }); + } + async get({ + endpoint, + signal, + allowedStatuses = [200, 202], + headers, + }: { + endpoint: string; + signal?: AbortSignal; + allowedStatuses?: number[]; + headers?: Partial & Record; + }): Promise { + const { status, statusText, data } = await this.axios.get(endpoint, { + headers, + signal, + }); + + if (!allowedStatuses.includes(status)) { + throw new FailedRequestError(status, statusText); + } + + return data; + } + + async post({ + endpoint, + signal, + allowedStatuses = [200, 202], + headers, + data, + }: { + endpoint: string; + signal?: AbortSignal; + allowedStatuses?: number[]; + headers?: Partial & Record; + data: Readable | Buffer | ReadableStream; + }): Promise { + const { + status, + statusText, + data: response, + } = await this.axios.post(endpoint, data, { + headers, + signal, + }); + + if (!allowedStatuses.includes(status)) { + throw new FailedRequestError(status, statusText); + } + + return response; + } +} diff --git a/src/common/index.ts b/src/common/index.ts index 467cd5f8..de2914b1 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -14,5 +14,6 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ +export * from './upload.js'; export * from './payment.js'; export * from './turbo.js'; diff --git a/src/common/payment.ts b/src/common/payment.ts index f08e6be5..2bde56e8 100644 --- a/src/common/payment.ts +++ b/src/common/payment.ts @@ -14,58 +14,41 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { AxiosInstance } from 'axios'; - -import { JWKInterface } from '../types/arweave.js'; import { Currency, + TurboAuthenticatedPaymentServiceInterface, + TurboAuthenticatedPaymentServiceInterfaceConfiguration, TurboBalanceResponse, TurboCountriesResponse, TurboCurrenciesResponse, TurboFiatToArResponse, - TurboPaymentService, - TurboPaymentServiceConfiguration, TurboPriceResponse, TurboRatesResponse, + TurboUnauthenticatedPaymentServiceInterface, + TurboUnauthenticatedPaymentServiceInterfaceConfiguration, + TurboWalletSigner, } from '../types/turbo.js'; -import { createAxiosInstance } from '../utils/axiosClient.js'; -import { - FailedRequestError, - UnauthenticatedRequestError, -} from '../utils/errors.js'; -import { signedRequestHeadersFromJwk } from '../utils/signData.js'; +import { TurboHTTPService } from './http.js'; -export class TurboDefaultPaymentService implements TurboPaymentService { - protected readonly axios: AxiosInstance; - protected readonly privateKey: JWKInterface | undefined; +export class TurboUnauthenticatedPaymentService + implements TurboUnauthenticatedPaymentServiceInterface +{ + protected readonly httpService: TurboHTTPService; constructor({ url = 'https://payment.ardrive.dev', retryConfig, - privateKey, - }: TurboPaymentServiceConfiguration) { - this.privateKey = privateKey; - this.axios = createAxiosInstance({ - axiosConfig: { - baseURL: `${url}/v1`, - }, + }: TurboUnauthenticatedPaymentServiceInterfaceConfiguration) { + this.httpService = new TurboHTTPService({ + url: `${url}/v1`, retryConfig, }); } async getFiatRates(): Promise { - const { - status, - statusText, - data: rates, - } = await this.axios.get('/rates'); - - if (status !== 200) { - throw new FailedRequestError(status, statusText); - } - - // TODO: should we return just the fiat rates instead of the whole response? - return rates; + return this.httpService.get({ + endpoint: '/rates', + }); } async getFiatToAR({ @@ -73,45 +56,21 @@ export class TurboDefaultPaymentService implements TurboPaymentService { }: { currency: Currency; }): Promise { - const { - status, - statusText, - data: rate, - } = await this.axios.get(`/rates/${currency}`); - - if (status !== 200) { - throw new FailedRequestError(status, statusText); - } - - return rate; + return this.httpService.get({ + endpoint: `/rates/${currency}`, + }); } async getSupportedCountries(): Promise { - const { - status, - statusText, - data: countries, - } = await this.axios.get('/countries'); - - if (status !== 200) { - throw new FailedRequestError(status, statusText); - } - - return countries; + return this.httpService.get({ + endpoint: '/countries', + }); } async getSupportedCurrencies(): Promise { - const { - status, - statusText, - data: currencies, - } = await this.axios.get('/currencies'); - - if (status !== 200) { - throw new FailedRequestError(status, statusText); - } - - return currencies; + return this.httpService.get({ + endpoint: '/currencies', + }); } async getUploadCosts({ @@ -120,70 +79,48 @@ export class TurboDefaultPaymentService implements TurboPaymentService { bytes: number[]; }): Promise { const fetchPricePromises = bytes.map((byteCount: number) => - this.axios.get(`/price/bytes/${byteCount}`), + this.httpService.get({ + endpoint: `/price/bytes/${byteCount}`, + }), ); - const responses = await Promise.all(fetchPricePromises); - const wincCostsForBytes = responses.map( - ({ - status, - statusText, - data, - }: { - status: number; - statusText: string; - data: TurboPriceResponse; - }) => { - if (status !== 200) { - throw new FailedRequestError(status, statusText); - } - return data; - }, - ); - + const wincCostsForBytes: TurboPriceResponse[] = + await Promise.all(fetchPricePromises); return wincCostsForBytes; } async getWincForFiat({ amount, currency }): Promise { - const { - status, - statusText, - data: wincForFiat, - } = await this.axios.get( - `/price/${currency}/${amount}`, - ); + return this.httpService.get({ + endpoint: `/price/${currency}/${amount}`, + }); + } +} - if (status !== 200) { - throw new FailedRequestError(status, statusText); - } +// NOTE: to avoid redundancy, we use inheritance here - but generally prefer composition over inheritance +export class TurboAuthenticatedPaymentService + extends TurboUnauthenticatedPaymentService + implements TurboAuthenticatedPaymentServiceInterface +{ + protected readonly httpService: TurboHTTPService; + protected readonly signer: TurboWalletSigner; - return wincForFiat; + constructor({ + url = 'https://payment.ardrive.dev', + retryConfig, + signer, + }: TurboAuthenticatedPaymentServiceInterfaceConfiguration) { + super({ url, retryConfig }); + this.signer = signer; } async getBalance(): Promise { - if (!this.privateKey) { - throw new UnauthenticatedRequestError(); - } - - const headers = await signedRequestHeadersFromJwk(this.privateKey); - - const { - status, - statusText, - data: balance, - } = await this.axios.get('/balance', { + const headers = await this.signer.generateSignedRequestHeaders(); + const balance = await this.httpService.get({ + endpoint: '/balance', headers, + allowedStatuses: [200, 404], }); - if (status === 404) { - return { - winc: '0', - }; - } - - if (status !== 200) { - throw new FailedRequestError(status, statusText); - } - - return balance; + // 404's don't return a balance, so default to 0 + return balance.winc ? balance : { winc: '0' }; } } diff --git a/src/common/turbo.ts b/src/common/turbo.ts index 6f6c31b5..86a6f6cc 100644 --- a/src/common/turbo.ts +++ b/src/common/turbo.ts @@ -14,35 +14,38 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { TurboNodeUploadService } from '../node/upload.js'; -import { JWKInterface, TurboBalanceResponse } from '../types/index.js'; import { Currency, - Turbo, - TurboClientConfiguration, + TurboAbortSignal, + TurboAuthenticatedPaymentServiceInterface, + TurboAuthenticatedUploadServiceInterface, + TurboBalanceResponse, TurboCountriesResponse, TurboCurrenciesResponse, TurboFiatToArResponse, - TurboPaymentService, + TurboFileFactory, TurboPriceResponse, + TurboPrivateClient, + TurboPrivateClientConfiguration, + TurboPublicClient, + TurboPublicClientConfiguration, TurboRatesResponse, - TurboUploadService, + TurboSignedDataItemFactory, + TurboUnauthenticatedPaymentServiceInterface, + TurboUnauthenticatedUploadServiceInterface, + TurboUploadDataItemResponse, } from '../types/index.js'; -import { TurboDefaultPaymentService } from './payment.js'; +import { TurboUnauthenticatedPaymentService } from './payment.js'; +import { TurboUnauthenticatedUploadService } from './upload.js'; -export class TurboClient implements Turbo { - protected readonly jwk: JWKInterface | undefined; - protected readonly paymentService: TurboPaymentService; - protected readonly uploadService: TurboUploadService; +export class TurboUnauthenticatedClient implements TurboPublicClient { + protected readonly paymentService: TurboUnauthenticatedPaymentServiceInterface; + protected readonly uploadService: TurboUnauthenticatedUploadServiceInterface; constructor({ - uploadService = new TurboNodeUploadService({ - url: 'https://turbo.ardrive.dev', - }), - paymentService = new TurboDefaultPaymentService({ - url: 'https://payment.ardrive.dev', - }), - }: TurboClientConfiguration) { + uploadService = new TurboUnauthenticatedUploadService({}), + paymentService = new TurboUnauthenticatedPaymentService({}), + }: TurboPublicClientConfiguration) { this.paymentService = paymentService; this.uploadService = uploadService; } @@ -106,12 +109,50 @@ export class TurboClient implements Turbo { return this.paymentService.getWincForFiat({ amount, currency }); } + /** + * Uploads a signed data item to the Turbo Upload Service. + */ + async uploadSignedDataItem({ + dataItemStreamFactory, + signal, + }: TurboSignedDataItemFactory & + TurboAbortSignal): Promise { + return this.uploadService.uploadSignedDataItem({ + dataItemStreamFactory, + signal, + }); + } +} + +export class TurboAuthenticatedClient + extends TurboUnauthenticatedClient + implements TurboPrivateClient +{ + protected readonly paymentService: TurboAuthenticatedPaymentServiceInterface; + protected readonly uploadService: TurboAuthenticatedUploadServiceInterface; + + constructor({ + paymentService, + uploadService, + }: TurboPrivateClientConfiguration) { + super({ paymentService, uploadService }); + } + /** * Returns the current balance of the user's wallet in 'winc'. - * - * Note: 'privateKey' must be provided to use. */ async getBalance(): Promise { return this.paymentService.getBalance(); } + + /** + * Signs and uploads raw data to the Turbo Upload Service. + */ + async uploadFile({ + fileStreamFactory, + signal, + }: TurboFileFactory & + TurboAbortSignal): Promise { + return this.uploadService.uploadFile({ fileStreamFactory, signal }); + } } diff --git a/src/common/upload.ts b/src/common/upload.ts new file mode 100644 index 00000000..56c9fc9b --- /dev/null +++ b/src/common/upload.ts @@ -0,0 +1,97 @@ +/** + * Copyright (C) 2022-2023 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { + TurboAbortSignal, + TurboAuthenticatedUploadServiceConfiguration, + TurboAuthenticatedUploadServiceInterface, + TurboFileFactory, + TurboSignedDataItemFactory, + TurboUnauthenticatedUploadServiceInterface, + TurboUnauthenticatedUploadServiceInterfaceConfiguration, + TurboUploadDataItemResponse, + TurboWalletSigner, +} from '../types/turbo.js'; +import { TurboHTTPService } from './http.js'; + +export class TurboUnauthenticatedUploadService + implements TurboUnauthenticatedUploadServiceInterface +{ + protected httpService: TurboHTTPService; + + constructor({ + url = 'https://upload.ardrive.dev', + retryConfig, + }: TurboUnauthenticatedUploadServiceInterfaceConfiguration) { + this.httpService = new TurboHTTPService({ + url: `${url}/v1`, + retryConfig, + }); + } + + async uploadSignedDataItem({ + dataItemStreamFactory, + signal, + }: TurboSignedDataItemFactory & + TurboAbortSignal): Promise { + // TODO: add p-limit constraint or replace with separate upload class + return this.httpService.post({ + endpoint: `/tx`, + signal, + data: dataItemStreamFactory(), + headers: { + 'content-type': 'application/octet-stream', + }, + }); + } +} + +// NOTE: to avoid redundancy, we use inheritance here - but generally prefer composition over inheritance +export class TurboAuthenticatedUploadService + extends TurboUnauthenticatedUploadService + implements TurboAuthenticatedUploadServiceInterface +{ + protected httpService: TurboHTTPService; + protected signer: TurboWalletSigner; + + constructor({ + url = 'https://upload.ardrive.dev', + retryConfig, + signer, + }: TurboAuthenticatedUploadServiceConfiguration) { + super({ url, retryConfig }); + this.signer = signer; + } + + async uploadFile({ + fileStreamFactory, + signal, + }: TurboFileFactory & + TurboAbortSignal): Promise { + const signedDataItem = await this.signer.signDataItem({ + fileStreamFactory, + }); + // TODO: add p-limit constraint or replace with separate upload class + return this.httpService.post({ + endpoint: `/tx`, + signal, + data: signedDataItem, + headers: { + 'content-type': 'application/octet-stream', + }, + }); + } +} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index e4435602..00000000 --- a/src/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (C) 2022-2023 Permanent Data Solutions, Inc. All Rights Reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -import { - TurboClient, - TurboDefaultPaymentService as TurboPaymentService, -} from './common/index.js'; -import { TurboNodeUploadService } from './node/upload.js'; -import { TurboConfiguration } from './types/index.js'; -import { isBrowser } from './utils/browser.js'; -import { TurboWebUploadService } from './web/upload.js'; - -const defaultTurboConfig = { - paymentServiceConfig: { - url: 'https://payment.ardrive.dev', - }, - uploadServiceConfig: { - url: 'https://upload.ardrive.dev', - }, -}; - -export class TurboFactory { - static init(config: TurboConfiguration = defaultTurboConfig) { - const { - privateKey = undefined, - paymentServiceConfig, - uploadServiceConfig, - } = { - ...defaultTurboConfig, - ...config, - }; - const paymentService = new TurboPaymentService({ - ...paymentServiceConfig, - privateKey, - }); - if (isBrowser()) { - const uploadService = new TurboWebUploadService({ - ...uploadServiceConfig, - privateKey, - }); - return new TurboClient({ uploadService, paymentService }); - } else { - const uploadService = new TurboNodeUploadService({ - ...uploadServiceConfig, - privateKey, - }); - return new TurboClient({ uploadService, paymentService }); - } - } -} diff --git a/src/node/factory.ts b/src/node/factory.ts new file mode 100644 index 00000000..a6d1f289 --- /dev/null +++ b/src/node/factory.ts @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2022-2023 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { TurboBaseFactory } from '../common/factory.js'; +import { + TurboAuthenticatedClient, + TurboAuthenticatedPaymentService, + TurboAuthenticatedUploadService, +} from '../common/index.js'; +import { TurboPrivateConfiguration } from '../types/index.js'; +import { TurboNodeArweaveSigner } from './signer.js'; + +export class TurboFactory extends TurboBaseFactory { + static authenticated({ + privateKey, + paymentServiceConfig = {}, + uploadServiceConfig = {}, + }: TurboPrivateConfiguration) { + const signer = new TurboNodeArweaveSigner({ privateKey }); + const paymentService = new TurboAuthenticatedPaymentService({ + ...paymentServiceConfig, + signer, + }); + const uploadService = new TurboAuthenticatedUploadService({ + ...uploadServiceConfig, + signer, + }); + return new TurboAuthenticatedClient({ + uploadService, + paymentService, + }); + } +} diff --git a/src/web/upload.ts b/src/node/index.ts similarity index 74% rename from src/web/upload.ts rename to src/node/index.ts index 22218f5f..31d71615 100644 --- a/src/web/upload.ts +++ b/src/node/index.ts @@ -14,13 +14,6 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { - TurboUploadService, - TurboUploadServiceConfiguration, -} from '../types/index.js'; - -/* eslint-disable */ -export class TurboWebUploadService implements TurboUploadService { - // @ts-ignore - constructor(config: TurboUploadServiceConfiguration) {} -} +export * from './factory.js'; +export * from './signer.js'; +export * from '../common/index.js'; diff --git a/src/node/signer.ts b/src/node/signer.ts new file mode 100644 index 00000000..0082335a --- /dev/null +++ b/src/node/signer.ts @@ -0,0 +1,58 @@ +/** + * Copyright (C) 2022-2023 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { ArweaveSigner, streamSigner } from 'arbundles'; +import Arweave from 'arweave/node/index.js'; +import { randomBytes } from 'node:crypto'; +import { Readable } from 'node:stream'; + +import { JWKInterface } from '../types/arweave.js'; +import { TurboWalletSigner } from '../types/turbo.js'; +import { toB64Url } from '../utils/base64.js'; + +export class TurboNodeArweaveSigner implements TurboWalletSigner { + protected privateKey: JWKInterface; + protected signer: ArweaveSigner; // TODO: replace with internal signer class + + // TODO: replace with internal signer class + constructor({ privateKey }: { privateKey: JWKInterface }) { + this.privateKey = privateKey; + this.signer = new ArweaveSigner(this.privateKey); + } + + signDataItem({ + fileStreamFactory, + }: { + fileStreamFactory: () => Readable; + }): Promise { + // TODO: replace with our own signer implementation + const [stream1, stream2] = [fileStreamFactory(), fileStreamFactory()]; + return streamSigner(stream1, stream2, this.signer); + } + + // NOTE: this might be better in a parent class or elsewhere - easy enough to leave in here now and does require specific environment version of crypto + async generateSignedRequestHeaders() { + const nonce = randomBytes(16).toString('hex'); + const buffer = Buffer.from(nonce); + const signature = await Arweave.crypto.sign(this.privateKey, buffer); + + return { + 'x-public-key': this.privateKey.n, + 'x-nonce': nonce, + 'x-signature': toB64Url(Buffer.from(signature)), + }; + } +} diff --git a/src/types/turbo.ts b/src/types/turbo.ts index 8be5df77..5a294b44 100644 --- a/src/types/turbo.ts +++ b/src/types/turbo.ts @@ -14,6 +14,8 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ +import { Readable } from 'node:stream'; +import { ReadableStream } from 'node:stream/web'; import { RetryConfig } from 'retry-axios'; import winston from 'winston'; @@ -51,41 +53,113 @@ export type TurboCurrenciesResponse = { supportedCurrencies: Currency[]; limits: Record; }; +export type TurboUploadDataItemResponse = { + byteCount: number; + dataCaches: string[]; + fastFinalityIndexes: string[]; + id: TransactionId; +}; +export type TurboWallet = JWKInterface; // TODO: add other wallet types export type TurboSignedRequestHeaders = { 'x-public-key': string; 'x-nonce': string; 'x-signature': string; }; -export type TurboAuthSettings = { - privateKey?: JWKInterface; // TODO: make a class that implements various functions (sign, verify, etc.) and implement for various wallet types +type TurboAuthConfiguration = { + signer: TurboWalletSigner; // TODO: make a class that implements various functions (sign, verify, etc.) and implement for various wallet types }; type TurboServiceConfiguration = { - url: string; + url?: string; retryConfig?: RetryConfig; logger?: winston.Logger; -} & TurboAuthSettings; +}; -export type TurboUploadServiceConfiguration = TurboServiceConfiguration; -export type TurboPaymentServiceConfiguration = TurboServiceConfiguration; +export type TurboUnauthenticatedUploadServiceInterfaceConfiguration = + TurboServiceConfiguration; +export type TurboAuthenticatedUploadServiceConfiguration = + TurboUnauthenticatedUploadServiceInterfaceConfiguration & + TurboAuthConfiguration; -export type TurboConfiguration = { - paymentServiceConfig: TurboPaymentServiceConfiguration; - uploadServiceConfig: TurboUploadServiceConfiguration; -} & TurboAuthSettings; +export type TurboUnauthenticatedPaymentServiceInterfaceConfiguration = + TurboServiceConfiguration; +export type TurboAuthenticatedPaymentServiceInterfaceConfiguration = + TurboServiceConfiguration & TurboAuthConfiguration; -export type TurboClientConfiguration = { - paymentService: TurboPaymentService; - uploadService: TurboUploadService; +export type TurboPublicConfiguration = { + paymentServiceConfig?: TurboUnauthenticatedPaymentServiceInterfaceConfiguration; + uploadServiceConfig?: TurboUnauthenticatedUploadServiceInterfaceConfiguration; }; -export interface AuthenticatedTurboPaymentService { - getBalance: () => Promise; +export type TurboPrivateConfiguration = TurboPublicConfiguration & { + privateKey: TurboWallet; +}; + +export type TurboPublicClientConfiguration = { + paymentService: TurboUnauthenticatedPaymentServiceInterface; + uploadService: TurboUnauthenticatedUploadServiceInterface; +}; + +export type TurboPrivateClientConfiguration = { + paymentService: TurboAuthenticatedPaymentServiceInterface; + uploadService: TurboAuthenticatedUploadServiceInterface; +}; + +export type FileStreamFactory = + | (() => Readable) + | (() => ReadableStream) + | (() => Buffer); +export type SignedDataStreamFactory = FileStreamFactory; +export type TurboFileFactory = { + fileStreamFactory: FileStreamFactory; // TODO: allow multiple files + // bundle?: boolean; // TODO: add bundling into BDIs +}; + +export type TurboSignedDataItemFactory = { + dataItemStreamFactory: SignedDataStreamFactory; // TODO: allow multiple data items +}; + +export type TurboAbortSignal = { + signal?: AbortSignal; +}; + +export interface TurboHTTPServiceInterface { + get({ + endpoint, + signal, + headers, + allowedStatuses, + }: { + endpoint: string; + signal?: AbortSignal; + headers?: Partial & Record; + allowedStatuses?: number[]; + }): Promise; + post({ + endpoint, + signal, + headers, + allowedStatuses, + data, + }: { + endpoint: string; + signal: AbortSignal; + headers?: Partial & Record; + allowedStatuses?: number[]; + data: Readable | ReadableStream | Buffer; + }): Promise; +} + +export interface TurboWalletSigner { + signDataItem({ + fileStreamFactory, + }: TurboFileFactory): Promise | Promise; + generateSignedRequestHeaders(): Promise; } -export interface UnauthenticatedTurboPaymentService { +export interface TurboUnauthenticatedPaymentServiceInterface { getSupportedCurrencies(): Promise; getSupportedCountries(): Promise; getFiatToAR({ @@ -104,11 +178,29 @@ export interface UnauthenticatedTurboPaymentService { getUploadCosts({ bytes }: { bytes: number[] }): Promise; } -export interface TurboPaymentService - extends AuthenticatedTurboPaymentService, - UnauthenticatedTurboPaymentService {} +export interface TurboAuthenticatedPaymentServiceInterface + extends TurboUnauthenticatedPaymentServiceInterface { + getBalance: () => Promise; +} + +export interface TurboUnauthenticatedUploadServiceInterface { + uploadSignedDataItem({ + dataItemStreamFactory, + signal, + }: TurboSignedDataItemFactory & + TurboAbortSignal): Promise; +} -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface TurboUploadService {} +export interface TurboAuthenticatedUploadServiceInterface + extends TurboUnauthenticatedUploadServiceInterface { + uploadFile({ + fileStreamFactory, + }: TurboFileFactory & TurboAbortSignal): Promise; +} -export interface Turbo extends TurboPaymentService, TurboUploadService {} +export interface TurboPublicClient + extends TurboUnauthenticatedPaymentServiceInterface, + TurboUnauthenticatedUploadServiceInterface {} +export interface TurboPrivateClient + extends TurboAuthenticatedPaymentServiceInterface, + TurboAuthenticatedUploadServiceInterface {} diff --git a/src/utils/base64.ts b/src/utils/base64.ts index d0b10618..e0bdd388 100644 --- a/src/utils/base64.ts +++ b/src/utils/base64.ts @@ -50,9 +50,3 @@ export function toB64Url(buffer: Buffer): Base64String { export function sha256B64Url(input: Buffer): Base64String { return toB64Url(createHash('sha256').update(input).digest()); } - -// check if it is a valid arweave base64url for a wallet public address, transaction id or smartweave contract -export function isValidArweaveBase64URL(base64URL: string): boolean { - const base64URLRegex = /^[a-zA-Z0-9_-]{43}$/; - return base64URLRegex.test(base64URL); -} diff --git a/src/utils/browser.ts b/src/utils/readableStream.ts similarity index 63% rename from src/utils/browser.ts rename to src/utils/readableStream.ts index dca3d4e0..beecbb24 100644 --- a/src/utils/browser.ts +++ b/src/utils/readableStream.ts @@ -14,12 +14,23 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -export function isBrowser() { - if (typeof window !== 'undefined' && typeof window.document !== 'undefined') { - return true; - } else if (typeof global !== 'undefined' && global.process.versions.node) { - return false; - } else { - throw new Error('Unknown environment.'); +import { ReadableStream } from 'node:stream/web'; + +export async function readableStreamToBuffer({ + stream, +}: { + stream: ReadableStream; +}): Promise { + const reader = stream.getReader(); + const chunks: any[] = []; + + let done = false; + while (!done) { + const { done: streamDone, value } = await reader.read(); + done = streamDone; + if (!done) { + chunks.push(value); + } } + return Buffer.concat(chunks); } diff --git a/src/utils/signData.test.ts b/src/utils/signData.test.ts deleted file mode 100644 index 4044bf64..00000000 --- a/src/utils/signData.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Arweave from 'arweave'; -import { expect } from 'chai'; - -import { toB64Url } from './base64.js'; -import { signData } from './signData.js'; - -describe('signData', () => { - it('snapshot test for signing with crypto.constants.RSA_PKCS1_PSS_PADDING', async () => { - const signature = await signData(await Arweave.crypto.generateJWK(), '123'); - - expect(toB64Url(Buffer.from(signature))).to.have.length(683); - }); -}); diff --git a/src/utils/signData.ts b/src/utils/signData.ts deleted file mode 100644 index 8e6d3ef2..00000000 --- a/src/utils/signData.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (C) 2022-2023 Permanent Data Solutions, Inc. All Rights Reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -import { stringToBuffer } from 'arweave/node/lib/utils.js'; -import { Buffer } from 'buffer'; -import { randomBytes } from 'crypto'; - -import { JWKInterface } from '../types/index.js'; -import { TurboSignedRequestHeaders } from '../types/turbo.js'; -import { toB64Url } from './base64.js'; -import { isBrowser } from './browser.js'; - -// TODO: move these to a wallet signer class -export async function signData( - jwk: JWKInterface, - dataToSign: string, -): Promise { - const buffer = stringToBuffer(dataToSign); - if (isBrowser()) { - const { default: arweave } = await import('arweave/web/index.js'); - return arweave.default.crypto.sign(jwk, buffer); - } else { - const { default: arweave } = await import('arweave/node/index.js'); - return arweave.crypto.sign(jwk, buffer); - } -} - -export async function signedRequestHeadersFromJwk( - jwk: JWKInterface, - nonce: string = randomBytes(16).toString('hex'), - data = '', -): Promise { - const signature = await signData(jwk, data + nonce); - - return { - 'x-public-key': jwk.n, - 'x-nonce': nonce, - 'x-signature': toB64Url(Buffer.from(signature)), - }; -} diff --git a/src/web/factory.ts b/src/web/factory.ts new file mode 100644 index 00000000..672e5c48 --- /dev/null +++ b/src/web/factory.ts @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2022-2023 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { TurboBaseFactory } from '../common/factory.js'; +import { + TurboAuthenticatedClient, + TurboAuthenticatedPaymentService, + TurboAuthenticatedUploadService, +} from '../common/index.js'; +import { TurboPrivateConfiguration } from '../types/index.js'; +import { TurboWebArweaveSigner } from './signer.js'; + +export class TurboFactory extends TurboBaseFactory { + static authenticated({ + privateKey, + paymentServiceConfig = {}, + uploadServiceConfig = {}, + }: TurboPrivateConfiguration) { + const signer = new TurboWebArweaveSigner({ privateKey }); + const paymentService = new TurboAuthenticatedPaymentService({ + ...paymentServiceConfig, + signer, + }); + const uploadService = new TurboAuthenticatedUploadService({ + ...uploadServiceConfig, + signer, + }); + return new TurboAuthenticatedClient({ + uploadService, + paymentService, + }); + } +} diff --git a/src/node/upload.ts b/src/web/index.ts similarity index 74% rename from src/node/upload.ts rename to src/web/index.ts index 4c331116..31d71615 100644 --- a/src/node/upload.ts +++ b/src/web/index.ts @@ -14,13 +14,6 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { - TurboUploadService, - TurboUploadServiceConfiguration, -} from '../types/index.js'; - -/* eslint-disable */ -export class TurboNodeUploadService implements TurboUploadService { - // @ts-ignore - constructor(config: TurboUploadServiceConfiguration) {} -} +export * from './factory.js'; +export * from './signer.js'; +export * from '../common/index.js'; diff --git a/src/web/signer.ts b/src/web/signer.ts new file mode 100644 index 00000000..89c245da --- /dev/null +++ b/src/web/signer.ts @@ -0,0 +1,66 @@ +/** + * Copyright (C) 2022-2023 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { ArweaveSigner, createData } from 'arbundles/web'; +import Arweave from 'arweave/web/index.js'; +import { randomBytes } from 'node:crypto'; +import { ReadableStream } from 'node:stream/web'; + +import { JWKInterface } from '../types/arweave.js'; +import { TurboWalletSigner } from '../types/turbo.js'; +import { toB64Url } from '../utils/base64.js'; +import { readableStreamToBuffer } from '../utils/readableStream.js'; + +export class TurboWebArweaveSigner implements TurboWalletSigner { + protected privateKey: JWKInterface; + protected signer: ArweaveSigner; // TODO: replace with internal signer class + + constructor({ privateKey }: { privateKey: JWKInterface }) { + this.privateKey = privateKey; + this.signer = new ArweaveSigner(this.privateKey); + } + + async signDataItem({ + fileStreamFactory, + }: { + fileStreamFactory: () => ReadableStream; + }): Promise { + // TODO: converts the readable stream to a buffer bc incrementally signing ReadableStreams is not trivial + const buffer = await readableStreamToBuffer({ + stream: fileStreamFactory(), + // TODO: add payload size to get performance improvements + }); + const signedDataItem = createData(buffer, this.signer); + await signedDataItem.sign(this.signer); + return signedDataItem.getRaw(); + } + + // NOTE: this might be better in a parent class or elsewhere - easy enough to leave in here now and does require specific environment version of crypto + async generateSignedRequestHeaders() { + const nonce = randomBytes(16).toString('hex'); + const buffer = Buffer.from(nonce); + const signature = await Arweave.default.crypto.sign( + this.privateKey, + buffer, + ); + + return { + 'x-public-key': this.privateKey.n, + 'x-nonce': nonce, + 'x-signature': toB64Url(Buffer.from(signature)), + }; + } +} diff --git a/tests/files/0_kb.txt b/tests/files/0_kb.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/testSetup.ts b/tests/testSetup.ts deleted file mode 100644 index 34cd79c5..00000000 --- a/tests/testSetup.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { restore } from 'sinon'; - -// Restores the default sandbox after every test -exports.mochaHooks = { - afterEach() { - restore(); - }, -}; diff --git a/tests/turbo.node.test.ts b/tests/turbo.node.test.ts new file mode 100644 index 00000000..88cdb5eb --- /dev/null +++ b/tests/turbo.node.test.ts @@ -0,0 +1,182 @@ +import { ArweaveSigner, createData } from 'arbundles'; +import Arweave from 'arweave'; +import { CanceledError } from 'axios'; +import { expect } from 'chai'; +import fs from 'fs'; +import { Readable } from 'node:stream'; + +import { + TurboAuthenticatedClient, + TurboUnauthenticatedClient, +} from '../src/common/turbo.js'; +import { TurboFactory } from '../src/node/factory.js'; +import { JWKInterface } from '../src/types/index.js'; +import { jwkToPublicArweaveAddress } from '../src/utils/base64.js'; + +describe('Node environment', () => { + describe('TurboFactory', () => { + it('should return a TurboUnauthenticatedClient when running in Node environment and not provided a privateKey', () => { + const turbo = TurboFactory.unauthenticated({}); + expect(turbo).to.be.instanceOf(TurboUnauthenticatedClient); + }); + it('should return a TurboAuthenticatedClient when running in Node environment and provided a privateKey', async () => { + const jwk = await Arweave.crypto.generateJWK(); + const turbo = TurboFactory.authenticated({ privateKey: jwk }); + expect(turbo).to.be.instanceOf(TurboAuthenticatedClient); + }); + }); + + describe('TurboUnauthenticatedNodeClient', () => { + let turbo: TurboUnauthenticatedClient; + + before(() => { + turbo = TurboFactory.unauthenticated({}); + }); + + it('getFiatRates()', async () => { + const { winc, fiat, adjustments } = await turbo.getFiatRates(); + expect(winc).to.not.be.undefined.and.to.be.a('number'); + expect(fiat).to.have.property('usd').that.is.a('number'); + expect(adjustments).to.not.be.undefined; + }); + + it('getFiatToAR()', async () => { + const { currency, rate } = await turbo.getFiatToAR({ currency: 'usd' }); + expect(currency).to.equal('usd'); + expect(rate).to.be.a('number'); + }); + + it('getSupportedCountries()', async () => { + const countries = await turbo.getSupportedCountries(); + expect(countries).to.be.an('array'); + expect(countries.length).to.be.greaterThan(0); + expect(countries).to.include('United States'); + }); + + it('getSupportedCurrencies()', async () => { + const { supportedCurrencies, limits } = + await turbo.getSupportedCurrencies(); + expect(supportedCurrencies).to.not.be.undefined; + expect(supportedCurrencies).to.be.an('array'); + expect(supportedCurrencies.length).to.be.greaterThan(0); + expect(supportedCurrencies).to.include('usd'); + expect(limits).to.not.be.undefined; + expect(limits).to.be.an('object'); + expect(limits).to.have.property('usd'); + expect(limits.usd).to.have.property('minimumPaymentAmount'); + expect(limits.usd).to.have.property('maximumPaymentAmount'); + expect(limits.usd).to.have.property('suggestedPaymentAmounts'); + expect(limits.usd).to.have.property('zeroDecimalCurrency'); + }); + + it('getUploadCosts()', async () => { + const [{ winc, adjustments }] = await turbo.getUploadCosts({ + bytes: [1024], + }); + expect(winc).to.not.be.undefined; + expect(+winc).to.be.greaterThan(0); + expect(adjustments).to.not.be.undefined; + expect(adjustments).to.be.an('array'); + }); + + it('getPriceForFiat()', async () => { + const { winc } = await turbo.getWincForFiat({ + amount: 1000, // 10 USD + currency: 'usd', + }); + expect(winc).to.not.be.undefined; + expect(+winc).to.be.greaterThan(0); + }); + + describe('uploadSignedDataItem()', () => { + it('should properly upload a signed Buffer to turbo', async () => { + const jwk = await Arweave.crypto.generateJWK(); + const signer = new ArweaveSigner(jwk); + const signedDataItem = createData('signed data item', signer, {}); + await signedDataItem.sign(signer); + + const response = await turbo.uploadSignedDataItem({ + dataItemStreamFactory: () => signedDataItem.getRaw(), + }); + expect(response).to.not.be.undefined; + expect(response).to.have.property('fastFinalityIndexes'); + expect(response).to.have.property('dataCaches'); + expect(response).to.have.property('owner'); + expect(response['owner']).to.equal(jwkToPublicArweaveAddress(jwk)); + }); + + it('should properly upload signed Readable to turbo', async () => { + const jwk = await Arweave.crypto.generateJWK(); + const signer = new ArweaveSigner(jwk); + const signedDataItem = createData('signed data item', signer, {}); + await signedDataItem.sign(signer); + + const response = await turbo.uploadSignedDataItem({ + dataItemStreamFactory: () => Readable.from(signedDataItem.getRaw()), + }); + expect(response).to.not.be.undefined; + expect(response).to.have.property('fastFinalityIndexes'); + expect(response).to.have.property('dataCaches'); + expect(response).to.have.property('owner'); + expect(response['owner']).to.equal(jwkToPublicArweaveAddress(jwk)); + }); + + it('should abort an upload when AbortController.signal is triggered', async () => { + const jwk = await Arweave.crypto.generateJWK(); + const signer = new ArweaveSigner(jwk); + const signedDataItem = createData('signed data item', signer, {}); + await signedDataItem.sign(signer); + const error = await turbo + .uploadSignedDataItem({ + dataItemStreamFactory: () => signedDataItem.getRaw(), + signal: AbortSignal.timeout(0), // abort the request right away + }) + .catch((err) => err); + expect(error).to.be.instanceOf(CanceledError); + }); + }); + }); + + describe('TurboAuthenticatedNodeClient', () => { + let jwk: JWKInterface; + let turbo: TurboAuthenticatedClient; + + before(async () => { + jwk = await Arweave.crypto.generateJWK(); + turbo = TurboFactory.authenticated({ + privateKey: jwk, + }); + }); + + it('getBalance()', async () => { + const balance = await turbo.getBalance(); + expect(+balance.winc).to.equal(0); + }); + + describe('uploadFile()', () => { + it('should properly upload a Readable to turbo', async () => { + const filePath = new URL('files/0_kb.txt', import.meta.url).pathname; + const response = await turbo.uploadFile({ + fileStreamFactory: () => fs.createReadStream(filePath), + }); + expect(response).to.not.be.undefined; + expect(response).to.not.be.undefined; + expect(response).to.have.property('fastFinalityIndexes'); + expect(response).to.have.property('dataCaches'); + expect(response).to.have.property('owner'); + expect(response['owner']).to.equal(jwkToPublicArweaveAddress(jwk)); + }); + + it('should abort the upload when AbortController.signal is triggered', async () => { + const filePath = new URL('files/0_kb.txt', import.meta.url).pathname; + const error = await turbo + .uploadFile({ + fileStreamFactory: () => fs.createReadStream(filePath), + signal: AbortSignal.timeout(0), // abort the request right away + }) + .catch((err) => err); + expect(error).to.be.instanceOf(CanceledError); + }); + }); + }); +}); diff --git a/tests/turbo.test.ts b/tests/turbo.test.ts deleted file mode 100644 index aea9dc24..00000000 --- a/tests/turbo.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import Arweave from 'arweave'; -import { expect } from 'chai'; - -import { TurboClient } from '../src/common/turbo.js'; -import { TurboFactory } from '../src/index.js'; -import { JWKInterface } from '../src/types/index.js'; - -// TODO: move these to local services -const defaultConfig = { - paymentServiceConfig: { - url: 'https://payment.ardrive.dev', - }, - uploadServiceConfig: { - url: 'https://upload.ardrive.dev', - }, -}; - -describe('TurboFactory', () => { - it('should return a TurboClient when running in node', () => { - const turbo = TurboFactory.init(defaultConfig); - expect(turbo).to.be.instanceOf(TurboClient); - }); - it('should be a TurboClient when running in the browser', () => { - (global as any).window = { document: {} }; - const turbo = TurboFactory.init(defaultConfig); - expect(turbo).to.be.instanceOf(TurboClient); - delete (global as any).window; - }); -}); - -describe('TurboClient', () => { - let turbo: TurboClient; - - before(async () => { - turbo = TurboFactory.init(defaultConfig); - }); - - describe('unauthenticated requests', () => { - it('getFiatRates()', async () => { - const { winc, fiat, adjustments } = await turbo.getFiatRates(); - expect(winc).to.not.be.undefined.and.to.be.a('number'); - expect(fiat).to.have.property('usd').that.is.a('number'); - expect(adjustments).to.not.be.undefined; - }); - - it('getFiatToAR()', async () => { - const { currency, rate } = await turbo.getFiatToAR({ currency: 'usd' }); - expect(currency).to.equal('usd'); - expect(rate).to.be.a('number'); - }); - - it('getSupportedCountries()', async () => { - const countries = await turbo.getSupportedCountries(); - expect(countries).to.be.an('array'); - expect(countries.length).to.be.greaterThan(0); - expect(countries).to.include('United States'); - }); - - it('getSupportedCurrencies()', async () => { - const { supportedCurrencies, limits } = - await turbo.getSupportedCurrencies(); - expect(supportedCurrencies).to.not.be.undefined; - expect(supportedCurrencies).to.be.an('array'); - expect(supportedCurrencies.length).to.be.greaterThan(0); - expect(supportedCurrencies).to.include('usd'); - expect(limits).to.not.be.undefined; - expect(limits).to.be.an('object'); - expect(limits).to.have.property('usd'); - expect(limits.usd).to.have.property('minimumPaymentAmount'); - expect(limits.usd).to.have.property('maximumPaymentAmount'); - expect(limits.usd).to.have.property('suggestedPaymentAmounts'); - expect(limits.usd).to.have.property('zeroDecimalCurrency'); - }); - - it('getUploadCosts()', async () => { - const [{ winc, adjustments }] = await turbo.getUploadCosts({ - bytes: [1024], - }); - expect(winc).to.not.be.undefined; - expect(+winc).to.be.greaterThan(0); - expect(adjustments).to.not.be.undefined; - expect(adjustments).to.be.an('array'); - }); - - it('getPriceForFiat()', async () => { - const { winc } = await turbo.getWincForFiat({ - amount: 1000, // 10 USD - currency: 'usd', - }); - expect(winc).to.not.be.undefined; - expect(+winc).to.be.greaterThan(0); - }); - }); - - describe('authenticated requests', () => { - let privateKey: JWKInterface; - let turbo: TurboClient; - - before(async () => { - privateKey = await Arweave.crypto.generateJWK(); - turbo = TurboFactory.init({ ...defaultConfig, privateKey }); - }); - - it('getBalance()', async () => { - const balance = await turbo.getBalance(); - expect(+balance.winc).to.equal(0); - }); - }); -}); diff --git a/tests/turbo.web.test.ts b/tests/turbo.web.test.ts new file mode 100644 index 00000000..affe6f2c --- /dev/null +++ b/tests/turbo.web.test.ts @@ -0,0 +1,186 @@ +import { ArweaveSigner, createData } from 'arbundles'; +import Arweave from 'arweave/node/index.js'; +import { CanceledError } from 'axios'; +import { expect } from 'chai'; +import { ReadableStream } from 'node:stream/web'; + +import { + TurboAuthenticatedClient, + TurboUnauthenticatedClient, +} from '../src/common/turbo.js'; +import { JWKInterface } from '../src/types/index.js'; +import { jwkToPublicArweaveAddress } from '../src/utils/base64.js'; +import { TurboFactory } from '../src/web/index.js'; + +describe('Browser environment', () => { + before(() => { + (global as any).window = { document: {} }; + }); + + after(() => { + delete (global as any).window; + }); + + describe('TurboFactory', () => { + it('should be a TurboUnauthenticatedClient running in the browser and not provided a privateKey', () => { + const turbo = TurboFactory.unauthenticated({}); + expect(turbo).to.be.instanceOf(TurboUnauthenticatedClient); + }); + + it('should be a TurboAuthenticatedClient running in the browser and provided a privateKey', async () => { + const jwk = await Arweave.crypto.generateJWK(); + const turbo = TurboFactory.authenticated({ privateKey: jwk }); + expect(turbo).to.be.instanceOf(TurboUnauthenticatedClient); + }); + }); + + describe('TurboUnauthenticatedWebClient', () => { + let turbo: TurboUnauthenticatedClient; + + before(() => { + turbo = TurboFactory.unauthenticated({}); + }); + + describe('unauthenticated requests', () => { + it('getFiatRates()', async () => { + const { winc, fiat, adjustments } = await turbo.getFiatRates(); + expect(winc).to.not.be.undefined.and.to.be.a('number'); + expect(fiat).to.have.property('usd').that.is.a('number'); + expect(adjustments).to.not.be.undefined; + }); + + it('getFiatToAR()', async () => { + const { currency, rate } = await turbo.getFiatToAR({ currency: 'usd' }); + expect(currency).to.equal('usd'); + expect(rate).to.be.a('number'); + }); + + it('getSupportedCountries()', async () => { + const countries = await turbo.getSupportedCountries(); + expect(countries).to.be.an('array'); + expect(countries.length).to.be.greaterThan(0); + expect(countries).to.include('United States'); + }); + + it('getSupportedCurrencies()', async () => { + const { supportedCurrencies, limits } = + await turbo.getSupportedCurrencies(); + expect(supportedCurrencies).to.not.be.undefined; + expect(supportedCurrencies).to.be.an('array'); + expect(supportedCurrencies.length).to.be.greaterThan(0); + expect(supportedCurrencies).to.include('usd'); + expect(limits).to.not.be.undefined; + expect(limits).to.be.an('object'); + expect(limits).to.have.property('usd'); + expect(limits.usd).to.have.property('minimumPaymentAmount'); + expect(limits.usd).to.have.property('maximumPaymentAmount'); + expect(limits.usd).to.have.property('suggestedPaymentAmounts'); + expect(limits.usd).to.have.property('zeroDecimalCurrency'); + }); + + it('getUploadCosts()', async () => { + const [{ winc, adjustments }] = await turbo.getUploadCosts({ + bytes: [1024], + }); + expect(winc).to.not.be.undefined; + expect(+winc).to.be.greaterThan(0); + expect(adjustments).to.not.be.undefined; + expect(adjustments).to.be.an('array'); + }); + + it('getPriceForFiat()', async () => { + const { winc } = await turbo.getWincForFiat({ + amount: 1000, // 10 USD + currency: 'usd', + }); + expect(winc).to.not.be.undefined; + expect(+winc).to.be.greaterThan(0); + }); + + describe('uploadSignedDataItem()', () => { + it('supports sending a signed Buffer to turbo', async () => { + const jwk = await Arweave.crypto.generateJWK(); + const signer = new ArweaveSigner(jwk); + const signedDataItem = createData('signed data item', signer); + await signedDataItem.sign(signer); + + const response = await turbo.uploadSignedDataItem({ + dataItemStreamFactory: () => signedDataItem.getRaw(), + }); + expect(response).to.not.be.undefined; + expect(response).to.have.property('fastFinalityIndexes'); + expect(response).to.have.property('dataCaches'); + expect(response).to.have.property('owner'); + expect(response['owner']).to.equal(jwkToPublicArweaveAddress(jwk)); + }); + + it('should abort the upload when AbortController.signal is triggered', async () => { + const jwk = await Arweave.crypto.generateJWK(); + const signer = new ArweaveSigner(jwk); + const signedDataItem = createData('signed data item', signer); + await signedDataItem.sign(signer); + const error = await turbo + .uploadSignedDataItem({ + dataItemStreamFactory: () => signedDataItem.getRaw(), + signal: AbortSignal.timeout(0), // abort the request right away + }) + .catch((err) => err); + expect(error).be.instanceOf(CanceledError); + }); + }); + }); + }); + describe('TurboAuthenticatedWebClient', () => { + let turbo: TurboAuthenticatedClient; + let jwk: JWKInterface; + before(async () => { + jwk = await Arweave.crypto.generateJWK(); + turbo = TurboFactory.authenticated({ privateKey: jwk }); + }); + + it('getBalance()', async () => { + const balance = await turbo.getBalance(); + expect(+balance.winc).to.equal(0); + }); + + describe('uploadFile()', () => { + it('should properly upload a ReadableStream to turbo', async () => { + const encoder = new TextEncoder(); + const uint8Array = encoder.encode('test data'); + const readableStream = new ReadableStream({ + start(controller) { + controller.enqueue(uint8Array); + controller.close(); + }, + }); + const response = await turbo.uploadFile({ + fileStreamFactory: () => readableStream, + }); + expect(response).to.not.be.undefined; + expect(response).to.not.be.undefined; + expect(response).to.have.property('fastFinalityIndexes'); + expect(response).to.have.property('dataCaches'); + expect(response).to.have.property('owner'); + expect(response['owner']).to.equal(jwkToPublicArweaveAddress(jwk)); + }); + + it('should abort the upload when AbortController.signal is triggered', async () => { + const encoder = new TextEncoder(); + const uint8Array = encoder.encode('test data'); + const readableStream = new ReadableStream({ + start(controller) { + controller.enqueue(uint8Array); + controller.close(); + }, + }); + const error = await turbo + .uploadFile({ + fileStreamFactory: () => readableStream, + signal: AbortSignal.timeout(0), // abort the request right away + }) + .catch((err) => err); + expect(error).to.be.instanceOf(CanceledError); + }); + }); + }); +}); diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 00000000..b667bab2 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/node", "src/common", "src/utils"] +} diff --git a/tsconfig.web.json b/tsconfig.web.json new file mode 100644 index 00000000..c58d0b01 --- /dev/null +++ b/tsconfig.web.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/web", "src/common", "src/utils"] +} diff --git a/yarn.lock b/yarn.lock index 500c1b53..f98152ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -81,9 +81,9 @@ js-tokens "^4.0.0" "@babel/parser@^7.17.3", "@babel/parser@^7.20.5", "@babel/parser@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" - integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.11.tgz#becf8ee33aad2a35ed5607f521fe6e72a615f905" + integrity sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g== "@babel/template@^7.22.5": version "7.22.5" @@ -119,9 +119,9 @@ to-fast-properties "^2.0.0" "@babel/types@^7.17.0", "@babel/types@^7.22.10", "@babel/types@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" - integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" + integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" @@ -440,9 +440,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.0", "@eslint-community/regexpp@^4.6.1": - version "4.6.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" - integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" + integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== "@eslint/eslintrc@^2.1.2": version "2.1.2" @@ -459,10 +459,300 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^8.47.0": - version "8.47.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.47.0.tgz#5478fdf443ff8158f9de171c704ae45308696c7d" - integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og== +"@eslint/js@8.48.0": + version "8.48.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" + integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== + +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/wallet@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" "@humanwhocodes/config-array@^0.11.10": version "0.11.10" @@ -545,6 +835,11 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@noble/ed25519@^1.6.1": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" + integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -853,6 +1148,18 @@ "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" +"@randlabs/communication-bridge@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@randlabs/communication-bridge/-/communication-bridge-1.0.1.tgz#d1ecfc29157afcbb0ca2d73122d67905eecb5bf3" + integrity sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg== + +"@randlabs/myalgo-connect@^1.1.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@randlabs/myalgo-connect/-/myalgo-connect-1.4.2.tgz#ce3ad97b3889ea21da75852187511d3f6be0fa05" + integrity sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA== + dependencies: + "@randlabs/communication-bridge" "1.0.1" + "@semantic-release/changelog@^6.0.3": version "6.0.3" resolved "https://registry.yarnpkg.com/@semantic-release/changelog/-/changelog-6.0.3.tgz#6195630ecbeccad174461de727d5f975abc23eeb" @@ -864,9 +1171,9 @@ lodash "^4.17.4" "@semantic-release/commit-analyzer@^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-10.0.1.tgz#be6fcc1703459294c394ede41b37fd9a21d39807" - integrity sha512-9ejHzTAijYs9z246sY/dKBatmOPcd0GQ7lH4MgLCkv1q4GCiDZRkjHJkaQZXZVaK7mJybS+sH3Ng6G8i3pYMGQ== + version "10.0.3" + resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-10.0.3.tgz#eb967518cd13120b3ca9cc45f946b57d356178c0" + integrity sha512-pe45eTjaJBsZbJrT6AvcTzYYS9OJF3MGABTPFSpwmnfSXVmyfFuloO92pj6EVTbx6JGEUgpoipnITbWn+zyvaw== dependencies: conventional-changelog-angular "^6.0.0" conventional-commits-filter "^3.0.0" @@ -923,13 +1230,13 @@ url-join "^5.0.0" "@semantic-release/npm@^10.0.2": - version "10.0.4" - resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-10.0.4.tgz#b55df5cb86d4b10b4e8eb56d5ce0bd3537c641e1" - integrity sha512-6R3timIQ7VoL2QWRkc9DG8v74RQtRp7UOe/2KbNaqwJ815qOibAv65bH3RtTEhs4axEaHoZf7HDgFs5opaZ9Jw== + version "10.0.5" + resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-10.0.5.tgz#d8c20fbab03ce9eff4dca233253cf880f919d3ae" + integrity sha512-cJnQ2M5pxJRwZEkb0A/+U3TG4UNmjrrLwV2PxJKljn5OPT0yJB8GzGgWbbKACayvxrT06YdTa4Amtq/piJcOIA== dependencies: "@semantic-release/error" "^4.0.0" aggregate-error "^4.0.1" - execa "^7.0.0" + execa "^8.0.0" fs-extra "^11.0.0" lodash-es "^4.17.21" nerf-dart "^1.0.0" @@ -942,14 +1249,14 @@ tempy "^3.0.0" "@semantic-release/release-notes-generator@^11.0.0": - version "11.0.4" - resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-11.0.4.tgz#8e4b81402bf544f912952909c0525e6fe8227232" - integrity sha512-j0Znnwq9IdWTCGzqSlkLv4MpALTsVDZxcVESzJCNN8pK2BYQlYaKsdZ1Ea/+7RlppI3vjhEi33ZKmjSGY1FLKw== + version "11.0.6" + resolved "https://registry.yarnpkg.com/@semantic-release/release-notes-generator/-/release-notes-generator-11.0.6.tgz#b024dc3979632f28df2e1e1f9cf50a486f10ab6a" + integrity sha512-Puuv/6AJosmep6pIu5tsLDYrNAVQr7a4oxGiKnOhW20TTYSWEGGCNAOXJI2NKSGFGXwXbxzy2tQWVC/TovxMIw== dependencies: conventional-changelog-angular "^6.0.0" conventional-changelog-writer "^6.0.0" conventional-commits-filter "^3.0.0" - conventional-commits-parser "^4.0.0" + conventional-commits-parser "^5.0.0" debug "^4.0.0" get-stream "^7.0.0" import-from "^4.0.0" @@ -965,9 +1272,9 @@ "@sigstore/protobuf-specs" "^0.2.0" "@sigstore/protobuf-specs@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.0.tgz#5801b2a4d10afe1577be6133be6b132b5677c18c" - integrity sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg== + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== "@sigstore/sign@^1.0.0": version "1.0.0" @@ -1107,9 +1414,9 @@ integrity sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g== "@types/node@^20.4.8": - version "20.5.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.0.tgz#7fc8636d5f1aaa3b21e6245e97d56b7f56702313" - integrity sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q== + version "20.5.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" + integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== "@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.1": version "2.4.1" @@ -1117,9 +1424,9 @@ integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + version "7.5.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" + integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== "@types/sinon@^10.0.15": version "10.0.16" @@ -1165,14 +1472,14 @@ debug "^4.3.4" "@typescript-eslint/parser@^6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.4.0.tgz#47e7c6e22ff1248e8675d95f488890484de67600" - integrity sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg== - dependencies: - "@typescript-eslint/scope-manager" "6.4.0" - "@typescript-eslint/types" "6.4.0" - "@typescript-eslint/typescript-estree" "6.4.0" - "@typescript-eslint/visitor-keys" "6.4.0" + version "6.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.4.1.tgz#85ad550bf4ac4aa227504f1becb828f8e46c44e3" + integrity sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg== + dependencies: + "@typescript-eslint/scope-manager" "6.4.1" + "@typescript-eslint/types" "6.4.1" + "@typescript-eslint/typescript-estree" "6.4.1" + "@typescript-eslint/visitor-keys" "6.4.1" debug "^4.3.4" "@typescript-eslint/scope-manager@5.62.0": @@ -1183,13 +1490,13 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.4.0.tgz#3048e4262ba3eafa4e2e69b08912d9037ec646ae" - integrity sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig== +"@typescript-eslint/scope-manager@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz#4b073a30be2dbe603e44e9ae0cff7e1d3ed19278" + integrity sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A== dependencies: - "@typescript-eslint/types" "6.4.0" - "@typescript-eslint/visitor-keys" "6.4.0" + "@typescript-eslint/types" "6.4.1" + "@typescript-eslint/visitor-keys" "6.4.1" "@typescript-eslint/type-utils@5.62.0": version "5.62.0" @@ -1206,10 +1513,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.4.0.tgz#5b109a59a805f0d8d375895e42d9e5f0037f66ee" - integrity sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg== +"@typescript-eslint/types@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.4.1.tgz#b2c61159f46dda210fed9f117f5d027f65bb5c3b" + integrity sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -1224,13 +1531,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.0.tgz#3c58d20632db93fec3d6ab902acbedf593d37276" - integrity sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA== +"@typescript-eslint/typescript-estree@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz#91ff88101c710adb0f70a317f2f65efa9441da45" + integrity sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg== dependencies: - "@typescript-eslint/types" "6.4.0" - "@typescript-eslint/visitor-keys" "6.4.0" + "@typescript-eslint/types" "6.4.1" + "@typescript-eslint/visitor-keys" "6.4.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -1259,12 +1566,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.0.tgz#96a426cdb1add28274abd7a34aefe27f8b7d51ef" - integrity sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA== +"@typescript-eslint/visitor-keys@6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz#e3ccf7b8d42e625946ac5094ed92a405fb4115e0" + integrity sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ== dependencies: - "@typescript-eslint/types" "6.4.0" + "@typescript-eslint/types" "6.4.1" eslint-visitor-keys "^3.4.1" JSONStream@^1.3.5: @@ -1307,6 +1614,11 @@ acorn@^8.4.1, acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1364,6 +1676,27 @@ ajv@^8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" +algo-msgpack-with-bigint@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6" + integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ== + +algosdk@^1.13.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/algosdk/-/algosdk-1.24.1.tgz#afc4102457ae0c38a32de6b84f4d713aedfc9e89" + integrity sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww== + dependencies: + algo-msgpack-with-bigint "^2.1.1" + buffer "^6.0.2" + cross-fetch "^3.1.5" + hi-base32 "^0.5.1" + js-sha256 "^0.9.0" + js-sha3 "^0.8.0" + js-sha512 "^0.8.0" + json-bigint "^1.0.0" + tweetnacl "^1.0.3" + vlq "^2.0.4" + ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -1423,6 +1756,30 @@ anymatch@~3.1.2: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +arbundles@^0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/arbundles/-/arbundles-0.9.9.tgz#3b4d6c215a9d022e0805e294287280b2f64fe5c4" + integrity sha512-2//u+DW2fDGC+5y2gaM4M4Q+Lx6V71YgVvMF869m41eHYPZZC4OU+Oq2iJpcONv7uao9kvVHE8f1VknmW5GpAQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wallet" "^5.7.0" + "@noble/ed25519" "^1.6.1" + arweave "=1.11.8" + base64url "^3.0.1" + bs58 "^4.0.1" + keccak "^3.0.2" + secp256k1 "^4.0.2" + optionalDependencies: + "@randlabs/myalgo-connect" "^1.1.2" + algosdk "^1.13.1" + arweave-stream-tx "^1.1.0" + multistream "^4.1.0" + tmp-promise "^3.0.2" + archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -1543,6 +1900,25 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +arweave-stream-tx@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz#2d5c66554301baacd02586a152fbb198b422112f" + integrity sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ== + dependencies: + exponential-backoff "^3.1.0" + +arweave@=1.11.8: + version "1.11.8" + resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.11.8.tgz#09376e0c6cec40a661cbb27a306cb11c0a663cd8" + integrity sha512-58ODeNPIC4OjaOCl2bXjKbOFGsiVZFs+DkQg3BvQGvFWNqw1zTJ4Jp01xGUz+GbdOaDyJcCC0g3l0HwdJfFPyw== + dependencies: + arconnect "^0.4.2" + asn1.js "^5.4.1" + axios "^0.27.2" + base64-js "^1.5.1" + bignumber.js "^9.0.2" + util "^0.12.4" + arweave@^1.10.13, arweave@^1.14.4: version "1.14.4" resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.14.4.tgz#5ba22136aa0e7fd9495258a3931fb770c9d6bf21" @@ -1600,10 +1976,18 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + axios@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" - integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" + integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -1614,11 +1998,23 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +base64url@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== + basic-auth@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" @@ -1626,6 +2022,11 @@ basic-auth@^2.0.1: dependencies: safe-buffer "5.1.2" +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + before-after-hook@^2.2.0: version "2.2.3" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" @@ -1636,10 +2037,10 @@ big-integer@^1.6.44: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== -bignumber.js@^9.0.2: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== +bignumber.js@^9.0.0, bignumber.js@^9.0.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== bin-links@^4.0.1: version "4.0.2" @@ -1661,7 +2062,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -1778,6 +2179,13 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" +bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -1791,7 +2199,7 @@ buffer@^5.7.1: base64-js "^1.3.1" ieee754 "^1.1.13" -buffer@^6.0.3: +buffer@^6.0.2, buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -1895,9 +2303,9 @@ cardinal@^2.1.1: redeyed "~2.1.0" chai@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + version "4.3.8" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.8.tgz#40c59718ad6928da6629c70496fe990b2bb5b17c" + integrity sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" @@ -2185,6 +2593,16 @@ conventional-commits-parser@^4.0.0: meow "^8.1.2" split2 "^3.2.2" +conventional-commits-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" + integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== + dependencies: + JSONStream "^1.3.5" + is-text-path "^2.0.0" + meow "^12.0.1" + split2 "^4.0.0" + convert-source-map@^1.6.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" @@ -2251,6 +2669,13 @@ create-require@^1.1.0, create-require@^1.1.1: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2478,7 +2903,7 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -elliptic@^6.5.3: +elliptic@6.5.4, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -2538,7 +2963,7 @@ error-ex@^1.3.1, error-ex@^1.3.2: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: +es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2, es-abstract@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== @@ -2709,9 +3134,9 @@ eslint-plugin-header@^3.1.1: integrity sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg== eslint-plugin-import@^2.28.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz#8d66d6925117b06c4018d491ae84469eb3cb1005" - integrity sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q== + version "2.28.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" + integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== dependencies: array-includes "^3.1.6" array.prototype.findlastindex "^1.2.2" @@ -2722,13 +3147,12 @@ eslint-plugin-import@^2.28.0: eslint-import-resolver-node "^0.3.7" eslint-module-utils "^2.8.0" has "^1.0.3" - is-core-module "^2.12.1" + is-core-module "^2.13.0" is-glob "^4.0.3" minimatch "^3.1.2" object.fromentries "^2.0.6" object.groupby "^1.0.0" object.values "^1.1.6" - resolve "^1.22.3" semver "^6.3.1" tsconfig-paths "^3.14.2" @@ -2741,9 +3165,9 @@ eslint-plugin-mocha@^10.1.0: rambda "^7.1.0" eslint-plugin-n@^16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz#baa62bb3af52940a53ba15386348ad9b0b425ada" - integrity sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA== + version "16.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz#5b2c0ad8dd9b724244d30fad2cc49ff4308a2152" + integrity sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog== dependencies: "@eslint-community/eslint-utils" "^4.4.0" builtins "^5.0.1" @@ -2801,14 +3225,14 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.47.0: - version "8.47.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.47.0.tgz#c95f9b935463fb4fad7005e626c7621052e90806" - integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q== + version "8.48.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" + integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "^8.47.0" + "@eslint/js" "8.48.0" "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -2944,7 +3368,22 @@ execa@^7.0.0, execa@^7.1.1: signal-exit "^3.0.7" strip-final-newline "^3.0.0" -exponential-backoff@^3.1.1: +execa@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +exponential-backoff@^3.1.0, exponential-backoff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== @@ -3065,11 +3504,12 @@ find-versions@^5.1.0: semver-regex "^4.0.5" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.1.0" + flatted "^3.2.7" + keyv "^4.5.3" rimraf "^3.0.2" flat@^5.0.2: @@ -3077,7 +3517,7 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: +flatted@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== @@ -3087,7 +3527,7 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.0.0, follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -3161,9 +3601,9 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" @@ -3243,6 +3683,11 @@ get-stream@^7.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-7.0.1.tgz#1664dfe7d1678540ea6a4da3ae7cd59bf4e4a91e" integrity sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -3471,7 +3916,7 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -3484,6 +3929,11 @@ he@1.2.0, he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +hi-base32@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" + integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -3517,6 +3967,13 @@ hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: dependencies: lru-cache "^7.5.1" +hosted-git-info@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.0.tgz#276330b8ad9f4566e82c8ccb16050decc096076b" + integrity sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA== + dependencies: + lru-cache "^10.0.1" + html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -3610,6 +4067,11 @@ human-signals@^4.3.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -3954,6 +4416,13 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-text-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" + integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== + dependencies: + text-extensions "^2.0.0" + is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" @@ -4044,9 +4513,9 @@ istanbul-reports@^3.1.6: istanbul-lib-report "^3.0.0" jackspeak@^2.0.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.3.tgz#ac63c57c18d254dc78a1f4ecd1cdeb4daeb6e616" - integrity sha512-pF0kfjmg8DJLxDrizHoCZGUFz4P4czQ3HyfW4BU0ffebYkzAVlBywp5zaxW/TM+r0sGbmrQdi8EQQVTJFxnGsQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.0.tgz#aa228a94de830f31d4e4f0184427ce91c4ff1493" + integrity sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -4062,6 +4531,21 @@ javascript-natural-sort@0.7.1: resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-sha512@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.8.0.tgz#dd22db8d02756faccf19f218e3ed61ec8249f7d4" + integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4079,6 +4563,18 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -4155,6 +4651,22 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== +keccak@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -4452,6 +4964,11 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" +lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -4464,11 +4981,6 @@ lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" - integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== - magic-string@^0.25.3: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -4545,6 +5057,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +meow@^12.0.1: + version "12.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" + integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== + meow@^8.0.0, meow@^8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" @@ -4796,6 +5313,14 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multistream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" + integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== + dependencies: + once "^1.4.0" + readable-stream "^3.6.0" + mute-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" @@ -4842,6 +5367,11 @@ nise@^5.1.4: just-extend "^4.0.2" path-to-regexp "^1.7.0" +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + node-emoji@^1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" @@ -4849,6 +5379,18 @@ node-emoji@^1.11.0: dependencies: lodash "^4.17.21" +node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" + integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== + node-gyp@^9.0.0, node-gyp@^9.4.0: version "9.4.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" @@ -4943,6 +5485,16 @@ normalize-package-data@^5.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" +normalize-package-data@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" + integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== + dependencies: + hosted-git-info "^7.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -5186,13 +5738,13 @@ object.groupby@^1.0.0: get-intrinsic "^1.2.1" object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" once@^1.3.0, once@^1.4.0: version "1.4.0" @@ -5744,13 +6296,13 @@ read-package-json@^6.0.0: npm-normalize-package-bin "^3.0.0" read-pkg-up@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-10.0.0.tgz#0542d21ff1001d2bfff1f6eac8b4d1d1dc486617" - integrity sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g== + version "10.1.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-10.1.0.tgz#2d13ab732d2f05d6e8094167c2112e2ee50644f4" + integrity sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA== dependencies: find-up "^6.3.0" - read-pkg "^8.0.0" - type-fest "^3.12.0" + read-pkg "^8.1.0" + type-fest "^4.2.0" read-pkg-up@^7.0.1: version "7.0.1" @@ -5771,15 +6323,15 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -read-pkg@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-8.0.0.tgz#78b93774c15a3f151b56d5790d5127a5cb9fc507" - integrity sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw== +read-pkg@^8.0.0, read-pkg@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-8.1.0.tgz#6cf560b91d90df68bce658527e7e3eee75f7c4c7" + integrity sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ== dependencies: "@types/normalize-package-data" "^2.4.1" - normalize-package-data "^5.0.0" + normalize-package-data "^6.0.0" parse-json "^7.0.0" - type-fest "^3.8.0" + type-fest "^4.2.0" read@^2.0.0, read@^2.1.0: version "2.1.0" @@ -5891,7 +6443,7 @@ resolve-global@1.0.0, resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" -resolve@^1.10.0, resolve@^1.17.0, resolve@^1.22.2, resolve@^1.22.3, resolve@^1.22.4: +resolve@^1.10.0, resolve@^1.17.0, resolve@^1.22.2, resolve@^1.22.4: version "1.22.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== @@ -5915,7 +6467,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -6013,15 +6565,29 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + secure-compare@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== semantic-release@^21.0.7: - version "21.0.7" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-21.0.7.tgz#deac6f4908bbd3c03c9a3ba41ae402b4305bf115" - integrity sha512-peRDSXN+hF8EFSKzze90ff/EnAmgITHQ/a3SZpRV3479ny0BIZWEJ33uX6/GlOSKdaSxo9hVRDyv2/u2MuF+Bw== + version "21.1.1" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-21.1.1.tgz#b1a0735fe5037699b26f81ec9e7e8a2fb89d5972" + integrity sha512-OCIazQnaCHdq1F6zfmKS0P7jZakYq0weiqW2mxUWo4H2CDnxelUoa/0Bs/dQatoHc6JFh6lG2HWpusdl93bFcw== dependencies: "@semantic-release/commit-analyzer" "^10.0.0" "@semantic-release/error" "^4.0.0" @@ -6032,13 +6598,13 @@ semantic-release@^21.0.7: cosmiconfig "^8.0.0" debug "^4.0.0" env-ci "^9.0.0" - execa "^7.0.0" + execa "^8.0.0" figures "^5.0.0" find-versions "^5.1.0" get-stream "^6.0.0" git-log-parser "^1.2.0" hook-std "^3.0.0" - hosted-git-info "^6.0.0" + hosted-git-info "^7.0.0" lodash-es "^4.17.21" marked "^5.0.0" marked-terminal "^5.1.1" @@ -6132,7 +6698,7 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -6261,6 +6827,11 @@ split2@^3.0.0, split2@^3.2.2: dependencies: readable-stream "^3.0.0" +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + split2@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/split2/-/split2-1.0.0.tgz#52e2e221d88c75f9a73f90556e263ff96772b314" @@ -6506,6 +7077,11 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== +text-extensions@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" + integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== + text-hex@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" @@ -6553,6 +7129,20 @@ titleize@^3.0.0: resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -6565,6 +7155,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + traverse@~0.6.6: version "0.6.7" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" @@ -6586,9 +7181,9 @@ triple-beam@^1.3.0: integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== ts-api-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.1.tgz#8144e811d44c749cd65b2da305a032510774452d" - integrity sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A== + version "1.0.2" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.2.tgz#7c094f753b6705ee4faee25c3c684ade52d66d99" + integrity sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ== ts-node@^10.8.1, ts-node@^10.9.1: version "10.9.1" @@ -6625,9 +7220,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.5.0, tslib@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" - integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.21.0: version "3.21.0" @@ -6650,6 +7245,11 @@ tuf-js@^1.1.7: debug "^4.3.4" make-fetch-happen "^11.1.1" +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -6692,11 +7292,16 @@ type-fest@^2.12.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== -type-fest@^3.0.0, type-fest@^3.12.0, type-fest@^3.8.0: +type-fest@^3.0.0, type-fest@^3.8.0: version "3.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== +type-fest@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.3.1.tgz#5cb58cdab5120f7ab0b40cfdc35073fb9adb651d" + integrity sha512-pphNW/msgOUSkJbH58x8sqpq8uQj6b0ZKGxEsLKMUnGorRcDjrUaLS+39+/ub41JNTwrrMyJcUB8+YZs3mbwqw== + typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" @@ -6737,9 +7342,9 @@ typed-array-length@^1.0.4: is-typed-array "^1.1.9" "typescript@^4.6.4 || ^5.0.0", typescript@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== uglify-js@^3.1.4: version "3.17.4" @@ -6869,6 +7474,11 @@ validate-npm-package-name@^5.0.0: dependencies: builtins "^5.0.0" +vlq@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-2.0.4.tgz#6057b85729245b9829e3cc7755f95b228d4fe041" + integrity sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA== + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -6886,6 +7496,11 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + whatwg-encoding@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" @@ -6893,6 +7508,14 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -7003,6 +7626,11 @@ write-file-atomic@^5.0.0, write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"