diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aa7d3cc9..74fa8b39 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: node_version: [18.x, 20.x] - command: ['lint', 'format', 'test', 'build'] + command: ['lint', 'format', 'test:integration', 'build'] steps: - uses: actions/checkout@v4 diff --git a/README.md b/README.md index 7417a31d..c7e63e3d 100644 --- a/README.md +++ b/README.md @@ -135,19 +135,28 @@ Types are exported from `./lib/types/[node/web]/index.d.ts` and should be automa -### Contract Data Provider Configuration +### Custom Contract Evaluation + +By default - the `ArIO` client uses the `mainnet` contract and exposes APIs relevant to the `ArIO` contract. You can provide custom `contract` or `contractTxId` to the `ArIO` constructor and expose those APIs, assuming the contract is compatible with the `ArIO` contract. ```typescript -const arIoContractId = 'INSERT_CUSTOM_REGISTRY_CONTRACT_ID'; +// provide a custom contractTxId to the client and default to remote evaluation +const remoteCustomArIO = new ArIO({ + contractTxId: 'TESTNET_CONTRACT_TX_ID', +}); -const contractDataProvider = new ArNSRemoteCache({ - arIoContractId, - remoteCacheUrl: 'http://localhost:3000', +// provide a custom contract to the client, and specify local evaluation using warp +const localCustomArIO = new ArIO({ + contract: new WarpContract({ + contractTxId: 'TESTNET_CONTRACT_TX_ID', + }), }); -const arIOLocal = new ArIO({ - arIoContractId, - contractDataProvider, +// provide a custom contract to the client, and specify local evaluation using remote cache +const remoteCacheCustomArIO = new ArIO({ + contract: new RemoteContract({ + contractTxId: 'TESTNET_CONTRACT_TX_ID', + }), }); ``` diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..f856b1db --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,18 @@ +version: '3' + +services: + arns-service: + image: ghcr.io/ar-io/arns-service:latest + build: . + ports: + - '3000:3000' + environment: + - LOG_LEVEL=debug + - PREFETCH_CONTRACTS=true + - PREFETCH_CONTRACT_IDS=_NctcA2sRy1-J4OmIQZbYFPM17piNcbdBPH2ncX2RL8 + - BOOTSTRAP_CONTRACTS=false + healthcheck: + test: ['CMD', 'curl', '-f', 'http://localhost:3000/healthcheck'] + interval: 10s + timeout: 5s + retries: 5 diff --git a/package.json b/package.json index 6a501f77..d6a0af53 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "format": "prettier --check .", "format:fix": "prettier --write .", "test": "yarn clean && c8 jest .", + "test:integration": "docker compose up -d && yarn test && docker compose down", "prepare": "husky install", "example:mjs": "yarn build:esm && node examples/node/index.mjs", "example:cjs": "yarn build:cjs && node examples/node/index.cjs", @@ -85,7 +86,6 @@ "http-server": "^14.1.1", "husky": "^8.0.3", "jest": "^29.7.0", - "node-stdlib-browser": "^1.2.0", "prettier": "^3.0.2", "rimraf": "^5.0.1", "semantic-release": "^21.0.7", @@ -99,7 +99,7 @@ "dependencies": { "arweave": "^1.14.4", "axios": "1.4.0", - "warp-contracts": "^1.4.34", + "warp-contracts": "1.4.29", "winston": "^3.11.0" } } diff --git a/src/types/arns-service.ts b/src/arns-service.ts similarity index 100% rename from src/types/arns-service.ts rename to src/arns-service.ts diff --git a/src/common.ts b/src/common.ts new file mode 100644 index 00000000..4bde8de5 --- /dev/null +++ b/src/common.ts @@ -0,0 +1,102 @@ +/** + * Copyright (C) 2022-2024 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 { ArIOState, ArNSNameData, Gateway } from './contract-state.js'; + +export type BlockHeight = number; +export type SortKey = string; +export type WalletAddress = string; + +export type EvaluationOptions = { + evalTo?: { sortKey: SortKey } | { blockHeight: BlockHeight }; + // TODO: any other evaluation constraints +}; + +// combine evaluation parameters with read interaction inputs +export type EvaluationParameters> = { + evaluationOptions?: EvaluationOptions | Record | undefined; +} & T; + +export interface SmartWeaveContract { + getContractState(params: EvaluationParameters): Promise; + readInteraction({ + functionName, + inputs, + evaluationOptions, + }: EvaluationParameters<{ functionName: string; inputs?: I }>): Promise; + // TODO: write interaction +} + +// TODO: extend with additional methods +export interface ArIOContract { + getState({ evaluationOptions }: EvaluationParameters): Promise; + getGateway({ + address, + evaluationOptions, + }: EvaluationParameters<{ address: WalletAddress }>): Promise< + Gateway | undefined + >; + getGateways({ + evaluationOptions, + }: EvaluationParameters): Promise< + Record | Record + >; + getBalance( + params: { address: WalletAddress } & EvaluationOptions, + ): Promise; + getBalances({ + evaluationOptions, + }: EvaluationParameters): Promise< + Record | Record + >; + getArNSRecord({ + domain, + evaluationOptions, + }: EvaluationParameters<{ domain: string }>): Promise< + ArNSNameData | undefined + >; + getArNSRecords({ + evaluationOptions, + }: EvaluationParameters): Promise< + Record | Record + >; +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +export interface Logger { + setLogLevel: (level: string) => void; + setLogFormat: (logFormat: string) => void; + info: (message: string, ...args: any[]) => void; + warn: (message: string, ...args: any[]) => void; + error: (message: string, ...args: any[]) => void; + debug: (message: string, ...args: any[]) => void; +} +/* eslint-enable @typescript-eslint/no-explicit-any */ +export interface HTTPClient { + get({ + endpoint, + signal, + headers, + allowedStatuses, + params, + }: { + endpoint: string; + signal?: AbortSignal; + headers?: Record; + allowedStatuses?: number[]; + params?: object | I; + }): Promise; +} diff --git a/src/common/ar-io.ts b/src/common/ar-io.ts index c0d3b7ea..b5679b16 100644 --- a/src/common/ar-io.ts +++ b/src/common/ar-io.ts @@ -14,44 +14,139 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { ArIOContract, ArNSNameData, Gateway } from '../types/index.js'; -import { ArNSRemoteCache } from './index.js'; +import { ARNS_TESTNET_REGISTRY_TX } from '../constants.js'; +import { + ArIOContract, + ArIOState, + ArNSNameData, + EvaluationParameters, + Gateway, + SmartWeaveContract, +} from '../types.js'; +import { RemoteContract } from './contracts/remote-contract.js'; -export type CacheConfiguration = { - remoteCacheUrl?: string; - contractTxId?: string; -}; -export type ArIOConfiguration = { - cacheConfig?: CacheConfiguration; -}; +// TODO: append this with other configuration options (e.g. local vs. remote evaluation) +export type ContractConfiguration = + | { + contract?: SmartWeaveContract; + } + | { + contractTxId: string; + }; + +function isContractConfiguration( + config: ContractConfiguration, +): config is { contract: SmartWeaveContract } { + return 'contract' in config; +} + +function isContractTxIdConfiguration( + config: ContractConfiguration, +): config is { contractTxId: string } { + return 'contractTxId' in config; +} export class ArIO implements ArIOContract { - protected cache: ArIOContract; + private contract: SmartWeaveContract; - constructor({ cacheConfig }: ArIOConfiguration = {}) { - this.cache = new ArNSRemoteCache({ - contractTxId: cacheConfig?.contractTxId, - url: cacheConfig?.remoteCacheUrl, - }); + constructor( + config: ContractConfiguration = { + // default to a contract that uses the arns service to do the evaluation + contract: new RemoteContract({ + contractTxId: ARNS_TESTNET_REGISTRY_TX, + }), + }, + ) { + if (isContractConfiguration(config)) { + this.contract = config.contract; + } else if (isContractTxIdConfiguration(config)) { + this.contract = new RemoteContract({ + contractTxId: config.contractTxId, + }); + } } - // implement ArIOContract interface - async getArNSRecord({ domain }: { domain: string }): Promise { - return this.cache.getArNSRecord({ domain }); + /** + * Returns the current state of the contract. + */ + async getState(params: EvaluationParameters): Promise { + const state = await this.contract.getContractState(params); + return state; } - async getArNSRecords(): Promise> { - return this.cache.getArNSRecords(); + + /** + * Returns the ARNS record for the given domain. + */ + async getArNSRecord({ + domain, + evaluationOptions, + }: EvaluationParameters<{ domain: string }>): Promise< + ArNSNameData | undefined + > { + const records = await this.getArNSRecords({ evaluationOptions }); + return records[domain]; } - async getBalance({ address }: { address: string }): Promise { - return this.cache.getBalance({ address }); + + /** + * Returns all ArNS records. + */ + async getArNSRecords({ + evaluationOptions, + }: EvaluationParameters = {}): Promise> { + const state = await this.contract.getContractState({ evaluationOptions }); + return state.records; } - async getBalances(): Promise> { - return this.cache.getBalances(); + + /** + * Returns the balance of the given address. + */ + async getBalance({ + address, + evaluationOptions, + }: EvaluationParameters<{ address: string }>): Promise { + const balances = await this.getBalances({ evaluationOptions }); + return balances[address] || 0; + } + + /** + * Returns the balances of all addresses. + */ + async getBalances({ evaluationOptions }: EvaluationParameters = {}): Promise< + Record + > { + const state = await this.contract.getContractState({ evaluationOptions }); + return state.balances; } - async getGateway({ address }: { address: string }): Promise { - return this.cache.getGateway({ address }); + + /** + * Returns the gateway for the given address, including weights. + */ + async getGateway({ + address, + evaluationOptions, + }: EvaluationParameters<{ address: string }>): Promise { + return this.contract + .readInteraction<{ target: string }, Gateway>({ + functionName: 'gateway', + inputs: { + target: address, + }, + evaluationOptions, + }) + .catch(() => { + return undefined; + }); } - async getGateways(): Promise> { - return this.cache.getGateways(); + + /** + * Returns all gateways, including weights. + */ + async getGateways({ evaluationOptions }: EvaluationParameters = {}): Promise< + Record | Record + > { + return this.contract.readInteraction({ + functionName: 'gateways', + evaluationOptions, + }); } } diff --git a/src/common/caches/arns-remote-cache.ts b/src/common/caches/arns-remote-cache.ts deleted file mode 100644 index 2f93786e..00000000 --- a/src/common/caches/arns-remote-cache.ts +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Copyright (C) 2022-2024 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 { ARNS_TESTNET_REGISTRY_TX, ARWEAVE_TX_REGEX } from '../../constants.js'; -import { - ArIOContract, - ArNSNameData, - ArNSStateResponse, - Gateway, - HTTPClient, -} from '../../types/index.js'; -import { NotFound } from '../error.js'; -import { AxiosHTTPService } from '../http.js'; -import { DefaultLogger } from '../logger.js'; - -export class ArNSRemoteCache implements ArIOContract { - private contractTxId: string; - private logger: DefaultLogger; - private http: HTTPClient; - private apiVersion = 'v1' as const; // use v1 endpoints - constructor({ - url = 'https://api.arns.app', - logger = new DefaultLogger({ - level: 'debug', - logFormat: 'simple', - }), - contractTxId = ARNS_TESTNET_REGISTRY_TX, - }: { - url?: string; - logger?: DefaultLogger; - contractTxId?: string; - }) { - this.validateContractTxId(contractTxId); - this.contractTxId = contractTxId; - this.logger = logger; - this.http = new AxiosHTTPService({ - url: `${url}/${this.apiVersion}`, - logger, - }); - } - - private validateContractTxId(id: string) { - if (!ARWEAVE_TX_REGEX.test(id)) { - throw new Error(`Invalid contract tx id: ${id}`); - } - } - - async getGateway({ address }: { address: string }) { - this.logger.debug(`Fetching gateway ${address}`); - const gateway = await this.getGateways().then((gateways) => { - if (gateways[address] === undefined) { - throw new NotFound(`Gateway not found: ${address}`); - } - return gateways[address]; - }); - return gateway; - } - - async getGateways() { - this.logger.debug(`Fetching gateways`); - const { result } = await this.http.get< - ArNSStateResponse<'result', Record> - >({ - endpoint: `/contract/${this.contractTxId.toString()}/read/gateways`, - }); - return result; - } - - async getBalance({ address }: { address: string }) { - this.logger.debug(`Fetching balance for ${address}`); - const { result } = await this.http - .get>({ - endpoint: `/contract/${this.contractTxId.toString()}/state/balances/${address}`, - }) - .catch((e) => { - if (e instanceof NotFound) { - return { result: 0 }; - } - throw e; - }); - return result; - } - - async getBalances() { - this.logger.debug(`Fetching balances`); - const { result } = await this.http.get< - ArNSStateResponse<'result', Record> - >({ - endpoint: `/contract/${this.contractTxId.toString()}/state/balances`, - }); - return result; - } - - async getArNSRecord({ domain }: { domain: string }): Promise { - this.logger.debug(`Fetching record for ${domain}`); - const { result } = await this.http.get< - ArNSStateResponse<'result', ArNSNameData> - >({ - endpoint: `/contract/${this.contractTxId.toString()}/state/records/${domain}`, - }); - return result; - } - - async getArNSRecords(): Promise> { - this.logger.debug(`Fetching all records`); - const { result } = await this.http.get< - ArNSStateResponse<'result', Record> - >({ - endpoint: `/contract/${this.contractTxId.toString()}/state/records`, - }); - return result; - } -} diff --git a/src/common/caches/index.ts b/src/common/caches/index.ts deleted file mode 100644 index 1f8d0053..00000000 --- a/src/common/caches/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (C) 2022-2024 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 . - */ -export * from './arns-remote-cache.js'; diff --git a/src/common/contracts/remote-contract.ts b/src/common/contracts/remote-contract.ts new file mode 100644 index 00000000..8679f1c7 --- /dev/null +++ b/src/common/contracts/remote-contract.ts @@ -0,0 +1,89 @@ +/** + * Copyright (C) 2022-2024 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 { + EvaluationParameters, + HTTPClient, + Logger, + SmartWeaveContract, +} from '../../types.js'; +import { AxiosHTTPService } from '../http.js'; +import { DefaultLogger } from '../logger.js'; + +// TODO: this assumes the API structure matches the current arns-service API - we will want to consider another interface that exposes relevant APIs with client implementations (arns-service, DRE nodes, etc.) +export class RemoteContract implements SmartWeaveContract { + private logger: Logger; + private http: HTTPClient; + private contractTxId: string; + + constructor({ + url = 'https://api.arns.app', + contractTxId, + logger = new DefaultLogger(), + }: { + contractTxId: string; + url?: string; + logger?: DefaultLogger; + }) { + this.contractTxId = contractTxId; + this.logger = logger; + this.http = new AxiosHTTPService({ + url: `${url}/v1/contract/${contractTxId}`, + }); + } + + async getContractState({ + evaluationOptions, + }: EvaluationParameters = {}): Promise { + this.logger.debug(`Fetching contract state`, { + contractTxId: this.contractTxId, + evaluationOptions, + }); + const { state } = await this.http.get< + { sortKey: string } | { blockHeight: number } | Record, + { state: T } + >({ + endpoint: ``, + params: { + ...evaluationOptions?.evalTo, + }, + }); + return state; + } + + async readInteraction({ + functionName, + inputs, + evaluationOptions, + }: EvaluationParameters<{ functionName: string; inputs?: I }>): Promise { + this.logger.debug(`Evaluating read interaction on contract`, { + functionName, + inputs, + evaluationOptions, + }); + const { result } = await this.http.get< + I | Record, + { result: K } + >({ + endpoint: `/read/${functionName}`, + params: { + ...evaluationOptions?.evalTo, + ...inputs, + }, + }); + return result; + } +} diff --git a/src/common/contracts/warp-contract.ts b/src/common/contracts/warp-contract.ts new file mode 100644 index 00000000..bc664f5b --- /dev/null +++ b/src/common/contracts/warp-contract.ts @@ -0,0 +1,97 @@ +/** + * Copyright (C) 2022-2024 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 { + Contract, + Warp, + WarpFactory, + defaultCacheOptions, +} from 'warp-contracts'; + +import { EvaluationParameters, SmartWeaveContract } from '../../types.js'; +import { FailedRequestError } from '../error.js'; + +export class WarpContract implements SmartWeaveContract { + private contract: Contract; + private contractTxId: string; + private cacheUrl: string | undefined; + + constructor({ + contractTxId, + cacheUrl, + warp = WarpFactory.forMainnet({ + ...defaultCacheOptions, + inMemory: true, // default to in memory for now, a custom warp implementation can be provided + }), + }: { + contractTxId: string; + cacheUrl?: string; + warp: Warp; + }) { + this.contract = warp.contract(contractTxId); + this.cacheUrl = cacheUrl; + } + + private async syncState() { + // TODO: get contract manifest and set it before evaluating + if (this.cacheUrl !== undefined) { + await this.contract.syncState( + `${this.cacheUrl}/v1/contract/${this.contractTxId}`, + { + validity: true, + }, + ); + } + } + + async getContractState({ + evaluationOptions = {}, + }: EvaluationParameters): Promise { + await this.syncState(); + const evalTo = evaluationOptions?.evalTo; + let sortKeyOrBlockHeight: string | number | undefined; + if (evalTo && 'sortKey' in evalTo) { + sortKeyOrBlockHeight = evalTo.sortKey; + } else if (evalTo && 'blockHeight') { + sortKeyOrBlockHeight = evalTo.blockHeight; + } + + const evaluationResult = + await this.contract.readState(sortKeyOrBlockHeight); + if (!evaluationResult.cachedValue.state) { + throw new FailedRequestError(502, 'Failed to evaluate contract state'); + } + return evaluationResult.cachedValue.state as T; + } + + async readInteraction({ + functionName, + inputs, + // TODO: view state only supports sort key so we won't be able to use block height + }: EvaluationParameters<{ functionName: string; inputs: I }>): Promise { + const evaluationResult = await this.contract.viewState({ + functionName, + ...inputs, + }); + if (!evaluationResult.result) { + throw new FailedRequestError( + 502, + 'Failed to evaluate contract read interaction', + ); + } + return evaluationResult.result; + } +} diff --git a/src/common/error.test.ts b/src/common/error.test.ts deleted file mode 100644 index 068838e7..00000000 --- a/src/common/error.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { BadRequest, NotFound } from './error.js'; - -describe('Error', () => { - it.each([ - ['BadRequest', BadRequest], - ['NotFound', NotFound], - ])( - 'Errors should inherit Base error and names should be applied appropriately', - (name, errorClass) => { - const message = 'This is a test error'; - const error = new errorClass(message); - expect(error.name).toEqual(name); - expect(error.message).toEqual(message); - }, - ); -}); diff --git a/src/common/http.ts b/src/common/http.ts index d9751152..1c5f5cb3 100644 --- a/src/common/http.ts +++ b/src/common/http.ts @@ -16,41 +16,51 @@ */ import { AxiosInstance } from 'axios'; -import { HTTPClient, Logger } from '../types/index.js'; +import { HTTPClient, Logger } from '../types.js'; import { createAxiosInstance } from '../utils/index.js'; import { FailedRequestError, NotFound, UnknownError } from './error.js'; +import { DefaultLogger } from './logger.js'; export class AxiosHTTPService implements HTTPClient { private axios: AxiosInstance; private logger: Logger; // TODO: re-implement axios-retry. Currently that package is broken for nodenext. - constructor({ url, logger }: { url: string; logger: Logger }) { + constructor({ + url, + logger = new DefaultLogger(), + }: { + url: string; + logger?: Logger; + }) { this.logger = logger; this.axios = createAxiosInstance({ axiosConfig: { baseURL: url, - maxRedirects: 0, }, }); } - async get({ + async get({ endpoint, signal, allowedStatuses = [200, 202], headers, + params, }: { endpoint: string; signal?: AbortSignal; allowedStatuses?: number[]; headers?: Record; - }): Promise { - this.logger.debug(`Get request to endpoint: ${endpoint}`); - const { status, statusText, data } = await this.axios.get(endpoint, { + params?: I; + }): Promise { + this.logger.debug( + `Get request to endpoint: ${endpoint} with params ${JSON.stringify(params, undefined, 2)}`, + ); + const { status, statusText, data } = await this.axios.get(endpoint, { headers, signal, + params, }); - if (!allowedStatuses.includes(status)) { switch (status) { case 404: @@ -64,39 +74,4 @@ export class AxiosHTTPService implements HTTPClient { return data; } - - // async post({ - // endpoint, - // signal, - // allowedStatuses = [200, 202], - // headers, - // data, - // }: { - // endpoint: string; - // signal?: AbortSignal; - // allowedStatuses?: number[]; - // headers?: Record; - // data: Readable | Buffer | ReadableStream; - // }): Promise { - // const { - // status, - // statusText, - // data: response, - // } = await this.axios.post(endpoint, data, { - // headers, - // signal, - // }); - - // if (!allowedStatuses.includes(status)) { - // switch (status) { - // case 404: - // throw new NotFound(statusText); - // case 400: - // throw new FailedRequestError(status, statusText); - // default: - // throw new UnknownError(statusText); - // } - // } - // return response; - // } } diff --git a/src/common/index.ts b/src/common/index.ts index 8901ae5e..e21bcabd 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -15,6 +15,9 @@ * along with this program. If not, see . */ export * from './ar-io.js'; -export * from './caches/index.js'; export * from './error.js'; export * from './logger.js'; + +// contracts +export * from './contracts/remote-contract.js'; +export * from './contracts/warp-contract.js'; diff --git a/src/common/logger.ts b/src/common/logger.ts index 623c25b0..25aeb7f8 100644 --- a/src/common/logger.ts +++ b/src/common/logger.ts @@ -18,7 +18,7 @@ import 'setimmediate'; import winston, { createLogger, format, transports } from 'winston'; -import { Logger } from '../types/index.js'; +import { Logger } from '../types.js'; import { version } from '../version.js'; export class DefaultLogger implements Logger { diff --git a/src/constants.ts b/src/constants.ts index 3e49f6c0..54bfdf75 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -16,6 +16,10 @@ */ export const ARWEAVE_TX_REGEX = new RegExp('^[a-zA-Z0-9_-]{43}$'); +// sortkey: padded blockheight to 12, JS timestamp, hash of transactionID + block hash. Timestamp only applicable to L2 and normally is all zeros. +export const SORT_KEY_REGEX = new RegExp( + '^[0-9]{12},[0-9]{13},[a-fA-F0-9]{64}$', +); export const ARNS_TESTNET_REGISTRY_TX = process.env.ARNS_REGISTRY_TX ?? 'bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U'; diff --git a/src/types/contract-state.ts b/src/contract-state.ts similarity index 99% rename from src/types/contract-state.ts rename to src/contract-state.ts index ce8c3ed2..6f5b7c54 100644 --- a/src/types/contract-state.ts +++ b/src/contract-state.ts @@ -165,7 +165,7 @@ export type RegistryVaults = Record; export type PrescribedObservers = Record; -export interface IOState { +export interface ArIOState { balances: Balances; name: string; // The friendly name of the token, shown in block explorers and marketplaces records: Record; // The list of all ArNS names and their associated data diff --git a/src/node/index.ts b/src/node/index.ts index d71e24b7..f72e7bc6 100644 --- a/src/node/index.ts +++ b/src/node/index.ts @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -export * from '../types/index.js'; +export * from '../types.js'; export * from '../common/index.js'; export * from '../constants.js'; export * from '../utils/index.js'; diff --git a/src/types/index.ts b/src/types.ts similarity index 99% rename from src/types/index.ts rename to src/types.ts index 476e1888..3b6b66f9 100644 --- a/src/types/index.ts +++ b/src/types.ts @@ -14,7 +14,6 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ - export * from './arns-service.js'; export * from './contract-state.js'; export * from './common.js'; diff --git a/src/types/common.ts b/src/types/common.ts deleted file mode 100644 index 01e074e1..00000000 --- a/src/types/common.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (C) 2022-2024 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 { ArNSNameData, Gateway } from './contract-state.js'; - -// TODO: extend with additional methods -export interface ArIOContract { - getGateway({ address }: { address: WalletAddress }): Promise; - getGateways(): Promise>; - getBalance({ address }: { address: WalletAddress }): Promise; - getBalances(): Promise>; - getArNSRecord({ domain }: { domain: string }): Promise; - getArNSRecords(): Promise>; -} - -/* eslint-disable @typescript-eslint/no-explicit-any */ -export interface Logger { - setLogLevel: (level: string) => void; - setLogFormat: (logFormat: string) => void; - info: (message: string, ...args: any[]) => void; - warn: (message: string, ...args: any[]) => void; - error: (message: string, ...args: any[]) => void; - debug: (message: string, ...args: any[]) => void; -} -/* eslint-enable @typescript-eslint/no-explicit-any */ - -export type WalletAddress = string; - -export interface HTTPClient { - get({ - endpoint, - signal, - headers, - allowedStatuses, - }: { - endpoint: string; - signal?: AbortSignal; - headers?: Record; - allowedStatuses?: number[]; - }): Promise; - // TODO: add post method - // post({ - // endpoint, - // signal, - // headers, - // allowedStatuses, - // data, - // }: { - // endpoint: string; - // signal: AbortSignal; - // headers?: Record; - // allowedStatuses?: number[]; - // data: Readable | ReadableStream | Buffer; - // }): Promise; -} diff --git a/src/utils/arweave.test.ts b/src/utils/arweave.test.ts deleted file mode 100644 index 5710cfe6..00000000 --- a/src/utils/arweave.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ARNS_DEVNET_REGISTRY_TX } from '../constants.js'; -import { validateArweaveId } from './arweave.js'; - -describe('Arweave ID Validation', () => { - it('should validate a valid Arweave ID', () => { - const validId = ARNS_DEVNET_REGISTRY_TX; - expect(validateArweaveId(validId)).toBe(true); - }); - - it('should not validate an invalid Arweave ID', () => { - const invalidId = 'invalid-id'; - expect(validateArweaveId(invalidId)).toBe(false); - }); -}); diff --git a/src/utils/arweave.ts b/src/utils/arweave.ts index 1e25fb4a..8b65fdef 100644 --- a/src/utils/arweave.ts +++ b/src/utils/arweave.ts @@ -14,8 +14,13 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ +import { BlockHeight } from '../common.js'; import { ARWEAVE_TX_REGEX } from '../constants.js'; export const validateArweaveId = (id: string): boolean => { return ARWEAVE_TX_REGEX.test(id); }; + +export function isBlockHeight(height: string | number): height is BlockHeight { + return height !== undefined && !isNaN(parseInt(height.toString())); +} diff --git a/src/utils/http-client.ts b/src/utils/http-client.ts index 4513e352..0da741a8 100644 --- a/src/utils/http-client.ts +++ b/src/utils/http-client.ts @@ -28,6 +28,7 @@ export const createAxiosInstance = ({ }: AxiosInstanceParameters = {}): AxiosInstance => { const axiosInstance = axios.create({ ...axiosConfig, + maxRedirects: 0, headers: { ...axiosConfig.headers, 'x-source-version': `${version}`, diff --git a/src/utils/index.ts b/src/utils/index.ts index 4d2742ca..0738d3ef 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -16,3 +16,4 @@ */ export * from './arweave.js'; export * from './http-client.js'; +export * from './smartweave.js'; diff --git a/src/utils/smartweave.ts b/src/utils/smartweave.ts new file mode 100644 index 00000000..762f4aee --- /dev/null +++ b/src/utils/smartweave.ts @@ -0,0 +1,54 @@ +/** + * Copyright (C) 2022-2024 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 { SortKey } from '../common.js'; +import { SORT_KEY_REGEX } from '../constants.js'; + +export function isSortKey(sortKey: string): sortKey is SortKey { + return SmartWeaveSortKey.validate(sortKey); +} + +export class SmartWeaveSortKey { + private _sortKey: string; + constructor(sortKey: string) { + if (!SmartWeaveSortKey.validate(sortKey)) { + throw new Error(`Invalid sort key: ${sortKey}`); + } + + this._sortKey = sortKey; + } + + static validate(sortKey: string): boolean { + return SORT_KEY_REGEX.test(sortKey); + } + + toString(): string { + return this._sortKey; + } + + parts(): string[] { + return this._sortKey.split(','); + } + blockHeight(): number { + return parseInt(this.parts()[0]); + } + timestamp(): number { + return parseInt(this.parts()[1]); + } + hash(): string { + return this.parts()[2]; + } +} diff --git a/src/web/index.ts b/src/web/index.ts index d71e24b7..f72e7bc6 100644 --- a/src/web/index.ts +++ b/src/web/index.ts @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -export * from '../types/index.js'; +export * from '../types.js'; export * from '../common/index.js'; export * from '../constants.js'; export * from '../utils/index.js'; diff --git a/tests/ar-io.test.ts b/tests/ar-io.test.ts index b17a45c7..c12b4336 100644 --- a/tests/ar-io.test.ts +++ b/tests/ar-io.test.ts @@ -1,9 +1,115 @@ import { ArIO } from '../src/common/ar-io.js'; +import { RemoteContract } from '../src/common/contracts/remote-contract.js'; +import { ARNS_DEVNET_REGISTRY_TX } from '../src/constants.js'; +import { ArIOState } from '../src/contract-state.js'; +import { SmartWeaveSortKey } from '../src/utils/smartweave.js'; +const gatewayAddress = '1H7WZIWhzwTH9FIcnuMqYkTsoyv1OTfGa_amvuYwrgo'; +const domain = 'ar-io'; +const evaluateToBlockHeight = 1377100; +const evaluateToSortKey = new SmartWeaveSortKey( + '000001376946,0000000000000,18d52956c8e13ae1f557b4e67f6f298b8ffd2a5cd96e42ec24ca649b7401510f', +); describe('ArIO Client', () => { + const arIO = new ArIO({ + contract: new RemoteContract({ + url: process.env.REMOTE_CACHE_URL || 'http://localhost:3000', + contractTxId: ARNS_DEVNET_REGISTRY_TX, + }), + }); it('should create a custom ArIO client', () => { - const arioClient = new ArIO(); + expect(arIO).toBeInstanceOf(ArIO); + }); + + it('should should return undefined for non existent gateway', async () => { + const nonExistent = await arIO.getGateway({ + address: 'some-address', + }); + expect(nonExistent).toEqual(undefined); + }); + + it('should return gateways at a given block height', async () => { + const gateway = await arIO.getGateway({ + address: gatewayAddress, + evaluationOptions: { evalTo: { blockHeight: evaluateToBlockHeight } }, + }); + expect(gateway).toBeDefined(); + }); + + it('should return gateways at a given sort key', async () => { + const gateway = await arIO.getGateway({ + address: gatewayAddress, + evaluationOptions: { evalTo: { sortKey: evaluateToSortKey.toString() } }, + }); + expect(gateway).toBeDefined(); + }); + + it('should return gateways at a given block height', async () => { + const gateways = await arIO.getGateways({ + evaluationOptions: { evalTo: { blockHeight: evaluateToBlockHeight } }, + }); + expect(gateways[gatewayAddress]).toBeDefined(); + }); + + it('should return gateways at a given sort key', async () => { + const gateways = await arIO.getGateways({ + evaluationOptions: { evalTo: { sortKey: evaluateToSortKey.toString() } }, + }); + expect(gateways[gatewayAddress]).toBeDefined(); + }); + + it('should return the record for an existing domain', async () => { + const record = await arIO.getArNSRecord({ domain }); + expect(record).toBeDefined(); + }); + + it('should throw return undefined for a non existent record', async () => { + const nonExistent = await arIO.getArNSRecord({ + domain: 'some-domain', + }); + expect(nonExistent).toEqual(undefined); + }); + + it('should fetch all records', async () => { + const records = await arIO.getArNSRecords(); + expect(records).toBeDefined(); + }); + + it('should return record at a given block height', async () => { + const currentRecord = await arIO.getArNSRecord({ + domain, + evaluationOptions: { + evalTo: { blockHeight: evaluateToBlockHeight + 1 }, + }, + }); + expect(currentRecord).toBeDefined(); + }); + + it('should return record at a given sort key', async () => { + const record = await arIO.getArNSRecord({ + domain, + evaluationOptions: { + evalTo: { sortKey: evaluateToSortKey.toString() }, + }, + }); + expect(record).toBeDefined(); + }); + + it('should return records at a given block height', async () => { + const records = await arIO.getArNSRecords({ + evaluationOptions: { + evalTo: { blockHeight: evaluateToBlockHeight }, + }, + }); + expect(records[domain]).toBeDefined(); + }); - expect(arioClient).toBeInstanceOf(ArIO); + it('should return records at a given sort key', async () => { + const records = await arIO.getArNSRecords({ + evaluationOptions: { + evalTo: { sortKey: evaluateToSortKey.toString() }, + }, + }); + expect(records[domain]).toBeDefined(); }); }); diff --git a/tests/arns-remote-cache.test.ts b/tests/arns-remote-cache.test.ts deleted file mode 100644 index a4f38bb1..00000000 --- a/tests/arns-remote-cache.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { ArNSRemoteCache } from '../src/common/caches/arns-remote-cache.js'; -import { NotFound } from '../src/common/error.js'; - -describe('ArNSRemoteCache', () => { - const remoteCacheProvider = new ArNSRemoteCache({}); - - // gateway tests - it('should be able to fetch gateways', async () => { - const gateways = await remoteCacheProvider.getGateways(); - expect(gateways).toBeDefined(); - }); - - it('should should throw NotFound error on non existent gateway', async () => { - const error = await remoteCacheProvider - .getGateway({ - address: 'some-address', - }) - .catch((e) => e); - expect(error).toBeInstanceOf(NotFound); - }); - - // balance tests - it('should fetch a balance', async () => { - const balance = await remoteCacheProvider.getBalance({ - address: 'some-address', - }); - expect(balance).toEqual(0); - }); - - it('should fetch all balances', async () => { - const balances = await remoteCacheProvider.getBalances(); - expect(balances).toBeDefined(); - }); - - // records tests - it('should fetch a record', async () => { - const record = await remoteCacheProvider.getArNSRecord({ - domain: 'ar-io', - }); - expect(record).toBeDefined(); - }); - - it('should throw NotFound error on non existent record', async () => { - const error = await remoteCacheProvider - .getArNSRecord({ - domain: 'some-domain', - }) - .catch((e) => e); - expect(error).toBeInstanceOf(NotFound); - }); - - it('should fetch all records', async () => { - const records = await remoteCacheProvider.getArNSRecords(); - - expect(records).toBeDefined(); - }); -}); diff --git a/tsconfig.json b/tsconfig.json index 5f894ed0..4dd6d5f0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,5 +25,5 @@ "strictNullChecks": true }, "include": ["src"], - "exclude": ["lib", "node_modules", "bundles"] + "exclude": ["lib", "node_modules", "bundles", "tests"] } diff --git a/yarn.lock b/yarn.lock index 9a18df76..fb2d95c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2182,7 +2182,7 @@ arweave@^1.10.13, arweave@^1.13.7, arweave@^1.14.4: base64-js "^1.5.1" bignumber.js "^9.0.2" -asn1.js@^5.2.0, asn1.js@^5.4.1: +asn1.js@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== @@ -2192,17 +2192,6 @@ asn1.js@^5.2.0, asn1.js@^5.4.1: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" -assert@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" - integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== - dependencies: - call-bind "^1.0.2" - is-nan "^1.3.2" - object-is "^1.1.5" - object.assign "^4.1.4" - util "^0.12.5" - async-mutex@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" @@ -2362,16 +2351,11 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.6, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.11.6: version "4.12.0" 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.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== - bottleneck@^2.15.3: version "2.19.5" resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" @@ -2399,11 +2383,6 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - browser-level@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" @@ -2414,74 +2393,6 @@ browser-level@^1.0.1: module-error "^1.0.2" run-parallel-limit "^1.1.0" -browser-resolve@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" - integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== - dependencies: - resolve "^1.17.0" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" - integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.4" - inherits "^2.0.4" - parse-asn1 "^5.1.6" - readable-stream "^3.6.2" - safe-buffer "^5.2.1" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - browserslist@^4.22.2: version "4.22.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" @@ -2530,12 +2441,7 @@ buffer-pipe@0.0.3: dependencies: safe-buffer "^5.1.2" -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^5.5.0, buffer@^5.7.1: +buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2556,11 +2462,6 @@ builtin-modules@^3.3.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - builtins@^5.0.0, builtins@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" @@ -2628,7 +2529,7 @@ cacache@^17.0.0, cacache@^17.0.4, cacache@^17.1.3: tar "^6.1.11" unique-filename "^3.0.0" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -2725,14 +2626,6 @@ cidr-regex@^3.1.1: dependencies: ip-regex "^4.1.0" -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - cjs-module-lexer@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" @@ -2911,21 +2804,11 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - conventional-changelog-angular@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" @@ -3029,37 +2912,6 @@ crc32-stream@^4.0.2: crc-32 "^1.2.0" readable-stream "^3.4.0" -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - create-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" @@ -3073,7 +2925,7 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" -create-require@^1.1.0, create-require@^1.1.1: +create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== @@ -3087,23 +2939,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - crypto-random-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" @@ -3213,14 +3048,6 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3241,15 +3068,6 @@ diff@^5.1.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - dir-glob@^3.0.0, dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3271,11 +3089,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -domain-browser@^4.22.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.23.0.tgz#427ebb91efcb070f05cffdfb8a4e9a6c25f8c94b" - integrity sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA== - dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -3300,19 +3113,6 @@ electron-to-chromium@^1.4.648: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.668.tgz#5cfed14f3240cdc70a359a49790cb295b1f097f1" integrity sha512-ZOBocMYCehr9W31+GpMclR+KBaDZOoAEabLdhpZ8oU1JFDwIaFY0UDbpXVEUFc0BIP2O2Qn3rkfCjQmMR4T/bQ== -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== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" @@ -3754,19 +3554,11 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@3.3.0, events@^3.0.0: +events@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -4376,23 +4168,6 @@ has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -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== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - hasown@^2.0.0, hasown@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" @@ -4405,15 +4180,6 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - hook-std@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-3.0.0.tgz#47038a01981e07ce9d83a6a3b2eb98cad0f7bd58" @@ -4507,11 +4273,6 @@ http-server@^14.1.1: union "~0.5.0" url-join "^4.0.1" -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== - https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -4633,7 +4394,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4691,14 +4452,6 @@ ip-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" @@ -4785,13 +4538,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -4804,14 +4550,6 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-nan@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -4897,7 +4635,7 @@ is-text-path@^2.0.0: dependencies: text-extensions "^2.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.13, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.13, is-typed-array@^1.1.9: version "1.1.13" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== @@ -4931,11 +4669,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isomorphic-timers-promises@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" - integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== - issue-parser@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-6.0.0.tgz#b1edd06315d4f2044a9755daf85fdafde9b4014a" @@ -5974,15 +5707,6 @@ marked@^5.0.0: resolved "https://registry.yarnpkg.com/marked/-/marked-5.1.2.tgz#62b5ccfc75adf72ca3b64b2879b551d89e77677f" integrity sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg== -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - memory-level@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" @@ -6032,14 +5756,6 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -6077,16 +5793,11 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: +minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - minimatch@9.0.3, minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -6322,39 +6033,6 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== -node-stdlib-browser@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz#5ddcfdf4063b88fb282979a1aa6ddab9728d5e4c" - integrity sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg== - dependencies: - assert "^2.0.0" - browser-resolve "^2.0.0" - browserify-zlib "^0.2.0" - buffer "^5.7.1" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - create-require "^1.1.1" - crypto-browserify "^3.11.0" - domain-browser "^4.22.0" - events "^3.0.0" - https-browserify "^1.0.0" - isomorphic-timers-promises "^1.0.1" - os-browserify "^0.3.0" - path-browserify "^1.0.1" - pkg-dir "^5.0.0" - process "^0.11.10" - punycode "^1.4.1" - querystring-es3 "^0.2.1" - readable-stream "^3.6.0" - stream-browserify "^3.0.0" - stream-http "^3.2.0" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.1" - url "^0.11.0" - util "^0.12.4" - vm-browserify "^1.0.1" - nopt@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" @@ -6611,20 +6289,12 @@ object-inspect@^1.13.1: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4, object.assign@^4.1.5: +object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== @@ -6708,11 +6378,6 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - p-each-series@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-3.0.0.tgz#d1aed5e96ef29864c897367a7d2a628fdc960806" @@ -6842,11 +6507,6 @@ pacote@^15.0.0, pacote@^15.0.8, pacote@^15.2.0: ssri "^10.0.0" tar "^6.1.11" -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -6854,17 +6514,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - parse-conflict-json@^3.0.0, parse-conflict-json@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" @@ -6903,11 +6552,6 @@ parse-json@^7.0.0: lines-and-columns "^2.0.3" type-fest "^3.8.0" -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -6966,17 +6610,6 @@ path-type@^5.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -7012,13 +6645,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - portfinder@^1.0.28: version "1.0.32" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" @@ -7072,11 +6698,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - promise-all-reject-late@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" @@ -7125,23 +6746,6 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -7157,18 +6761,13 @@ qrcode-terminal@^0.12.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== -qs@^6.11.2, qs@^6.4.0: +qs@^6.4.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" -querystring-es3@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -7179,21 +6778,6 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -7277,7 +6861,7 @@ read@^2.0.0, read@^2.1.0: dependencies: mute-stream "~1.0.0" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0, readable-stream@^3.6.2: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -7387,7 +6971,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.10.0, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: +resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -7420,14 +7004,6 @@ rimraf@^5.0.1: dependencies: glob "^10.3.7" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - rollup-plugin-inject@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz#e4233855bfba6c0c12a312fd6649dff9a13ee9f4" @@ -7480,7 +7056,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7610,19 +7186,11 @@ set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" -setimmediate@^1.0.4, setimmediate@^1.0.5: +setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -7847,14 +7415,6 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -stream-browserify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - stream-buffers@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-3.0.2.tgz#5249005a8d5c2d00b3a32e6e0a6ea209dc4f3521" @@ -7868,16 +7428,6 @@ stream-combiner2@~1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" -stream-http@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" - integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.4" - readable-stream "^3.6.0" - xtend "^4.0.2" - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -7931,7 +7481,7 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -8130,13 +7680,6 @@ through@2, "through@>=2.2.7 <3": resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - tiny-relative-date@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" @@ -8244,11 +7787,6 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tty-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" - integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== - tuf-js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" @@ -8475,30 +8013,11 @@ url-join@^5.0.0: resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA== -url@^0.11.0: - version "0.11.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" - integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== - dependencies: - punycode "^1.4.1" - qs "^6.11.2" - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.4, util@^0.12.5: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - uzip-module@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/uzip-module/-/uzip-module-1.0.3.tgz#6bbabe2a3efea5d5a4a47479f523a571de3427ce" @@ -8533,11 +8052,6 @@ validate-npm-package-name@^5.0.0: dependencies: builtins "^5.0.0" -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - walk-up-path@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" @@ -8560,10 +8074,10 @@ warp-arbundles@^1.0.4: buffer "^6.0.3" warp-isomorphic "^1.0.7" -warp-contracts@^1.4.34: - version "1.4.36" - resolved "https://registry.yarnpkg.com/warp-contracts/-/warp-contracts-1.4.36.tgz#dfdb69a34e314b2be5cb2ea8e51078a064c2fcff" - integrity sha512-2UeRxkry/wm0jme4d4CXvxUef+G3o3Al6Q2Tj2PQ5cvvK5GOfRfFiooaQIik88E6ZQNC9NJlvFUYBMVS9837CA== +warp-contracts@1.4.29: + version "1.4.29" + resolved "https://registry.yarnpkg.com/warp-contracts/-/warp-contracts-1.4.29.tgz#fbab7b64ad055f7245229d9bfab992161fda2f33" + integrity sha512-cwNgKmKl5vMd5ptLeyPqMug5IPCyQIJZMalQ7FBFZjLMC7atlMcNYDKgaBHi14vXjtTtw1g+V6BRETwQhqCfzA== dependencies: archiver "^5.3.0" arweave "1.13.7" @@ -8638,7 +8152,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.14, which-typed-array@^1.1.2: +which-typed-array@^1.1.14: version "1.1.14" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== @@ -8740,7 +8254,7 @@ write-file-atomic@^5.0.0, write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -xtend@^4.0.2, xtend@~4.0.1: +xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==