diff --git a/.eslintrc.js b/.eslintrc.js index 1f88f2a..b401893 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,35 +1,36 @@ module.exports = { - "env": { - "browser": true, - "es2021": true + env: { + browser: true, + es2021: true, + }, + extends: 'standard-with-typescript', + overrides: [ + { + env: { + node: true, + }, + files: ['.eslintrc.{js,cjs}'], + parserOptions: { + sourceType: 'script', + }, }, - "extends": "standard-with-typescript", - "overrides": [ - { - "env": { - "node": true - }, - "files": [ - ".eslintrc.{js,cjs}" - ], - "parserOptions": { - "sourceType": "script" - } - } - ], - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "ignorePatterns": ["**/dist/**"], - "rules": { - "@typescript-eslint/strict-boolean-expressions": 0, - "@typescript-eslint/comma-dangle": 0, - "@typescript-eslint/dot-notation": 0, - "@typescript-eslint/indent": 0, - "@typescript-eslint/consistent-type-definitions": 0, - "@typescript-eslint/non-nullable-type-assertion-style": 0, - "no-useless-catch": 0, - "new-cap": 0, - } -} + ], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + ignorePatterns: ['**/dist/**'], + rules: { + '@typescript-eslint/strict-boolean-expressions': 0, + '@typescript-eslint/comma-dangle': 0, + '@typescript-eslint/dot-notation': 0, + '@typescript-eslint/indent': 0, + '@typescript-eslint/consistent-type-definitions': 0, + '@typescript-eslint/non-nullable-type-assertion-style': 0, + '@typescript-eslint/semi': 'off', + '@typescript-eslint/space-before-function-paren': 'off', + '@typescript-eslint/member-delimiter-style': 'off', + 'no-useless-catch': 0, + 'new-cap': 0, + }, +}; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d00835f..1078d02 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,9 @@ jobs: - name: Check eslint rules run: yarn run lint-ci + - name: Prettier + run: npm run prettier-ci + - name: Build SDK run: yarn run build diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..d24fdfc --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..bc794bb --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "arrowParens": "avoid" + } + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 02fcfc8..159de39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,6 @@ All notable changes to this project will be documented in this file. Dates are displayed in UTC. -#### [v1.0.17](https://github.com/ObolNetwork/obol-sdk/compare/v1.0.16...v1.0.17) - -- revert back to using git changelog [`#46`](https://github.com/ObolNetwork/obol-sdk/pull/46) -- Hanan/ta nd c [`#44`](https://github.com/ObolNetwork/obol-sdk/pull/44) - #### [v1.0.16](https://github.com/ObolNetwork/obol-sdk/compare/v1.0.15...v1.0.16) > 24 May 2024 diff --git a/README.md b/README.md index 968a60b..a4a8d90 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ -![Obol Logo](https://obol.tech/obolnetwork.png) +![Obol Logo](https://obol.org/obolnetwork.png)

Obol SDK

-This repo contains the Obol Software Development Kit, for creating Distributed Validators with the help of the [Obol API](https://docs.obol.tech/api). +This repo contains the Obol Software Development Kit, for creating Distributed Validators with the help of the [Obol API](https://docs.obol.org/api). ## Getting Started -Checkout our [docs](https://docs.obol.tech/docs/advanced/quickstart-sdk), [examples](https://github.com/ObolNetwork/obol-sdk-examples/), and SDK [reference](https://obolnetwork.github.io/obol-sdk). Further guides and walkthroughs coming soon. +Checkout our [docs](https://docs.obol.org/docs/advanced/quickstart-sdk), [examples](https://github.com/ObolNetwork/obol-sdk-examples/), and SDK [reference](https://obolnetwork.github.io/obol-sdk). Further guides and walkthroughs coming soon. ## Terms and Conditions -To use obol-sdk and in order to be able to create a cluster definition or accept an invite to join a cluster, you must accept the [latest Obol terms and conditions](https://obol.tech/terms.pdf) by calling acceptObolLatestTermsAndConditions. +To use obol-sdk and in order to be able to create a cluster definition or accept an invite to join a cluster, you must accept the [latest Obol terms and conditions](https://obol.org/terms.pdf) by calling acceptObolLatestTermsAndConditions. ## Contributing diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 0000000..33560ab --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,7 @@ +module.exports = { + // This will lint and format TypeScript + '**/*.(ts|tsx)': filenames => [ + `npx eslint --fix ${filenames.join(' ')}`, + `npx prettier --write ${filenames.join(' ')}`, + ], + } diff --git a/package.json b/package.json index fd56209..3c8f843 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "name": "@obolnetwork/obol-sdk", - "version": "1.0.17", + "version": "1.0.16", "description": "A package for creating Distributed Validators using the Obol API.", "bugs": { "url": "https://github.com/obolnetwork/obol-sdk/issues" }, - "homepage": "https://docs.obol.tech/", + "homepage": "https://docs.obol.org/", "keywords": [ "Obol", "Distributed Validators", @@ -20,13 +20,15 @@ "npm:publish": "npm publish --tag latest", "release": "release-it", "release:dry": "release-it --dry-run --no-npm", - "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "lint-ci": "eslint \"{src,apps,libs,test}/**/*.ts\"" + "lint": "eslint \"{src,test}/**/*.{js,ts}\" --fix", + "lint-ci": "eslint \"{src,test}/**/*.{js,ts}\"", + "prettier-ci": "prettier --check \"{src,test}/**/*.{js,ts}\"", + "prettier": "prettier --write \"{src,test}/**/*.{js,ts}\"" }, "main": "./dist/cjs/src/index.js", "module": "./dist/esm/src/index.js", "typings": "./dist/types/src/index.d.ts", - "author": "Obol Labs (https://obol.tech)", + "author": "Obol Labs (https://obol.org)", "repository": { "type": "git", "url": "git+https://github.com/obolnetwork/obol-sdk.git" @@ -65,15 +67,18 @@ "@types/semver": "^7.5.8", "@types/uuid": "^9.0.1", "eslint": "^8.57.0", + "husky": "^9.0.11", "jest": "^28.1.3", + "lint-staged": "^15.2.2", "msw": "^2.2.1", "npm-run-all": "^4.1.5", + "prettier": "^3.2.5", "release-it": "^17.2.1", "ts-jest": "^28.0.8", "tsup": "^6.7.0", "typedoc": "^0.25.7", "typedoc-plugin-markdown": "^4.0.0-next.50", - "typescript": "^5.3.3" + "typescript": "~5.3.3" }, "engines": { "node": ">= 16" diff --git a/src/ajv.ts b/src/ajv.ts index 693b83e..c02d511 100644 --- a/src/ajv.ts +++ b/src/ajv.ts @@ -1,16 +1,47 @@ -import Ajv, { type ErrorObject } from 'ajv' +import Ajv, { type ErrorObject } from 'ajv'; +import { parseUnits } from 'ethers'; -export function validatePayload ( +function validDepositAmounts(data: boolean, deposits: string[]): boolean { + let sum = 0; + // from ether togwei is same as from gwei to wei + const maxDeposit = Number(parseUnits('32', 'gwei')); + const minDeposit = Number(parseUnits('1', 'gwei')); + + for (const element of deposits) { + const amountInGWei = Number(element); + + if ( + !Number.isInteger(amountInGWei) || + amountInGWei > maxDeposit || + amountInGWei < minDeposit + ) { + return false; + } + sum += amountInGWei; + } + if (sum / minDeposit !== 32) { + return false; + } else { + return true; + } +} + +export function validatePayload( data: any, schema: any, ): ErrorObject[] | undefined | null | boolean { - const ajv = new Ajv() - const validate = ajv.compile(schema) - const isValid = validate(data) + const ajv = new Ajv(); + ajv.addKeyword({ + keyword: 'validDepositAmounts', + validate: validDepositAmounts, + errors: true, + }); + const validate = ajv.compile(schema); + const isValid = validate(data); if (!isValid) { throw new Error( `Schema compilation errors', ${validate.errors?.[0].message}`, - ) + ); } - return isValid + return isValid; } diff --git a/src/base.ts b/src/base.ts index ef5bfc3..b203473 100644 --- a/src/base.ts +++ b/src/base.ts @@ -1,31 +1,35 @@ // src/resources/base.ts -import { DEFAULT_BASE_URL, DEFAULT_CHAIN_ID, SDK_VERSION } from './constants.js' -import { FORK_MAPPING } from './types.js' +import { + DEFAULT_BASE_URL, + DEFAULT_CHAIN_ID, + SDK_VERSION, +} from './constants.js'; +import { FORK_MAPPING } from './types.js'; interface Config { - baseUrl?: string - chainId?: FORK_MAPPING + baseUrl?: string; + chainId?: FORK_MAPPING; } export abstract class Base { - baseUrl: string - chainId: number - fork_version: string + baseUrl: string; + chainId: number; + fork_version: string; - constructor ({ + constructor({ baseUrl = DEFAULT_BASE_URL, chainId = DEFAULT_CHAIN_ID, }: Config) { - this.baseUrl = baseUrl - this.chainId = chainId - this.fork_version = FORK_MAPPING[this.chainId] + this.baseUrl = baseUrl; + this.chainId = chainId; + this.fork_version = FORK_MAPPING[this.chainId]; } protected async request( endpoint: string, options?: RequestInit, ): Promise { - const url = `${this.baseUrl}${endpoint}` + const url = `${this.baseUrl}${endpoint}`; const config = { ...options, headers: { @@ -33,18 +37,18 @@ export abstract class Base { 'User-Agent': `Obol-SDK/${SDK_VERSION}`, ...options?.headers, }, - } + }; try { - const response = await fetch(url, config) + const response = await fetch(url, config); if (response.ok) { - return await response.json() + return await response.json(); } else { - const errorResponse = await response.json() - throw errorResponse + const errorResponse = await response.json(); + throw errorResponse; } } catch (e: any) { - throw e + throw e; } } } diff --git a/src/constants.ts b/src/constants.ts index aca2ad6..1d561d4 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,61 +1,61 @@ -import { type TypedMessage } from '@metamask/eth-sig-util' -import { type TypedDataDomain } from 'ethers' -import * as pjson from '../package.json' +import { type TypedMessage } from '@metamask/eth-sig-util'; +import { type TypedDataDomain } from 'ethers'; +import * as pjson from '../package.json'; -export const CONFLICT_ERROR_MSG = 'Conflict' +export const CONFLICT_ERROR_MSG = 'Conflict'; -export const EIP712_DOMAIN_NAME = 'Obol' -export const EIP712_DOMAIN_VERSION = '1' +export const EIP712_DOMAIN_NAME = 'Obol'; +export const EIP712_DOMAIN_VERSION = '1'; export const CreatorConfigHashSigningTypes = { CreatorConfigHash: [{ name: 'creator_config_hash', type: 'string' }], -} +}; export const TermsAndConditionsSigningTypes = { TermsAndConditions: [ { name: 'terms_and_conditions_hash', type: 'string' }, { name: 'version', type: 'uint256' }, - ] -} + ], +}; const EIP712Domain = [ { name: 'name', type: 'string' }, { name: 'version', type: 'string' }, { name: 'chainId', type: 'uint256' }, -] +]; export const Domain = (chainId?: number): TypedDataDomain => { const typeDataDomain: any = { name: EIP712_DOMAIN_NAME, version: EIP712_DOMAIN_VERSION, - } + }; if (chainId) { - typeDataDomain.chainId = chainId + typeDataDomain.chainId = chainId; } - return typeDataDomain -} + return typeDataDomain; +}; export const CreatorTypedMessage = { EIP712Domain, ...CreatorConfigHashSigningTypes, -} +}; // A conflict once updateDefinition is merged export const EnrSigningTypes = { ENR: [{ name: 'enr', type: 'string' }], -} +}; export const OperatorConfigHashSigningTypes = { OperatorConfigHash: [{ name: 'operator_config_hash', type: 'string' }], -} +}; export const OperatorTypedMessage = { EIP712Domain, ...OperatorConfigHashSigningTypes, -} +}; export const ENRTypedMessage = { EIP712Domain, ...EnrSigningTypes, -} +}; export const signCreatorConfigHashPayload = ( payload: { creator_config_hash: string }, @@ -70,8 +70,8 @@ export const signCreatorConfigHashPayload = ( chainId, }, message: payload, - } -} + }; +}; export const signOperatorConfigHashPayload = ( payload: { operator_config_hash: string }, @@ -86,8 +86,8 @@ export const signOperatorConfigHashPayload = ( chainId, }, message: payload, - } -} + }; +}; export const signEnrPayload = ( payload: { enr: string }, @@ -102,19 +102,19 @@ export const signEnrPayload = ( chainId, }, message: payload, - } -} + }; +}; -export const DKG_ALGORITHM = 'default' +export const DKG_ALGORITHM = 'default'; -export const CONFIG_VERSION = 'v1.7.0' +export const CONFIG_VERSION = 'v1.8.0'; -export const SDK_VERSION = pjson.version +export const SDK_VERSION = pjson.version; -export const DOMAIN_APPLICATION_BUILDER = '00000001' -export const DOMAIN_DEPOSIT = '03000000' +export const DOMAIN_APPLICATION_BUILDER = '00000001'; +export const DOMAIN_DEPOSIT = '03000000'; export const GENESIS_VALIDATOR_ROOT = - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000'; // Flow used to create definition export enum DefinitionFlow { @@ -123,10 +123,16 @@ export enum DefinitionFlow { Charon = 'Charon-Command', } -export const DEFAULT_BASE_URL = 'https://api.obol.tech' -export const DEFAULT_CHAIN_ID = 17000 +export const DEFAULT_BASE_URL = 'https://api.obol.tech'; +export const DEFAULT_BASE_VERSION = 'v1'; +export const DEFAULT_CHAIN_ID = 17000; -export const ETHER_TO_GWEI = 10 ** 9 +export const ETHER_TO_GWEI = 10 ** 9; -export const TERMS_AND_CONDITIONS_VERSION = 1 -export const TERMS_AND_CONDITIONS_URL = (TERMS_AND_CONDITIONS_VERSION === 1) ? 'https://obol.tech/terms.pdf' : `https://obol.tech/${TERMS_AND_CONDITIONS_VERSION as number}/terms.pdf` +export const TERMS_AND_CONDITIONS_VERSION = 1; +export const TERMS_AND_CONDITIONS_URL = + TERMS_AND_CONDITIONS_VERSION === 1 + ? 'https://obol.org/terms.pdf' + : `https://obol.org/${TERMS_AND_CONDITIONS_VERSION as number}/terms.pdf`; +export const TERMS_AND_CONDITIONS_HASH = + '0xd33721644e8f3afab1495a74abe3523cec12d48b8da6cb760972492ca3f1a273'; diff --git a/src/errors.ts b/src/errors.ts index f7683bf..a6b0f22 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -1,8 +1,8 @@ export class ConflictError extends Error { - name = 'ConflictError' + name = 'ConflictError'; - constructor () { - super('This Cluster has been already posted.') - Object.setPrototypeOf(this, ConflictError.prototype) + constructor() { + super('This Cluster has been already posted.'); + Object.setPrototypeOf(this, ConflictError.prototype); } } diff --git a/src/index.ts b/src/index.ts index 6556700..4fe4cb0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ -import { type Signer } from 'ethers' -import { v4 as uuidv4 } from 'uuid' -import { Base } from './base.js' +import { type Signer } from 'ethers'; +import { v4 as uuidv4 } from 'uuid'; +import { Base } from './base.js'; import { CONFLICT_ERROR_MSG, CreatorConfigHashSigningTypes, @@ -11,26 +11,27 @@ import { EnrSigningTypes, TERMS_AND_CONDITIONS_VERSION, TermsAndConditionsSigningTypes, -} from './constants.js' -import { ConflictError } from './errors.js' + DEFAULT_BASE_VERSION, + TERMS_AND_CONDITIONS_HASH, +} from './constants.js'; +import { ConflictError } from './errors.js'; import { type ClusterDefinition, type ClusterLock, type ClusterPayload, type OperatorPayload, -} from './types.js' -import { clusterConfigOrDefinitionHash } from './verification/common.js' -import { validatePayload } from './ajv.js' -import { definitionSchema, operatorPayloadSchema } from './schema.js' -import { hashTermsAndConditions } from './verification/termsAndConditions.js' -export * from './types.js' -export * from './services.js' +} from './types.js'; +import { clusterConfigOrDefinitionHash } from './verification/common.js'; +import { validatePayload } from './ajv.js'; +import { definitionSchema, operatorPayloadSchema } from './schema.js'; +export * from './types.js'; +export * from './services.js'; /** * Obol sdk Client can be used for creating, managing and activating distributed validators. */ export class Client extends Base { - private readonly signer: Signer | undefined + private readonly signer: Signer | undefined; /** * @param config - Client configurations @@ -42,12 +43,9 @@ export class Client extends Base { * An example of how to instantiate obol-sdk Client: * [obolClient](https://github.com/ObolNetwork/obol-sdk-examples/blob/main/TS-Example/index.ts#L29) */ - constructor ( - config: { baseUrl?: string, chainId?: number }, - signer?: Signer, - ) { - super(config) - this.signer = signer + constructor(config: { baseUrl?: string; chainId?: number }, signer?: Signer) { + super(config); + this.signer = signer; } /** @@ -58,17 +56,19 @@ export class Client extends Base { * An example of how to use acceptObolLatestTermsAndConditions: * [acceptObolLatestTermsAndConditions](https://github.com/ObolNetwork/obol-sdk-examples/blob/main/TS-Example/index.ts#L44) */ - async acceptObolLatestTermsAndConditions (): Promise { - if (!this.signer) { throw new Error('Signer is required in acceptObolTermsAndConditions') } + async acceptObolLatestTermsAndConditions(): Promise { + if (!this.signer) { + throw new Error('Signer is required in acceptObolTermsAndConditions'); + } try { - const termsAndConditionsHash = await hashTermsAndConditions() - const address = await this.signer.getAddress() + const termsAndConditionsHash = TERMS_AND_CONDITIONS_HASH; + const address = await this.signer.getAddress(); const termsAndConditionsPayload = { address, version: TERMS_AND_CONDITIONS_VERSION, - terms_and_conditions_hash: termsAndConditionsHash - } + terms_and_conditions_hash: termsAndConditionsHash, + }; const termsAndConditionsSignature = await this.signer.signTypedData( Domain(), @@ -77,21 +77,22 @@ export class Client extends Base { terms_and_conditions_hash: termsAndConditionsHash, version: TERMS_AND_CONDITIONS_VERSION, }, - ) + ); - const termsAndConditionsResponse: { message: string, success: boolean } = await this.request('/termsAndConditions', { - method: 'POST', - body: JSON.stringify(termsAndConditionsPayload), - headers: { - Authorization: `Bearer ${termsAndConditionsSignature}`, - }, - }) - return termsAndConditionsResponse?.message + const termsAndConditionsResponse: { message: string; success: boolean } = + await this.request(`/${DEFAULT_BASE_VERSION}/termsAndConditions`, { + method: 'POST', + body: JSON.stringify(termsAndConditionsPayload), + headers: { + Authorization: `Bearer ${termsAndConditionsSignature}`, + }, + }); + return termsAndConditionsResponse?.message; } catch (err: any) { if (err?.message === CONFLICT_ERROR_MSG) { - throw new ConflictError() + throw new ConflictError(); } - throw err + throw err; } } @@ -104,10 +105,12 @@ export class Client extends Base { * An example of how to use createClusterDefinition: * [createObolCluster](https://github.com/ObolNetwork/obol-sdk-examples/blob/main/TS-Example/index.ts#L59) */ - async createClusterDefinition (newCluster: ClusterPayload): Promise { - if (!this.signer) { throw new Error('Signer is required in createClusterDefinition') } + async createClusterDefinition(newCluster: ClusterPayload): Promise { + if (!this.signer) { + throw new Error('Signer is required in createClusterDefinition'); + } - validatePayload(newCluster, definitionSchema) + validatePayload(newCluster, definitionSchema); const clusterConfig: Partial = { ...newCluster, @@ -118,37 +121,42 @@ export class Client extends Base { timestamp: new Date().toISOString(), threshold: Math.ceil((2 * newCluster.operators.length) / 3), num_validators: newCluster.validators.length, - } - + deposit_amounts: newCluster.deposit_amounts + ? newCluster.deposit_amounts + : ['32000000000'], + }; try { - const address = await this.signer.getAddress() + const address = await this.signer.getAddress(); - clusterConfig.creator = { address } + clusterConfig.creator = { address }; clusterConfig.config_hash = clusterConfigOrDefinitionHash( clusterConfig as ClusterDefinition, true, - ) + ); const creatorConfigSignature = await this.signer.signTypedData( Domain(this.chainId), CreatorConfigHashSigningTypes, { creator_config_hash: clusterConfig.config_hash }, - ) - - const clusterDefinition: ClusterDefinition = await this.request('/v1/definition', { - method: 'POST', - body: JSON.stringify(clusterConfig), - headers: { - Authorization: `Bearer ${creatorConfigSignature}`, - 'fork-version': this.fork_version, + ); + + const clusterDefinition: ClusterDefinition = await this.request( + `/${DEFAULT_BASE_VERSION}/definition`, + { + method: 'POST', + body: JSON.stringify(clusterConfig), + headers: { + Authorization: `Bearer ${creatorConfigSignature}`, + 'fork-version': this.fork_version, + }, }, - }) - return clusterDefinition?.config_hash + ); + return clusterDefinition?.config_hash; } catch (err: any) { if (err?.message === CONFLICT_ERROR_MSG) { - throw new ConflictError() + throw new ConflictError(); } - throw err + throw err; } } @@ -162,36 +170,38 @@ export class Client extends Base { * An example of how to use acceptClusterDefinition: * [acceptClusterDefinition](https://github.com/ObolNetwork/obol-sdk-examples/blob/main/TS-Example/index.ts#L106) */ - async acceptClusterDefinition ( + async acceptClusterDefinition( operatorPayload: OperatorPayload, configHash: string, ): Promise { - if (!this.signer) { throw new Error('Signer is required in acceptClusterDefinition') } + if (!this.signer) { + throw new Error('Signer is required in acceptClusterDefinition'); + } - validatePayload(operatorPayload, operatorPayloadSchema) + validatePayload(operatorPayload, operatorPayloadSchema); try { - const address = await this.signer.getAddress() + const address = await this.signer.getAddress(); const operatorConfigSignature = await this.signer.signTypedData( Domain(this.chainId), OperatorConfigHashSigningTypes, { operator_config_hash: configHash }, - ) + ); const operatorENRSignature = await this.signer.signTypedData( Domain(this.chainId), EnrSigningTypes, { enr: operatorPayload.enr }, - ) + ); const operatorData: OperatorPayload = { ...operatorPayload, address, enr_signature: operatorENRSignature, fork_version: this.fork_version, - } + }; const clusterDefinition: ClusterDefinition = await this.request( - `/v1/definition/${configHash}`, + `/${DEFAULT_BASE_VERSION}/definition/${configHash}`, { method: 'PUT', body: JSON.stringify(operatorData), @@ -199,10 +209,10 @@ export class Client extends Base { Authorization: `Bearer ${operatorConfigSignature}`, }, }, - ) - return clusterDefinition + ); + return clusterDefinition; } catch (err: any) { - throw err + throw err; } } @@ -214,15 +224,15 @@ export class Client extends Base { * An example of how to use getClusterDefinition: * [getObolClusterDefinition](https://github.com/ObolNetwork/obol-sdk-examples/blob/main/TS-Example/index.ts#L74) */ - async getClusterDefinition (configHash: string): Promise { + async getClusterDefinition(configHash: string): Promise { const clusterDefinition: ClusterDefinition = await this.request( - `/dv/${configHash}`, + `/${DEFAULT_BASE_VERSION}/definition/${configHash}`, { method: 'GET', }, - ) + ); - return clusterDefinition + return clusterDefinition; } /** @@ -233,13 +243,13 @@ export class Client extends Base { * An example of how to use getClusterLock: * [getObolClusterLock](https://github.com/ObolNetwork/obol-sdk-examples/blob/main/TS-Example/index.ts#L89) */ - async getClusterLock (configHash: string): Promise { + async getClusterLock(configHash: string): Promise { const lock: ClusterLock = await this.request( - `/lock/configHash/${configHash}`, + `/${DEFAULT_BASE_VERSION}/lock/configHash/${configHash}`, { method: 'GET', }, - ) - return lock + ); + return lock; } } diff --git a/src/schema.ts b/src/schema.ts index d431816..9f6788f 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -9,7 +9,7 @@ export const operatorPayloadSchema = { }, }, required: ['version', 'enr'], -} +}; export const definitionSchema = { type: 'object', @@ -53,6 +53,14 @@ export const definitionSchema = { required: ['fee_recipient_address', 'withdrawal_address'], }, }, + deposit_amounts: { + type: 'array', + items: { + type: 'string', + pattern: '^[0-9]+$', + }, + validDepositAmounts: true, + }, }, required: ['name', 'operators', 'validators'], -} +}; diff --git a/src/services.ts b/src/services.ts index e29a0d4..52aa69b 100644 --- a/src/services.ts +++ b/src/services.ts @@ -1,5 +1,5 @@ -import { type ClusterLock } from './types.js' -import { isValidClusterLock } from './verification/common.js' +import { type ClusterLock } from './types.js'; +import { isValidClusterLock } from './verification/common.js'; /** * Verifies Cluster Lock's validity. @@ -14,9 +14,9 @@ export const validateClusterLock = async ( lock: ClusterLock, ): Promise => { try { - const isLockValid = await isValidClusterLock(lock) - return isLockValid + const isLockValid = await isValidClusterLock(lock); + return isLockValid; } catch (err: any) { - throw err + throw err; } -} +}; diff --git a/src/types.ts b/src/types.ts index 3a0cddf..ef68d71 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,104 +20,104 @@ export enum FORK_MAPPING { */ export type ClusterOperator = { /** The operator address. */ - address: string + address: string; /** The operator ethereum node record. */ - enr?: string + enr?: string; /** The cluster fork_version. */ - fork_version?: string + fork_version?: string; /** The cluster version. */ - version?: string + version?: string; /** The operator enr signature. */ - enr_signature?: string + enr_signature?: string; /** The operator configuration signature. */ - config_signature?: string -} + config_signature?: string; +}; /** * A partial view of `ClusterOperator` with `enr` and `version` as required properties. */ export type OperatorPayload = Partial & - Required> + Required>; /** * Cluster creator data */ export type ClusterCreator = { /** The creator address. */ - address: string + address: string; /** The cluster configuration signature. */ - config_signature?: string -} + config_signature?: string; +}; /** * Validator withdrawal configuration */ export type ClusterValidator = { /** The validator fee recipient address. */ - fee_recipient_address: string + fee_recipient_address: string; /** The validator reward address. */ - withdrawal_address: string -} + withdrawal_address: string; +}; /** * Cluster configuration */ export type ClusterPayload = { /** The cluster name. */ - name: string + name: string; /** The cluster nodes operators addresses. */ - operators: ClusterOperator[] + operators: ClusterOperator[]; /** The cluster validators information. */ - validators: ClusterValidator[] + validators: ClusterValidator[]; /** The cluster partial deposits in gwei or 32000000000. */ - deposit_amounts?: string[] -} + deposit_amounts?: string[]; +}; /** * Cluster definition data needed for dkg */ export interface ClusterDefinition extends ClusterPayload { /** The creator of the cluster. */ - creator: ClusterCreator + creator: ClusterCreator; /** The cluster configuration version. */ - version: string + version: string; /** The cluster dkg algorithm. */ - dkg_algorithm: string + dkg_algorithm: string; /** The cluster fork version. */ - fork_version: string + fork_version: string; /** The cluster uuid. */ - uuid: string + uuid: string; /** The cluster creation timestamp. */ - timestamp: string + timestamp: string; /** The cluster configuration hash. */ - config_hash: string + config_hash: string; /** The distributed validator threshold. */ - threshold: number + threshold: number; /** The number of distributed validators in the cluster. */ - num_validators: number + num_validators: number; /** The cluster partial deposits in gwei or 32000000000. */ - deposit_amounts?: string[] + deposit_amounts?: string[]; /** The hash of the cluster definition. */ - definition_hash?: string + definition_hash?: string; } /** @@ -125,85 +125,85 @@ export interface ClusterDefinition extends ClusterPayload { */ export type BuilderRegistrationMessage = { /** The DV fee recipient. */ - fee_recipient: string + fee_recipient: string; /** Default is 30000000. */ - gas_limit: number + gas_limit: number; /** Timestamp when generating cluster lock file. */ - timestamp: number + timestamp: number; /** The public key of the DV. */ - pubkey: string -} + pubkey: string; +}; /** * Pre-generated Signed Validator Builder Registration */ export type BuilderRegistration = { /** Builder registration message. */ - message: BuilderRegistrationMessage + message: BuilderRegistrationMessage; /** BLS signature of the builder registration message. */ - signature: string -} + signature: string; +}; /** * Required deposit data for validator activation */ export type DepositData = { /** The public key of the distributed validator. */ - pubkey: string + pubkey: string; /** The 0x01 withdrawal address of the DV. */ - withdrawal_credentials: string + withdrawal_credentials: string; /** 32 ethers. */ - amount: string + amount: string; /** A checksum for DepositData fields . */ - deposit_data_root: string + deposit_data_root: string; /** BLS signature of the deposit message. */ - signature: string -} + signature: string; +}; /** * Required deposit data for validator activation */ export type DistributedValidator = { /** The public key of the distributed validator. */ - distributed_public_key: string + distributed_public_key: string; /** The public key of the node distributed validator share. */ - public_shares: string[] + public_shares: string[]; /** The deposit data for activating the DV. */ - deposit_data?: Partial + deposit_data?: Partial; /** The deposit data with partial amounts or full amount for activating the DV. */ - partial_deposit_data?: Array> + partial_deposit_data?: Array>; /** pre-generated signed validator builder registration to be sent to builder network. */ - builder_registration?: BuilderRegistration -} + builder_registration?: BuilderRegistration; +}; /** * Cluster Details after DKG is complete */ export type ClusterLock = { /** The cluster definition. */ - cluster_definition: ClusterDefinition + cluster_definition: ClusterDefinition; /** The cluster distributed validators. */ - distributed_validators: DistributedValidator[] + distributed_validators: DistributedValidator[]; /** The cluster bls signature aggregate. */ - signature_aggregate: string + signature_aggregate: string; /** The hash of the cluster lock. */ - lock_hash: string + lock_hash: string; /** Node Signature for the lock hash by the node secp256k1 key. */ - node_signatures?: string[] -} + node_signatures?: string[]; +}; diff --git a/src/utils.ts b/src/utils.ts index 82b43ae..736f822 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,13 +1,13 @@ -import { DefinitionFlow } from './constants' -import { type ClusterDefinition } from './types' +import { DefinitionFlow } from './constants'; +import { type ClusterDefinition } from './types'; export const hexWithout0x = (hex: string): string => { - return hex.slice(2, hex.length) -} + return hex.slice(2, hex.length); +}; export const strToUint8Array = (str: string): Uint8Array => { - return new TextEncoder().encode(str) -} + return new TextEncoder().encode(str); +}; export const definitionFlow = ( clusterDefinition: ClusterDefinition, @@ -15,42 +15,42 @@ export const definitionFlow = ( if ( clusterDefinition.creator.address && clusterDefinition.creator.config_signature && - clusterDefinition.operators.every((operator) => { + clusterDefinition.operators.every(operator => { return ( operator.address && operator.config_signature && operator.enr && operator.enr_signature - ) + ); }) ) { - return DefinitionFlow.Group + return DefinitionFlow.Group; } else if ( clusterDefinition.creator.address && clusterDefinition.creator.config_signature && - clusterDefinition.operators.every((operator) => { + clusterDefinition.operators.every(operator => { return ( !operator.address && !operator.config_signature && operator.enr && !operator.enr_signature - ) + ); }) ) { - return DefinitionFlow.Solo + return DefinitionFlow.Solo; } else if ( !clusterDefinition.creator.address && !clusterDefinition.creator.config_signature && - clusterDefinition.operators.every((operator) => { + clusterDefinition.operators.every(operator => { return ( !operator.address && !operator.config_signature && operator.enr && !operator.enr_signature - ) + ); }) ) { - return DefinitionFlow.Charon + return DefinitionFlow.Charon; } - return null -} + return null; +}; diff --git a/src/verification/common.ts b/src/verification/common.ts index cf527fc..16bc631 100644 --- a/src/verification/common.ts +++ b/src/verification/common.ts @@ -1,22 +1,53 @@ +import { fromHexString } from '@chainsafe/ssz'; +import elliptic from 'elliptic'; +import { init } from '@chainsafe/bls'; + +import { + FORK_MAPPING, + type ClusterDefinition, + type ClusterLock, + type DepositData, + type BuilderRegistrationMessage, + type DistributedValidator, +} from '../types.js'; +import * as semver from 'semver'; +import { + clusterDefinitionContainerTypeV1X6, + hashClusterDefinitionV1X6, + hashClusterLockV1X6, + verifyDVV1X6, +} from './v1.6.0.js'; import { - fromHexString, -} from '@chainsafe/ssz' -import elliptic from 'elliptic' + clusterDefinitionContainerTypeV1X7, + hashClusterDefinitionV1X7, + hashClusterLockV1X7, + verifyDVV1X7, +} from './v1.7.0.js'; +import { ethers } from 'ethers'; import { - init, -} from '@chainsafe/bls' - -import { FORK_MAPPING, type ClusterDefinition, type ClusterLock, type DepositData, type BuilderRegistrationMessage, type DistributedValidator } from '../types.js' -import * as semver from 'semver' -import { clusterDefinitionContainerTypeV1X6, hashClusterDefinitionV1X6, hashClusterLockV1X6, verifyDVV1X6 } from './v1.6.0.js' -import { clusterDefinitionContainerTypeV1X7, hashClusterDefinitionV1X7, hashClusterLockV1X7, verifyDVV1X7 } from './v1.7.0.js' -import { ethers } from 'ethers' -import { DOMAIN_APPLICATION_BUILDER, DOMAIN_DEPOSIT, DefinitionFlow, GENESIS_VALIDATOR_ROOT, signCreatorConfigHashPayload, signEnrPayload, signOperatorConfigHashPayload } from '../constants.js' -import { SignTypedDataVersion, TypedDataUtils } from '@metamask/eth-sig-util' -import { builderRegistrationMessageType, depositMessageType, forkDataType, signingRootType } from './sszTypes.js' -import { definitionFlow, hexWithout0x } from '../utils.js' -import { ENR } from '@chainsafe/discv5' -import { clusterDefinitionContainerTypeV1X8, hashClusterDefinitionV1X8, hashClusterLockV1X8, verifyDVV1X8 } from './v1.8.0.js' + DOMAIN_APPLICATION_BUILDER, + DOMAIN_DEPOSIT, + DefinitionFlow, + GENESIS_VALIDATOR_ROOT, + signCreatorConfigHashPayload, + signEnrPayload, + signOperatorConfigHashPayload, +} from '../constants.js'; +import { SignTypedDataVersion, TypedDataUtils } from '@metamask/eth-sig-util'; +import { + builderRegistrationMessageType, + depositMessageType, + forkDataType, + signingRootType, +} from './sszTypes.js'; +import { definitionFlow, hexWithout0x } from '../utils.js'; +import { ENR } from '@chainsafe/discv5'; +import { + clusterDefinitionContainerTypeV1X8, + hashClusterDefinitionV1X8, + hashClusterLockV1X8, + verifyDVV1X8, +} from './v1.8.0.js'; // cluster-definition hash @@ -26,37 +57,40 @@ import { clusterDefinitionContainerTypeV1X8, hashClusterDefinitionV1X8, hashClus * @returns The config hash or the definition hash in of the corresponding cluster */ export const clusterConfigOrDefinitionHash = ( - cluster: ClusterDefinition, - configOnly: boolean, + cluster: ClusterDefinition, + configOnly: boolean, ): string => { - let definitionType, val - - if (semver.eq(cluster.version, 'v1.6.0')) { - definitionType = clusterDefinitionContainerTypeV1X6(configOnly) - val = hashClusterDefinitionV1X6(cluster, configOnly) - return ( - '0x' + Buffer.from(definitionType.hashTreeRoot(val).buffer).toString('hex') - ) - } - - if (semver.eq(cluster.version, 'v1.7.0')) { - definitionType = clusterDefinitionContainerTypeV1X7(configOnly) - val = hashClusterDefinitionV1X7(cluster, configOnly) - return ( - '0x' + Buffer.from(definitionType.hashTreeRoot(val).buffer).toString('hex') - ) - } - - if (semver.eq(cluster.version, 'v1.8.0')) { - definitionType = clusterDefinitionContainerTypeV1X8(configOnly) - val = hashClusterDefinitionV1X8(cluster, configOnly) - return ( - '0x' + Buffer.from(definitionType.hashTreeRoot(val).buffer).toString('hex') - ) - } - - throw new Error('unsupported version') -} + let definitionType, val; + + if (semver.eq(cluster.version, 'v1.6.0')) { + definitionType = clusterDefinitionContainerTypeV1X6(configOnly); + val = hashClusterDefinitionV1X6(cluster, configOnly); + return ( + '0x' + + Buffer.from(definitionType.hashTreeRoot(val).buffer).toString('hex') + ); + } + + if (semver.eq(cluster.version, 'v1.7.0')) { + definitionType = clusterDefinitionContainerTypeV1X7(configOnly); + val = hashClusterDefinitionV1X7(cluster, configOnly); + return ( + '0x' + + Buffer.from(definitionType.hashTreeRoot(val).buffer).toString('hex') + ); + } + + if (semver.eq(cluster.version, 'v1.8.0')) { + definitionType = clusterDefinitionContainerTypeV1X8(configOnly); + val = hashClusterDefinitionV1X8(cluster, configOnly); + return ( + '0x' + + Buffer.from(definitionType.hashTreeRoot(val).buffer).toString('hex') + ); + } + + throw new Error('unsupported version'); +}; // cluster-lock hash @@ -66,191 +100,193 @@ export const clusterConfigOrDefinitionHash = ( * @returns The cluster lock hash in of the corresponding cluster lock */ export const clusterLockHash = (clusterLock: ClusterLock): string => { - if (semver.eq(clusterLock.cluster_definition.version, 'v1.6.0')) { - return hashClusterLockV1X6(clusterLock) - } + if (semver.eq(clusterLock.cluster_definition.version, 'v1.6.0')) { + return hashClusterLockV1X6(clusterLock); + } - if (semver.eq(clusterLock.cluster_definition.version, 'v1.7.0')) { - return hashClusterLockV1X7(clusterLock) - } + if (semver.eq(clusterLock.cluster_definition.version, 'v1.7.0')) { + return hashClusterLockV1X7(clusterLock); + } - if (semver.eq(clusterLock.cluster_definition.version, 'v1.8.0')) { - return hashClusterLockV1X8(clusterLock) - } + if (semver.eq(clusterLock.cluster_definition.version, 'v1.8.0')) { + return hashClusterLockV1X8(clusterLock); + } - // other versions - throw new Error('unsupported version') -} + // other versions + throw new Error('unsupported version'); +}; // Lock verification // cluster-definition signatures verification const getPOSTConfigHashSigner = ( - signature: string, - configHash: string, - chainId: FORK_MAPPING, + signature: string, + configHash: string, + chainId: FORK_MAPPING, ): string => { - try { - const sig = ethers.Signature.from(signature) - const data = signCreatorConfigHashPayload( - { creator_config_hash: configHash }, - chainId, - ) - const digest = TypedDataUtils.eip712Hash(data, SignTypedDataVersion.V4) - - return ethers.recoverAddress(digest, sig).toLowerCase() - } catch (err) { - throw err - } -} + try { + const sig = ethers.Signature.from(signature); + const data = signCreatorConfigHashPayload( + { creator_config_hash: configHash }, + chainId, + ); + const digest = TypedDataUtils.eip712Hash(data, SignTypedDataVersion.V4); + + return ethers.recoverAddress(digest, sig).toLowerCase(); + } catch (err) { + throw err; + } +}; const getPUTConfigHashSigner = ( - signature: string, - configHash: string, - chainId: number, + signature: string, + configHash: string, + chainId: number, ): string => { - try { - const sig = ethers.Signature.from(signature) - const data = signOperatorConfigHashPayload( - { operator_config_hash: configHash }, - chainId, - ) - const digest = TypedDataUtils.eip712Hash(data, SignTypedDataVersion.V4) - - return ethers.recoverAddress(digest, sig).toLowerCase() - } catch (err) { - throw err - } -} + try { + const sig = ethers.Signature.from(signature); + const data = signOperatorConfigHashPayload( + { operator_config_hash: configHash }, + chainId, + ); + const digest = TypedDataUtils.eip712Hash(data, SignTypedDataVersion.V4); + + return ethers.recoverAddress(digest, sig).toLowerCase(); + } catch (err) { + throw err; + } +}; const getEnrSigner = ( - signature: string, - payload: string, - chainId: number, + signature: string, + payload: string, + chainId: number, ): string => { - try { - const sig = ethers.Signature.from(signature) + try { + const sig = ethers.Signature.from(signature); - const data = signEnrPayload({ enr: payload }, chainId) - const digest = TypedDataUtils.eip712Hash(data, SignTypedDataVersion.V4) + const data = signEnrPayload({ enr: payload }, chainId); + const digest = TypedDataUtils.eip712Hash(data, SignTypedDataVersion.V4); - return ethers.recoverAddress(digest, sig).toLowerCase() - } catch (err) { - throw err - } -} + return ethers.recoverAddress(digest, sig).toLowerCase(); + } catch (err) { + throw err; + } +}; const verifyDefinitionSignatures = ( - clusterDefinition: ClusterDefinition, - definitionType: DefinitionFlow, + clusterDefinition: ClusterDefinition, + definitionType: DefinitionFlow, ): boolean => { - if (definitionType === DefinitionFlow.Charon) { - return true - } else { - const configSigner = getPOSTConfigHashSigner( - clusterDefinition.creator.config_signature as string, - clusterDefinition.config_hash, - FORK_MAPPING[clusterDefinition.fork_version as keyof typeof FORK_MAPPING], - ) - - if (configSigner !== clusterDefinition.creator.address.toLowerCase()) { - return false - } - if (definitionType === DefinitionFlow.Solo) { - return true - } - return clusterDefinition.operators.every((operator) => { - const configSigner = getPUTConfigHashSigner( - operator.config_signature as string, - clusterDefinition.config_hash, - FORK_MAPPING[ - clusterDefinition.fork_version as keyof typeof FORK_MAPPING - ], - ) - - const enrSigner = getEnrSigner( - operator.enr_signature as string, - operator.enr as string, - FORK_MAPPING[ - clusterDefinition.fork_version as keyof typeof FORK_MAPPING - ], - ) - - if ( - configSigner !== operator.address.toLowerCase() || - enrSigner !== operator.address.toLowerCase() - ) { - return false - } - return true - }) + if (definitionType === DefinitionFlow.Charon) { + return true; + } else { + const configSigner = getPOSTConfigHashSigner( + clusterDefinition.creator.config_signature as string, + clusterDefinition.config_hash, + FORK_MAPPING[clusterDefinition.fork_version as keyof typeof FORK_MAPPING], + ); + + if (configSigner !== clusterDefinition.creator.address.toLowerCase()) { + return false; + } + if (definitionType === DefinitionFlow.Solo) { + return true; } -} + return clusterDefinition.operators.every(operator => { + const configSigner = getPUTConfigHashSigner( + operator.config_signature as string, + clusterDefinition.config_hash, + FORK_MAPPING[ + clusterDefinition.fork_version as keyof typeof FORK_MAPPING + ], + ); + + const enrSigner = getEnrSigner( + operator.enr_signature as string, + operator.enr as string, + FORK_MAPPING[ + clusterDefinition.fork_version as keyof typeof FORK_MAPPING + ], + ); + + if ( + configSigner !== operator.address.toLowerCase() || + enrSigner !== operator.address.toLowerCase() + ) { + return false; + } + return true; + }); + } +}; // cluster-lock data verification const computeSigningRoot = ( - sszObjectRoot: Uint8Array, - domain: Uint8Array, + sszObjectRoot: Uint8Array, + domain: Uint8Array, ): Uint8Array => { - const signingRootDefaultValue = signingRootType.defaultValue() - signingRootDefaultValue.objectRoot = sszObjectRoot - signingRootDefaultValue.domain = domain - return Buffer.from(signingRootType.hashTreeRoot(signingRootDefaultValue).buffer) -} + const signingRootDefaultValue = signingRootType.defaultValue(); + signingRootDefaultValue.objectRoot = sszObjectRoot; + signingRootDefaultValue.domain = domain; + return Buffer.from( + signingRootType.hashTreeRoot(signingRootDefaultValue).buffer, + ); +}; const computeDepositMsgRoot = (msg: Partial): Buffer => { - const depositMsgVal = depositMessageType.defaultValue() + const depositMsgVal = depositMessageType.defaultValue(); - depositMsgVal.pubkey = fromHexString(msg.pubkey as string) - depositMsgVal.withdrawal_credentials = fromHexString( - msg.withdrawal_credentials as string, - ) - depositMsgVal.amount = parseInt(msg.amount as string) - return Buffer.from(depositMessageType.hashTreeRoot(depositMsgVal).buffer) -} + depositMsgVal.pubkey = fromHexString(msg.pubkey as string); + depositMsgVal.withdrawal_credentials = fromHexString( + msg.withdrawal_credentials as string, + ); + depositMsgVal.amount = parseInt(msg.amount as string); + return Buffer.from(depositMessageType.hashTreeRoot(depositMsgVal).buffer); +}; const computeForkDataRoot = ( - currentVersion: Uint8Array, - genesisValidatorsRoot: Uint8Array, + currentVersion: Uint8Array, + genesisValidatorsRoot: Uint8Array, ): Uint8Array => { - const forkDataVal = forkDataType.defaultValue() - forkDataVal.currentVersion = currentVersion - forkDataVal.genesisValidatorsRoot = genesisValidatorsRoot - return Buffer.from(forkDataType.hashTreeRoot(forkDataVal).buffer) -} + const forkDataVal = forkDataType.defaultValue(); + forkDataVal.currentVersion = currentVersion; + forkDataVal.genesisValidatorsRoot = genesisValidatorsRoot; + return Buffer.from(forkDataType.hashTreeRoot(forkDataVal).buffer); +}; const computebuilderRegistrationMsgRoot = ( - msg: BuilderRegistrationMessage, + msg: BuilderRegistrationMessage, ): Buffer => { - const builderRegistrationMsgVal = - builderRegistrationMessageType.defaultValue() - - builderRegistrationMsgVal.fee_recipient = fromHexString(msg.fee_recipient) - builderRegistrationMsgVal.gas_limit = msg.gas_limit - builderRegistrationMsgVal.timestamp = msg.timestamp - builderRegistrationMsgVal.pubkey = fromHexString(msg.pubkey) - return Buffer.from( - builderRegistrationMessageType.hashTreeRoot(builderRegistrationMsgVal) - .buffer, - ) -} + const builderRegistrationMsgVal = + builderRegistrationMessageType.defaultValue(); + + builderRegistrationMsgVal.fee_recipient = fromHexString(msg.fee_recipient); + builderRegistrationMsgVal.gas_limit = msg.gas_limit; + builderRegistrationMsgVal.timestamp = msg.timestamp; + builderRegistrationMsgVal.pubkey = fromHexString(msg.pubkey); + return Buffer.from( + builderRegistrationMessageType.hashTreeRoot(builderRegistrationMsgVal) + .buffer, + ); +}; const computeDomain = ( - domainType: Uint8Array, - lockForkVersion: string, - genesisValidatorsRoot: Uint8Array = fromHexString(GENESIS_VALIDATOR_ROOT), + domainType: Uint8Array, + lockForkVersion: string, + genesisValidatorsRoot: Uint8Array = fromHexString(GENESIS_VALIDATOR_ROOT), ): Uint8Array => { - const forkVersion = fromHexString( - lockForkVersion.substring(2, lockForkVersion.length), - ) + const forkVersion = fromHexString( + lockForkVersion.substring(2, lockForkVersion.length), + ); - const forkDataRoot = computeForkDataRoot(forkVersion, genesisValidatorsRoot) - const domain = new Uint8Array(32) - domain.set(domainType) - domain.set(forkDataRoot.subarray(0, 28), 4) - return domain -} + const forkDataRoot = computeForkDataRoot(forkVersion, genesisValidatorsRoot); + const domain = new Uint8Array(32); + domain.set(domainType); + domain.set(forkDataRoot.subarray(0, 28), 4); + return domain; +}; /** * Verify deposit data withdrawal credintials and signature @@ -260,161 +296,166 @@ const computeDomain = ( * @returns {boolean} - return if deposit data is valid. */ export const verifyDepositData = ( - distributedPublicKey: string, - depositData: Partial, - withdrawalAddress: string, - forkVersion: string, -): { isValidDepositData: boolean, depositDataMsg: Uint8Array } => { - const depositDomain = computeDomain( - fromHexString(DOMAIN_DEPOSIT), - forkVersion, - ) - const eth1AddressWithdrawalPrefix = '0x01' - if ( - eth1AddressWithdrawalPrefix + - '0'.repeat(22) + - withdrawalAddress.toLowerCase().slice(2) !== - depositData.withdrawal_credentials - ) { - return { isValidDepositData: false, depositDataMsg: new Uint8Array(0) } - } - - if (distributedPublicKey !== depositData.pubkey) { - return { isValidDepositData: false, depositDataMsg: new Uint8Array(0) } - } - - const depositMessageBuffer = computeDepositMsgRoot( - depositData - ) - const depositDataMessage = signingRoot( - depositDomain, - depositMessageBuffer, - ) - - return { isValidDepositData: true, depositDataMsg: depositDataMessage } -} + distributedPublicKey: string, + depositData: Partial, + withdrawalAddress: string, + forkVersion: string, +): { isValidDepositData: boolean; depositDataMsg: Uint8Array } => { + const depositDomain = computeDomain( + fromHexString(DOMAIN_DEPOSIT), + forkVersion, + ); + const eth1AddressWithdrawalPrefix = '0x01'; + if ( + eth1AddressWithdrawalPrefix + + '0'.repeat(22) + + withdrawalAddress.toLowerCase().slice(2) !== + depositData.withdrawal_credentials + ) { + return { isValidDepositData: false, depositDataMsg: new Uint8Array(0) }; + } + + if (distributedPublicKey !== depositData.pubkey) { + return { isValidDepositData: false, depositDataMsg: new Uint8Array(0) }; + } + + const depositMessageBuffer = computeDepositMsgRoot(depositData); + const depositDataMessage = signingRoot(depositDomain, depositMessageBuffer); + + return { isValidDepositData: true, depositDataMsg: depositDataMessage }; +}; export const verifyBuilderRegistration = ( - validator: DistributedValidator, - feeRecipientAddress: string, - forkVersion: string, -): { isValidBuilderRegistration: boolean, builderRegistrationMsg: Uint8Array } => { - const builderDomain = computeDomain( - fromHexString(DOMAIN_APPLICATION_BUILDER), - forkVersion) - - if ( - validator.distributed_public_key !== - validator.builder_registration?.message.pubkey - ) { - return { isValidBuilderRegistration: false, builderRegistrationMsg: new Uint8Array(0) } - } - if ( - feeRecipientAddress.toLowerCase() !== - validator.builder_registration.message.fee_recipient.toLowerCase() - ) { - return { isValidBuilderRegistration: false, builderRegistrationMsg: new Uint8Array(0) } - } - - const builderRegistrationMessageBuffer = - computebuilderRegistrationMsgRoot( - validator.builder_registration.message, - ) - - const builderRegistrationMessage = signingRoot( - builderDomain, - builderRegistrationMessageBuffer, - ) - - return { isValidBuilderRegistration: true, builderRegistrationMsg: builderRegistrationMessage } -} + validator: DistributedValidator, + feeRecipientAddress: string, + forkVersion: string, +): { + isValidBuilderRegistration: boolean; + builderRegistrationMsg: Uint8Array; +} => { + const builderDomain = computeDomain( + fromHexString(DOMAIN_APPLICATION_BUILDER), + forkVersion, + ); + + if ( + validator.distributed_public_key !== + validator.builder_registration?.message.pubkey + ) { + return { + isValidBuilderRegistration: false, + builderRegistrationMsg: new Uint8Array(0), + }; + } + if ( + feeRecipientAddress.toLowerCase() !== + validator.builder_registration.message.fee_recipient.toLowerCase() + ) { + return { + isValidBuilderRegistration: false, + builderRegistrationMsg: new Uint8Array(0), + }; + } + + const builderRegistrationMessageBuffer = computebuilderRegistrationMsgRoot( + validator.builder_registration.message, + ); + + const builderRegistrationMessage = signingRoot( + builderDomain, + builderRegistrationMessageBuffer, + ); + + return { + isValidBuilderRegistration: true, + builderRegistrationMsg: builderRegistrationMessage, + }; +}; export const verifyNodeSignatures = (clusterLock: ClusterLock): boolean => { - const ec = new elliptic.ec('secp256k1') - const nodeSignatures = clusterLock.node_signatures - - const lockHashWithout0x = hexWithout0x(clusterLock.lock_hash) - // node(ENR) signatures - for (let i = 0; i < (nodeSignatures as string[]).length; i++) { - const pubkey = ENR.decodeTxt( - clusterLock.cluster_definition.operators[i].enr as string, - ).publicKey.toString('hex') - - const ENRsignature = { - r: (nodeSignatures as string[])[i].slice(2, 66), - s: (nodeSignatures as string[])[i].slice(66, 130), - } - - const nodeSignatureVerification = ec - .keyFromPublic(pubkey, 'hex') - .verify(lockHashWithout0x, ENRsignature) - - if (!nodeSignatureVerification) { - return false - } + const ec = new elliptic.ec('secp256k1'); + const nodeSignatures = clusterLock.node_signatures; + + const lockHashWithout0x = hexWithout0x(clusterLock.lock_hash); + // node(ENR) signatures + for (let i = 0; i < (nodeSignatures as string[]).length; i++) { + const pubkey = ENR.decodeTxt( + clusterLock.cluster_definition.operators[i].enr as string, + ).publicKey.toString('hex'); + + const ENRsignature = { + r: (nodeSignatures as string[])[i].slice(2, 66), + s: (nodeSignatures as string[])[i].slice(66, 130), + }; + + const nodeSignatureVerification = ec + .keyFromPublic(pubkey, 'hex') + .verify(lockHashWithout0x, ENRsignature); + + if (!nodeSignatureVerification) { + return false; } + } - return true -} + return true; +}; export const signingRoot = ( - domain: Uint8Array, - messageBuffer: Buffer, + domain: Uint8Array, + messageBuffer: Buffer, ): Uint8Array => { - return computeSigningRoot(messageBuffer, domain) -} + return computeSigningRoot(messageBuffer, domain); +}; const verifyLockData = async (clusterLock: ClusterLock): Promise => { - await init('herumi') + await init('herumi'); - if (semver.eq(clusterLock.cluster_definition.version, 'v1.6.0')) { - return verifyDVV1X6(clusterLock) - } + if (semver.eq(clusterLock.cluster_definition.version, 'v1.6.0')) { + return verifyDVV1X6(clusterLock); + } - if (semver.eq(clusterLock.cluster_definition.version, 'v1.7.0')) { - return verifyDVV1X7(clusterLock) - } + if (semver.eq(clusterLock.cluster_definition.version, 'v1.7.0')) { + return verifyDVV1X7(clusterLock); + } - if (semver.eq(clusterLock.cluster_definition.version, 'v1.8.0')) { - return verifyDVV1X8(clusterLock) - } - return false -} + if (semver.eq(clusterLock.cluster_definition.version, 'v1.8.0')) { + return verifyDVV1X8(clusterLock); + } + return false; +}; export const isValidClusterLock = async ( - clusterLock: ClusterLock, + clusterLock: ClusterLock, ): Promise => { - try { - const definitionType = definitionFlow(clusterLock.cluster_definition) - if (definitionType == null) { - return false - } - - const isValidDefinitionData = verifyDefinitionSignatures( - clusterLock.cluster_definition, - definitionType, - ) - if (!isValidDefinitionData) { - return false - } - - if ( - clusterConfigOrDefinitionHash(clusterLock.cluster_definition, false) !== - clusterLock.cluster_definition.definition_hash - ) { - return false - } - - if (clusterLockHash(clusterLock) !== clusterLock.lock_hash) { - return false - } - - const isValidLockData = await verifyLockData(clusterLock) - if (!isValidLockData) { - return false - } - return true - } catch (err) { - return false + try { + const definitionType = definitionFlow(clusterLock.cluster_definition); + if (definitionType == null) { + return false; + } + const isValidDefinitionData = verifyDefinitionSignatures( + clusterLock.cluster_definition, + definitionType, + ); + if (!isValidDefinitionData) { + return false; + } + + if ( + clusterConfigOrDefinitionHash(clusterLock.cluster_definition, false) !== + clusterLock.cluster_definition.definition_hash + ) { + return false; + } + if (clusterLockHash(clusterLock) !== clusterLock.lock_hash) { + return false; + } + + const isValidLockData = await verifyLockData(clusterLock); + if (!isValidLockData) { + return false; } -} + return true; + } catch (err) { + return false; + } +}; diff --git a/src/verification/sszTypes.ts b/src/verification/sszTypes.ts index 05c9302..779a3e8 100644 --- a/src/verification/sszTypes.ts +++ b/src/verification/sszTypes.ts @@ -1,79 +1,88 @@ -import { ByteListType, ByteVectorType, ContainerType, UintNumberType } from '@chainsafe/ssz' -import { type UintNumberByteLen } from '@chainsafe/ssz/lib/type/uint' +import { + ByteListType, + ByteVectorType, + ContainerType, + UintNumberType, +} from '@chainsafe/ssz'; +import { type UintNumberByteLen } from '@chainsafe/ssz/lib/type/uint'; export const operatorAddressWrapperType = new ContainerType({ - address: new ByteVectorType(20), -}) + address: new ByteVectorType(20), +}); export const creatorAddressWrapperType = new ContainerType({ - address: new ByteVectorType(20), -}) + address: new ByteVectorType(20), +}); export const operatorContainerType = new ContainerType({ - address: new ByteVectorType(20), - enr: new ByteListType(1024), // This needs to be dynamic, since ENRs do not have a fixed length. - config_signature: new ByteVectorType(65), - enr_signature: new ByteVectorType(65), -}) + address: new ByteVectorType(20), + enr: new ByteListType(1024), // This needs to be dynamic, since ENRs do not have a fixed length. + config_signature: new ByteVectorType(65), + enr_signature: new ByteVectorType(65), +}); export const creatorContainerType = new ContainerType({ - address: new ByteVectorType(20), - config_signature: new ByteVectorType(65), -}) + address: new ByteVectorType(20), + config_signature: new ByteVectorType(65), +}); export const validatorsContainerType = new ContainerType({ - fee_recipient_address: new ByteVectorType(20), - withdrawal_address: new ByteVectorType(20), -}) + fee_recipient_address: new ByteVectorType(20), + withdrawal_address: new ByteVectorType(20), +}); -export const newCreatorContainerType = (configOnly: boolean): ContainerType => { - return configOnly ? creatorAddressWrapperType : creatorContainerType -} +export const newCreatorContainerType = ( + configOnly: boolean, +): ContainerType => { + return configOnly ? creatorAddressWrapperType : creatorContainerType; +}; -export const newOperatorContainerType = (configOnly: boolean): ContainerType => { - return configOnly ? operatorAddressWrapperType : operatorContainerType -} +export const newOperatorContainerType = ( + configOnly: boolean, +): ContainerType => { + return configOnly ? operatorAddressWrapperType : operatorContainerType; +}; // Lock export const depositDataContainer = new ContainerType({ - pubkey: new ByteVectorType(48), - withdrawal_credentials: new ByteVectorType(32), - amount: new UintNumberType(8 as UintNumberByteLen), - signature: new ByteVectorType(96), -}) + pubkey: new ByteVectorType(48), + withdrawal_credentials: new ByteVectorType(32), + amount: new UintNumberType(8 as UintNumberByteLen), + signature: new ByteVectorType(96), +}); export const builderRegistrationMessageContainer = new ContainerType({ - fee_recipient: new ByteVectorType(20), - gas_limit: new UintNumberType(8 as UintNumberByteLen), - timestamp: new UintNumberType(8 as UintNumberByteLen), - pubkey: new ByteVectorType(48), -}) + fee_recipient: new ByteVectorType(20), + gas_limit: new UintNumberType(8 as UintNumberByteLen), + timestamp: new UintNumberType(8 as UintNumberByteLen), + pubkey: new ByteVectorType(48), +}); export const builderRegistrationContainer = new ContainerType({ - message: builderRegistrationMessageContainer, - signature: new ByteVectorType(96), -}) + message: builderRegistrationMessageContainer, + signature: new ByteVectorType(96), +}); export const builderRegistrationMessageType = new ContainerType({ - fee_recipient: new ByteVectorType(20), - gas_limit: new UintNumberType(8 as UintNumberByteLen), - timestamp: new UintNumberType(8 as UintNumberByteLen), - pubkey: new ByteVectorType(48), -}) + fee_recipient: new ByteVectorType(20), + gas_limit: new UintNumberType(8 as UintNumberByteLen), + timestamp: new UintNumberType(8 as UintNumberByteLen), + pubkey: new ByteVectorType(48), +}); // For domain computation that is used in deposit data and builder registration verification for dv export const forkDataType = new ContainerType({ - currentVersion: new ByteVectorType(4), - genesisValidatorsRoot: new ByteVectorType(32), -}) + currentVersion: new ByteVectorType(4), + genesisValidatorsRoot: new ByteVectorType(32), +}); export const depositMessageType = new ContainerType({ - pubkey: new ByteVectorType(48), - withdrawal_credentials: new ByteVectorType(32), - amount: new UintNumberType(8), -}) + pubkey: new ByteVectorType(48), + withdrawal_credentials: new ByteVectorType(32), + amount: new UintNumberType(8), +}); export const signingRootType = new ContainerType({ - objectRoot: new ByteVectorType(32), - domain: new ByteVectorType(32), -}) + objectRoot: new ByteVectorType(32), + domain: new ByteVectorType(32), +}); diff --git a/src/verification/termsAndConditions.ts b/src/verification/termsAndConditions.ts index 6e60fe1..5e4cefd 100644 --- a/src/verification/termsAndConditions.ts +++ b/src/verification/termsAndConditions.ts @@ -1,30 +1,32 @@ -import pdf from 'pdf-parse' -import { ByteListType, ContainerType } from '@chainsafe/ssz' -import { TERMS_AND_CONDITIONS_URL } from '../constants' -import { strToUint8Array } from '../utils' +import pdf from 'pdf-parse'; +import { ByteListType, ContainerType } from '@chainsafe/ssz'; +import { TERMS_AND_CONDITIONS_URL } from '../constants'; +import { strToUint8Array } from '../utils'; export const hashTermsAndConditions = async (): Promise => { try { // read the pdf - const response = await fetch(TERMS_AND_CONDITIONS_URL) - const pdfBuffarrayBuffer = await response.arrayBuffer() - const pdfBuffer = Buffer.from(pdfBuffarrayBuffer) - const data = await pdf(pdfBuffer) + const response = await fetch(TERMS_AND_CONDITIONS_URL); + const pdfBuffarrayBuffer = await response.arrayBuffer(); + const pdfBuffer = Buffer.from(pdfBuffarrayBuffer); + const data = await pdf(pdfBuffer); // ssz hash const termsType = new ContainerType({ terms_and_conditions_hash: new ByteListType(Number.MAX_SAFE_INTEGER), - }) + }); - const termsHasVal = termsType.defaultValue() + const termsHasVal = termsType.defaultValue(); - termsHasVal.terms_and_conditions_hash = strToUint8Array(data?.text.replace(/[^a-zA-Z0-9]/g, '')) + termsHasVal.terms_and_conditions_hash = strToUint8Array( + data?.text.replace(/[^a-zA-Z0-9]/g, ''), + ); return ( '0x' + Buffer.from(termsType.hashTreeRoot(termsHasVal).buffer).toString('hex') - ) + ); } catch (err) { - return null + return null; } -} +}; diff --git a/src/verification/v1.6.0.ts b/src/verification/v1.6.0.ts index b521bab..9579d0d 100644 --- a/src/verification/v1.6.0.ts +++ b/src/verification/v1.6.0.ts @@ -1,32 +1,56 @@ -import { type UintNumberByteLen, UintNumberType } from '@chainsafe/ssz/lib/type/uint' -import { strToUint8Array } from '../utils' -import { type creatorAddressWrapperType, type creatorContainerType, newCreatorContainerType, newOperatorContainerType, type operatorAddressWrapperType, type operatorContainerType, validatorsContainerType } from './sszTypes' -import { ByteListType, ByteVectorType, ContainerType, ListCompositeType, fromHexString } from '@chainsafe/ssz' -import { type ValueOfFields } from '@chainsafe/ssz/lib/view/container' -import { type ClusterDefinition, type ClusterLock, type DepositData } from '../types' -import { verifyDepositData } from './common' -import { aggregateSignatures, verifyAggregate, verifyMultiple } from '@chainsafe/bls' +import { + type UintNumberByteLen, + UintNumberType, +} from '@chainsafe/ssz/lib/type/uint'; +import { strToUint8Array } from '../utils'; +import { + type creatorAddressWrapperType, + type creatorContainerType, + newCreatorContainerType, + newOperatorContainerType, + type operatorAddressWrapperType, + type operatorContainerType, + validatorsContainerType, +} from './sszTypes'; +import { + ByteListType, + ByteVectorType, + ContainerType, + ListCompositeType, + fromHexString, +} from '@chainsafe/ssz'; +import { type ValueOfFields } from '@chainsafe/ssz/lib/view/container'; +import { + type ClusterDefinition, + type ClusterLock, + type DepositData, +} from '../types'; +import { verifyDepositData } from './common'; +import { + aggregateSignatures, + verifyAggregate, + verifyMultiple, +} from '@chainsafe/bls'; // cluster definition type DefinitionFieldsV1X6 = { - uuid: ByteListType - name: ByteListType - version: ByteListType - timestamp: ByteListType - num_validators: UintNumberType - threshold: UintNumberType - dkg_algorithm: ByteListType - fork_version: ByteVectorType - operators: ListCompositeType< - typeof operatorContainerType | typeof operatorAddressWrapperType - > - creator: typeof creatorContainerType | typeof creatorAddressWrapperType - validators: ListCompositeType - config_hash?: ByteVectorType -} - -type DefinitionContainerTypeV1X6 = - ContainerType + uuid: ByteListType; + name: ByteListType; + version: ByteListType; + timestamp: ByteListType; + num_validators: UintNumberType; + threshold: UintNumberType; + dkg_algorithm: ByteListType; + fork_version: ByteVectorType; + operators: ListCompositeType< + typeof operatorContainerType | typeof operatorAddressWrapperType + >; + creator: typeof creatorContainerType | typeof creatorAddressWrapperType; + validators: ListCompositeType; + config_hash?: ByteVectorType; +}; + +type DefinitionContainerTypeV1X6 = ContainerType; /** * Returns the containerized cluster definition @@ -34,193 +58,199 @@ type DefinitionContainerTypeV1X6 = * @returns SSZ Containerized type of cluster input */ export const clusterDefinitionContainerTypeV1X6 = ( - configOnly: boolean, + configOnly: boolean, ): DefinitionContainerTypeV1X6 => { - let returnedContainerType: any = { - uuid: new ByteListType(64), - name: new ByteListType(256), - version: new ByteListType(16), - timestamp: new ByteListType(32), - num_validators: new UintNumberType(8 as UintNumberByteLen), - threshold: new UintNumberType(8 as UintNumberByteLen), - dkg_algorithm: new ByteListType(32), - fork_version: new ByteVectorType(4), - operators: new ListCompositeType(newOperatorContainerType(configOnly), 256), - creator: newCreatorContainerType(configOnly), - validators: new ListCompositeType(validatorsContainerType, 65536), - } + let returnedContainerType: any = { + uuid: new ByteListType(64), + name: new ByteListType(256), + version: new ByteListType(16), + timestamp: new ByteListType(32), + num_validators: new UintNumberType(8 as UintNumberByteLen), + threshold: new UintNumberType(8 as UintNumberByteLen), + dkg_algorithm: new ByteListType(32), + fork_version: new ByteVectorType(4), + operators: new ListCompositeType(newOperatorContainerType(configOnly), 256), + creator: newCreatorContainerType(configOnly), + validators: new ListCompositeType(validatorsContainerType, 65536), + }; - if (!configOnly) { - returnedContainerType = { - ...returnedContainerType, - config_hash: new ByteVectorType(32), - } - } + if (!configOnly) { + returnedContainerType = { + ...returnedContainerType, + config_hash: new ByteVectorType(32), + }; + } - return new ContainerType(returnedContainerType) -} + return new ContainerType(returnedContainerType); +}; export const hashClusterDefinitionV1X6 = ( - cluster: ClusterDefinition, - configOnly: boolean, + cluster: ClusterDefinition, + configOnly: boolean, ): ValueOfFields => { - const definitionType = clusterDefinitionContainerTypeV1X6(configOnly) - - const val = definitionType.defaultValue() - - // order should be same as charon https://github.com/ObolNetwork/charon/blob/main/cluster/ssz.go#L276 - val.uuid = strToUint8Array(cluster.uuid) - val.name = strToUint8Array(cluster.name) - val.version = strToUint8Array(cluster.version) - val.timestamp = strToUint8Array(cluster.timestamp) - val.num_validators = cluster.num_validators - val.threshold = cluster.threshold - val.dkg_algorithm = strToUint8Array(cluster.dkg_algorithm) - val.fork_version = fromHexString(cluster.fork_version) - val.operators = cluster.operators.map(operator => { - return configOnly - ? { address: fromHexString(operator.address) } - : { - address: fromHexString(operator.address), - enr: strToUint8Array(operator.enr as string), - config_signature: fromHexString(operator.config_signature as string), - enr_signature: fromHexString(operator.enr_signature as string), - } - }) - val.creator = configOnly - ? { address: fromHexString(cluster.creator.address) } - : { - address: fromHexString(cluster.creator.address), - config_signature: fromHexString(cluster.creator.config_signature as string), - } - val.validators = cluster.validators.map((validator) => { - return { - fee_recipient_address: fromHexString(validator.fee_recipient_address), - withdrawal_address: fromHexString(validator.withdrawal_address), - } - }) - - if (!configOnly) { - val.config_hash = fromHexString(cluster.config_hash) - } - return val -} + const definitionType = clusterDefinitionContainerTypeV1X6(configOnly); + + const val = definitionType.defaultValue(); + + // order should be same as charon https://github.com/ObolNetwork/charon/blob/main/cluster/ssz.go#L276 + val.uuid = strToUint8Array(cluster.uuid); + val.name = strToUint8Array(cluster.name); + val.version = strToUint8Array(cluster.version); + val.timestamp = strToUint8Array(cluster.timestamp); + val.num_validators = cluster.num_validators; + val.threshold = cluster.threshold; + val.dkg_algorithm = strToUint8Array(cluster.dkg_algorithm); + val.fork_version = fromHexString(cluster.fork_version); + val.operators = cluster.operators.map(operator => { + return configOnly + ? { address: fromHexString(operator.address) } + : { + address: fromHexString(operator.address), + enr: strToUint8Array(operator.enr as string), + config_signature: fromHexString(operator.config_signature as string), + enr_signature: fromHexString(operator.enr_signature as string), + }; + }); + val.creator = configOnly + ? { address: fromHexString(cluster.creator.address) } + : { + address: fromHexString(cluster.creator.address), + config_signature: fromHexString( + cluster.creator.config_signature as string, + ), + }; + val.validators = cluster.validators.map(validator => { + return { + fee_recipient_address: fromHexString(validator.fee_recipient_address), + withdrawal_address: fromHexString(validator.withdrawal_address), + }; + }); + + if (!configOnly) { + val.config_hash = fromHexString(cluster.config_hash); + } + return val; +}; // cluster lock const dvContainerTypeV1X6 = new ContainerType({ - distributed_public_key: new ByteVectorType(48), - public_shares: new ListCompositeType(new ByteVectorType(48), 256), - pubkey: new ByteVectorType(48), - withdrawal_credentials: new ByteVectorType(32), - amount: new UintNumberType(8 as UintNumberByteLen), - signature: new ByteVectorType(96), -}) + distributed_public_key: new ByteVectorType(48), + public_shares: new ListCompositeType(new ByteVectorType(48), 256), + pubkey: new ByteVectorType(48), + withdrawal_credentials: new ByteVectorType(32), + amount: new UintNumberType(8 as UintNumberByteLen), + signature: new ByteVectorType(96), +}); type LockContainerTypeV1X6 = ContainerType<{ - cluster_definition: DefinitionContainerTypeV1X6 - distributed_validators: ListCompositeType -}> + cluster_definition: DefinitionContainerTypeV1X6; + distributed_validators: ListCompositeType; +}>; /** * @returns SSZ Containerized type of cluster lock */ const clusterLockContainerTypeV1X6 = (): LockContainerTypeV1X6 => { - return new ContainerType({ - cluster_definition: clusterDefinitionContainerTypeV1X6(false), - distributed_validators: new ListCompositeType(dvContainerTypeV1X6, 65536), - }) -} + return new ContainerType({ + cluster_definition: clusterDefinitionContainerTypeV1X6(false), + distributed_validators: new ListCompositeType(dvContainerTypeV1X6, 65536), + }); +}; /** * @param cluster The published cluster lock * @returns The lock hash in of the corresponding cluster */ export const hashClusterLockV1X6 = (cluster: ClusterLock): string => { - const lockType = clusterLockContainerTypeV1X6() + const lockType = clusterLockContainerTypeV1X6(); - const val = lockType.defaultValue() + const val = lockType.defaultValue(); - // Check if we can replace with definition_hash - val.cluster_definition = hashClusterDefinitionV1X6( - cluster.cluster_definition, - false, - ) - val.distributed_validators = cluster.distributed_validators.map(dValidator => { - return { - distributed_public_key: fromHexString(dValidator.distributed_public_key), - public_shares: dValidator.public_shares.map(publicShare => - fromHexString(publicShare), - ), - pubkey: fromHexString(dValidator.deposit_data?.pubkey as string), - withdrawal_credentials: fromHexString( - dValidator.deposit_data?.withdrawal_credentials as string, - ), - amount: parseInt(dValidator.deposit_data?.amount as string), - signature: fromHexString(dValidator.deposit_data?.signature as string), - } - }) - - return '0x' + Buffer.from(lockType.hashTreeRoot(val).buffer).toString('hex') -} + // Check if we can replace with definition_hash + val.cluster_definition = hashClusterDefinitionV1X6( + cluster.cluster_definition, + false, + ); + val.distributed_validators = cluster.distributed_validators.map( + dValidator => { + return { + distributed_public_key: fromHexString( + dValidator.distributed_public_key, + ), + public_shares: dValidator.public_shares.map(publicShare => + fromHexString(publicShare), + ), + pubkey: fromHexString(dValidator.deposit_data?.pubkey as string), + withdrawal_credentials: fromHexString( + dValidator.deposit_data?.withdrawal_credentials as string, + ), + amount: parseInt(dValidator.deposit_data?.amount as string), + signature: fromHexString(dValidator.deposit_data?.signature as string), + }; + }, + ); + + return '0x' + Buffer.from(lockType.hashTreeRoot(val).buffer).toString('hex'); +}; // DV verification export const verifyDVV1X6 = (clusterLock: ClusterLock): boolean => { - const validators = clusterLock.distributed_validators - const pubShares = [] - const pubKeys = [] - const builderRegistrationAndDepositDataMessages = [] - const blsSignatures = [] - - for (let i = 0; i < validators.length; i++) { - const validator = validators[i] - const validatorPublicShares = validator.public_shares - const distributedPublicKey = validator.distributed_public_key - - // Needed in signature_aggregate verification - for (const element of validatorPublicShares) { - pubShares.push(fromHexString(element)) - } - - const { isValidDepositData, depositDataMsg } = verifyDepositData( - distributedPublicKey, - validator.deposit_data as Partial, - clusterLock.cluster_definition.validators[i].withdrawal_address, - clusterLock.cluster_definition.fork_version - ) - - if ( - !isValidDepositData - ) { - return false - } - - pubKeys.push(fromHexString(validator.distributed_public_key)) - builderRegistrationAndDepositDataMessages.push(depositDataMsg) - blsSignatures.push(fromHexString(validator.deposit_data?.signature as string)) - } + const validators = clusterLock.distributed_validators; + const pubShares = []; + const pubKeys = []; + const builderRegistrationAndDepositDataMessages = []; + const blsSignatures = []; - const aggregateBLSSignature = aggregateSignatures(blsSignatures) + for (let i = 0; i < validators.length; i++) { + const validator = validators[i]; + const validatorPublicShares = validator.public_shares; + const distributedPublicKey = validator.distributed_public_key; - if ( - !verifyMultiple( - pubKeys, - builderRegistrationAndDepositDataMessages, - aggregateBLSSignature, - ) - ) { - return false + // Needed in signature_aggregate verification + for (const element of validatorPublicShares) { + pubShares.push(fromHexString(element)); } - if ( - !verifyAggregate( - pubShares, - fromHexString(clusterLock.lock_hash), - fromHexString(clusterLock.signature_aggregate), - ) - ) { - return false + const { isValidDepositData, depositDataMsg } = verifyDepositData( + distributedPublicKey, + validator.deposit_data as Partial, + clusterLock.cluster_definition.validators[i].withdrawal_address, + clusterLock.cluster_definition.fork_version, + ); + + if (!isValidDepositData) { + return false; } - return true -} + pubKeys.push(fromHexString(validator.distributed_public_key)); + builderRegistrationAndDepositDataMessages.push(depositDataMsg); + blsSignatures.push( + fromHexString(validator.deposit_data?.signature as string), + ); + } + + const aggregateBLSSignature = aggregateSignatures(blsSignatures); + + if ( + !verifyMultiple( + pubKeys, + builderRegistrationAndDepositDataMessages, + aggregateBLSSignature, + ) + ) { + return false; + } + + if ( + !verifyAggregate( + pubShares, + fromHexString(clusterLock.lock_hash), + fromHexString(clusterLock.signature_aggregate), + ) + ) { + return false; + } + + return true; +}; diff --git a/src/verification/v1.7.0.ts b/src/verification/v1.7.0.ts index abc0746..2e524f7 100644 --- a/src/verification/v1.7.0.ts +++ b/src/verification/v1.7.0.ts @@ -1,32 +1,62 @@ -import { type UintNumberByteLen, UintNumberType } from '@chainsafe/ssz/lib/type/uint' -import { strToUint8Array } from '../utils' -import { builderRegistrationContainer, type creatorAddressWrapperType, type creatorContainerType, depositDataContainer, newCreatorContainerType, newOperatorContainerType, type operatorAddressWrapperType, type operatorContainerType, validatorsContainerType } from './sszTypes' -import { ByteListType, ByteVectorType, ContainerType, ListCompositeType, fromHexString } from '@chainsafe/ssz' -import { type ValueOfFields } from '@chainsafe/ssz/lib/view/container' -import { type ClusterDefinition, type ClusterLock, type DepositData } from '../types' -import { verifyBuilderRegistration, verifyDepositData, verifyNodeSignatures } from './common' -import { aggregateSignatures, verifyAggregate, verifyMultiple } from '@chainsafe/bls' +import { + type UintNumberByteLen, + UintNumberType, +} from '@chainsafe/ssz/lib/type/uint'; +import { strToUint8Array } from '../utils'; +import { + builderRegistrationContainer, + type creatorAddressWrapperType, + type creatorContainerType, + depositDataContainer, + newCreatorContainerType, + newOperatorContainerType, + type operatorAddressWrapperType, + type operatorContainerType, + validatorsContainerType, +} from './sszTypes'; +import { + ByteListType, + ByteVectorType, + ContainerType, + ListCompositeType, + fromHexString, +} from '@chainsafe/ssz'; +import { type ValueOfFields } from '@chainsafe/ssz/lib/view/container'; +import { + type ClusterDefinition, + type ClusterLock, + type DepositData, +} from '../types'; +import { + verifyBuilderRegistration, + verifyDepositData, + verifyNodeSignatures, +} from './common'; +import { + aggregateSignatures, + verifyAggregate, + verifyMultiple, +} from '@chainsafe/bls'; // cluster definition type DefinitionFieldsV1X7 = { - uuid: ByteListType - name: ByteListType - version: ByteListType - timestamp: ByteListType - num_validators: UintNumberType - threshold: UintNumberType - dkg_algorithm: ByteListType - fork_version: ByteVectorType - operators: ListCompositeType< - typeof operatorContainerType | typeof operatorAddressWrapperType - > - creator: typeof creatorContainerType | typeof creatorAddressWrapperType - validators: ListCompositeType - config_hash?: ByteVectorType -} - -type DefinitionContainerTypeV1X7 = - ContainerType + uuid: ByteListType; + name: ByteListType; + version: ByteListType; + timestamp: ByteListType; + num_validators: UintNumberType; + threshold: UintNumberType; + dkg_algorithm: ByteListType; + fork_version: ByteVectorType; + operators: ListCompositeType< + typeof operatorContainerType | typeof operatorAddressWrapperType + >; + creator: typeof creatorContainerType | typeof creatorAddressWrapperType; + validators: ListCompositeType; + config_hash?: ByteVectorType; +}; + +type DefinitionContainerTypeV1X7 = ContainerType; /** * Returns the containerized cluster definition @@ -34,241 +64,246 @@ type DefinitionContainerTypeV1X7 = * @returns SSZ Containerized type of cluster input */ export const clusterDefinitionContainerTypeV1X7 = ( - configOnly: boolean, + configOnly: boolean, ): DefinitionContainerTypeV1X7 => { - let returnedContainerType: any = { - uuid: new ByteListType(64), - name: new ByteListType(256), - version: new ByteListType(16), - timestamp: new ByteListType(32), - num_validators: new UintNumberType(8 as UintNumberByteLen), - threshold: new UintNumberType(8 as UintNumberByteLen), - dkg_algorithm: new ByteListType(32), - fork_version: new ByteVectorType(4), - operators: new ListCompositeType(newOperatorContainerType(configOnly), 256), - creator: newCreatorContainerType(configOnly), - validators: new ListCompositeType(validatorsContainerType, 65536), - } - - if (!configOnly) { - returnedContainerType = { - ...returnedContainerType, - config_hash: new ByteVectorType(32), - } - } - - return new ContainerType(returnedContainerType) -} + let returnedContainerType: any = { + uuid: new ByteListType(64), + name: new ByteListType(256), + version: new ByteListType(16), + timestamp: new ByteListType(32), + num_validators: new UintNumberType(8 as UintNumberByteLen), + threshold: new UintNumberType(8 as UintNumberByteLen), + dkg_algorithm: new ByteListType(32), + fork_version: new ByteVectorType(4), + operators: new ListCompositeType(newOperatorContainerType(configOnly), 256), + creator: newCreatorContainerType(configOnly), + validators: new ListCompositeType(validatorsContainerType, 65536), + }; + + if (!configOnly) { + returnedContainerType = { + ...returnedContainerType, + config_hash: new ByteVectorType(32), + }; + } + + return new ContainerType(returnedContainerType); +}; export const hashClusterDefinitionV1X7 = ( - cluster: ClusterDefinition, - configOnly: boolean, + cluster: ClusterDefinition, + configOnly: boolean, ): ValueOfFields => { - const definitionType = clusterDefinitionContainerTypeV1X7(configOnly) - - const val = definitionType.defaultValue() - - // order should be same as charon https://github.com/ObolNetwork/charon/blob/main/cluster/ssz.go#L276 - val.uuid = strToUint8Array(cluster.uuid) - val.name = strToUint8Array(cluster.name) - val.version = strToUint8Array(cluster.version) - val.timestamp = strToUint8Array(cluster.timestamp) - val.num_validators = cluster.num_validators - val.threshold = cluster.threshold - val.dkg_algorithm = strToUint8Array(cluster.dkg_algorithm) - val.fork_version = fromHexString(cluster.fork_version) - val.operators = cluster.operators.map(operator => { - return configOnly - ? { address: fromHexString(operator.address) } - : { - address: fromHexString(operator.address), - enr: strToUint8Array(operator.enr as string), - config_signature: fromHexString(operator.config_signature as string), - enr_signature: fromHexString(operator.enr_signature as string), - } - }) - val.creator = configOnly - ? { address: fromHexString(cluster.creator.address) } - : { - address: fromHexString(cluster.creator.address), - config_signature: fromHexString(cluster.creator.config_signature as string), - } - val.validators = cluster.validators.map((validator) => { - return { - fee_recipient_address: fromHexString(validator.fee_recipient_address), - withdrawal_address: fromHexString(validator.withdrawal_address), - } - }) - - if (!configOnly) { - val.config_hash = fromHexString(cluster.config_hash) - } - return val -} + const definitionType = clusterDefinitionContainerTypeV1X7(configOnly); + + const val = definitionType.defaultValue(); + + // order should be same as charon https://github.com/ObolNetwork/charon/blob/main/cluster/ssz.go#L276 + val.uuid = strToUint8Array(cluster.uuid); + val.name = strToUint8Array(cluster.name); + val.version = strToUint8Array(cluster.version); + val.timestamp = strToUint8Array(cluster.timestamp); + val.num_validators = cluster.num_validators; + val.threshold = cluster.threshold; + val.dkg_algorithm = strToUint8Array(cluster.dkg_algorithm); + val.fork_version = fromHexString(cluster.fork_version); + val.operators = cluster.operators.map(operator => { + return configOnly + ? { address: fromHexString(operator.address) } + : { + address: fromHexString(operator.address), + enr: strToUint8Array(operator.enr as string), + config_signature: fromHexString(operator.config_signature as string), + enr_signature: fromHexString(operator.enr_signature as string), + }; + }); + val.creator = configOnly + ? { address: fromHexString(cluster.creator.address) } + : { + address: fromHexString(cluster.creator.address), + config_signature: fromHexString( + cluster.creator.config_signature as string, + ), + }; + val.validators = cluster.validators.map(validator => { + return { + fee_recipient_address: fromHexString(validator.fee_recipient_address), + withdrawal_address: fromHexString(validator.withdrawal_address), + }; + }); + + if (!configOnly) { + val.config_hash = fromHexString(cluster.config_hash); + } + return val; +}; // cluster lock const dvContainerTypeV1X7 = new ContainerType({ - distributed_public_key: new ByteVectorType(48), - public_shares: new ListCompositeType(new ByteVectorType(48), 256), - deposit_data: depositDataContainer, - builder_registration: builderRegistrationContainer, -}) + distributed_public_key: new ByteVectorType(48), + public_shares: new ListCompositeType(new ByteVectorType(48), 256), + deposit_data: depositDataContainer, + builder_registration: builderRegistrationContainer, +}); type LockContainerTypeV1X7 = ContainerType<{ - cluster_definition: DefinitionContainerTypeV1X7 - distributed_validators: ListCompositeType -}> + cluster_definition: DefinitionContainerTypeV1X7; + distributed_validators: ListCompositeType; +}>; /** * @returns SSZ Containerized type of cluster lock */ const clusterLockContainerTypeV1X7 = (): LockContainerTypeV1X7 => { - return new ContainerType({ - cluster_definition: clusterDefinitionContainerTypeV1X7(false), - distributed_validators: new ListCompositeType(dvContainerTypeV1X7, 65536), - }) -} + return new ContainerType({ + cluster_definition: clusterDefinitionContainerTypeV1X7(false), + distributed_validators: new ListCompositeType(dvContainerTypeV1X7, 65536), + }); +}; /** * @param cluster The published cluster lock * @returns The lock hash in of the corresponding cluster */ export const hashClusterLockV1X7 = (cluster: ClusterLock): string => { - const lockType = clusterLockContainerTypeV1X7() - - const val = lockType.defaultValue() - - // Check if we can replace with definition_hash - val.cluster_definition = hashClusterDefinitionV1X7( - cluster.cluster_definition, - false, - ) - val.distributed_validators = cluster.distributed_validators.map( - (dValidator) => { - return { - distributed_public_key: fromHexString(dValidator.distributed_public_key), - public_shares: dValidator.public_shares.map((publicShare) => - fromHexString(publicShare), - ), - deposit_data: { - pubkey: fromHexString(dValidator.deposit_data?.pubkey as string), - withdrawal_credentials: fromHexString( - dValidator.deposit_data?.withdrawal_credentials as string, - ), - amount: parseInt(dValidator.deposit_data?.amount as string), - signature: fromHexString(dValidator.deposit_data?.signature as string), - }, - builder_registration: { - message: { - fee_recipient: fromHexString( - dValidator.builder_registration?.message.fee_recipient as string, - ), - gas_limit: dValidator.builder_registration?.message.gas_limit as number, - timestamp: dValidator.builder_registration?.message.timestamp as number, - pubkey: fromHexString( - dValidator.builder_registration?.message.pubkey as string, - ), - }, - signature: fromHexString(dValidator.builder_registration?.signature as string), - }, - } + const lockType = clusterLockContainerTypeV1X7(); + + const val = lockType.defaultValue(); + + // Check if we can replace with definition_hash + val.cluster_definition = hashClusterDefinitionV1X7( + cluster.cluster_definition, + false, + ); + val.distributed_validators = cluster.distributed_validators.map( + dValidator => { + return { + distributed_public_key: fromHexString( + dValidator.distributed_public_key, + ), + public_shares: dValidator.public_shares.map(publicShare => + fromHexString(publicShare), + ), + deposit_data: { + pubkey: fromHexString(dValidator.deposit_data?.pubkey as string), + withdrawal_credentials: fromHexString( + dValidator.deposit_data?.withdrawal_credentials as string, + ), + amount: parseInt(dValidator.deposit_data?.amount as string), + signature: fromHexString( + dValidator.deposit_data?.signature as string, + ), }, - ) + builder_registration: { + message: { + fee_recipient: fromHexString( + dValidator.builder_registration?.message.fee_recipient as string, + ), + gas_limit: dValidator.builder_registration?.message + .gas_limit as number, + timestamp: dValidator.builder_registration?.message + .timestamp as number, + pubkey: fromHexString( + dValidator.builder_registration?.message.pubkey as string, + ), + }, + signature: fromHexString( + dValidator.builder_registration?.signature as string, + ), + }, + }; + }, + ); - return '0x' + Buffer.from(lockType.hashTreeRoot(val).buffer).toString('hex') -} + return '0x' + Buffer.from(lockType.hashTreeRoot(val).buffer).toString('hex'); +}; // DV verification export const verifyDVV1X7 = (clusterLock: ClusterLock): boolean => { - const validators = clusterLock.distributed_validators - - const pubShares = [] - - const pubKeys = [] - const builderRegistrationAndDepositDataMessages = [] - const blsSignatures = [] - - for (let i = 0; i < validators.length; i++) { - const validator = validators[i] - const validatorPublicShares = validator.public_shares - const distributedPublicKey = validator.distributed_public_key - - // Needed in signature_aggregate verification - for (const element of validatorPublicShares) { - pubShares.push(fromHexString(element)) - } - - // Deposit Data Verification - const { isValidDepositData, depositDataMsg } = verifyDepositData( - distributedPublicKey, - validator.deposit_data as Partial, - clusterLock.cluster_definition.validators[i].withdrawal_address, - clusterLock.cluster_definition.fork_version - ) - - if ( - !isValidDepositData - ) { - return false - } - - pubKeys.push(fromHexString(distributedPublicKey)) - builderRegistrationAndDepositDataMessages.push(depositDataMsg) - blsSignatures.push(fromHexString(validator.deposit_data?.signature as string)) - - // Builder Registration Verification - const { isValidBuilderRegistration, builderRegistrationMsg } = verifyBuilderRegistration( - validator, - clusterLock.cluster_definition.validators[i].fee_recipient_address, - clusterLock.cluster_definition.fork_version - ) - - if ( - !isValidBuilderRegistration - ) { - return false - } - - pubKeys.push(fromHexString(distributedPublicKey)) - builderRegistrationAndDepositDataMessages.push(builderRegistrationMsg) - blsSignatures.push( - fromHexString(validator.builder_registration?.signature as string), - ) - } + const validators = clusterLock.distributed_validators; + + const pubShares = []; + + const pubKeys = []; + const builderRegistrationAndDepositDataMessages = []; + const blsSignatures = []; + + for (let i = 0; i < validators.length; i++) { + const validator = validators[i]; + const validatorPublicShares = validator.public_shares; + const distributedPublicKey = validator.distributed_public_key; - // BLS signatures verification - const aggregateBLSSignature = aggregateSignatures(blsSignatures) - - if ( - !verifyMultiple( - pubKeys, - builderRegistrationAndDepositDataMessages, - aggregateBLSSignature, - ) - ) { - return false + // Needed in signature_aggregate verification + for (const element of validatorPublicShares) { + pubShares.push(fromHexString(element)); } - // Node Signatures verification - if ( - !verifyNodeSignatures( - clusterLock - ) - ) { - return false + // Deposit Data Verification + const { isValidDepositData, depositDataMsg } = verifyDepositData( + distributedPublicKey, + validator.deposit_data as Partial, + clusterLock.cluster_definition.validators[i].withdrawal_address, + clusterLock.cluster_definition.fork_version, + ); + + if (!isValidDepositData) { + return false; } - // signature_aggregate verification - if ( - !verifyAggregate( - pubShares, - fromHexString(clusterLock.lock_hash), - fromHexString(clusterLock.signature_aggregate), - ) - ) { - return false + pubKeys.push(fromHexString(distributedPublicKey)); + builderRegistrationAndDepositDataMessages.push(depositDataMsg); + blsSignatures.push( + fromHexString(validator.deposit_data?.signature as string), + ); + + // Builder Registration Verification + const { isValidBuilderRegistration, builderRegistrationMsg } = + verifyBuilderRegistration( + validator, + clusterLock.cluster_definition.validators[i].fee_recipient_address, + clusterLock.cluster_definition.fork_version, + ); + + if (!isValidBuilderRegistration) { + return false; } - return true -} + pubKeys.push(fromHexString(distributedPublicKey)); + builderRegistrationAndDepositDataMessages.push(builderRegistrationMsg); + blsSignatures.push( + fromHexString(validator.builder_registration?.signature as string), + ); + } + + // BLS signatures verification + const aggregateBLSSignature = aggregateSignatures(blsSignatures); + + if ( + !verifyMultiple( + pubKeys, + builderRegistrationAndDepositDataMessages, + aggregateBLSSignature, + ) + ) { + return false; + } + + // Node Signatures verification + if (!verifyNodeSignatures(clusterLock)) { + return false; + } + + // signature_aggregate verification + if ( + !verifyAggregate( + pubShares, + fromHexString(clusterLock.lock_hash), + fromHexString(clusterLock.signature_aggregate), + ) + ) { + return false; + } + + return true; +}; diff --git a/src/verification/v1.8.0.ts b/src/verification/v1.8.0.ts index 64bffca..8fff5d4 100644 --- a/src/verification/v1.8.0.ts +++ b/src/verification/v1.8.0.ts @@ -1,32 +1,64 @@ -import { type UintNumberByteLen, UintNumberType } from '@chainsafe/ssz/lib/type/uint' -import { strToUint8Array } from '../utils' -import { builderRegistrationContainer, type creatorAddressWrapperType, type creatorContainerType, depositDataContainer, newCreatorContainerType, newOperatorContainerType, type operatorAddressWrapperType, type operatorContainerType, validatorsContainerType } from './sszTypes' -import { ByteListType, ByteVectorType, ContainerType, ListBasicType, ListCompositeType, fromHexString } from '@chainsafe/ssz' -import { type ValueOfFields } from '@chainsafe/ssz/lib/view/container' -import { type ClusterDefinition, type ClusterLock, type DepositData } from '../types' -import { verifyBuilderRegistration, verifyDepositData, verifyNodeSignatures } from './common' -import { aggregateSignatures, verifyAggregate, verifyMultiple } from '@chainsafe/bls' +import { + type UintNumberByteLen, + UintNumberType, +} from '@chainsafe/ssz/lib/type/uint'; +import { strToUint8Array } from '../utils'; +import { + builderRegistrationContainer, + type creatorAddressWrapperType, + type creatorContainerType, + depositDataContainer, + newCreatorContainerType, + newOperatorContainerType, + type operatorAddressWrapperType, + type operatorContainerType, + validatorsContainerType, +} from './sszTypes'; +import { + ByteListType, + ByteVectorType, + ContainerType, + ListBasicType, + ListCompositeType, + fromHexString, +} from '@chainsafe/ssz'; +import { type ValueOfFields } from '@chainsafe/ssz/lib/view/container'; +import { + type ClusterDefinition, + type ClusterLock, + type DepositData, +} from '../types'; +import { + verifyBuilderRegistration, + verifyDepositData, + verifyNodeSignatures, +} from './common'; +import { + aggregateSignatures, + verifyAggregate, + verifyMultiple, +} from '@chainsafe/bls'; // cluster definition type DefinitionFieldsV1X8 = { - uuid: ByteListType - name: ByteListType - version: ByteListType - timestamp: ByteListType - num_validators: UintNumberType - threshold: UintNumberType - dkg_algorithm: ByteListType - fork_version: ByteVectorType - operators: ListCompositeType< - typeof operatorContainerType | typeof operatorAddressWrapperType - > - creator: typeof creatorContainerType | typeof creatorAddressWrapperType - validators: ListCompositeType - deposit_amounts: ListBasicType - config_hash?: ByteVectorType -} + uuid: ByteListType; + name: ByteListType; + version: ByteListType; + timestamp: ByteListType; + num_validators: UintNumberType; + threshold: UintNumberType; + dkg_algorithm: ByteListType; + fork_version: ByteVectorType; + operators: ListCompositeType< + typeof operatorContainerType | typeof operatorAddressWrapperType + >; + creator: typeof creatorContainerType | typeof creatorAddressWrapperType; + validators: ListCompositeType; + deposit_amounts: ListBasicType; + config_hash?: ByteVectorType; +}; -type DefinitionContainerTypeV1X8 = ContainerType +type DefinitionContainerTypeV1X8 = ContainerType; /** * Returns the containerized cluster definition @@ -34,248 +66,257 @@ type DefinitionContainerTypeV1X8 = ContainerType * @returns SSZ Containerized type of cluster input */ export const clusterDefinitionContainerTypeV1X8 = ( - configOnly: boolean, + configOnly: boolean, ): DefinitionContainerTypeV1X8 => { - let returnedContainerType: any = { - uuid: new ByteListType(64), - name: new ByteListType(256), - version: new ByteListType(16), - timestamp: new ByteListType(32), - num_validators: new UintNumberType(8 as UintNumberByteLen), - threshold: new UintNumberType(8 as UintNumberByteLen), - dkg_algorithm: new ByteListType(32), - fork_version: new ByteVectorType(4), - operators: new ListCompositeType(newOperatorContainerType(configOnly), 256), - creator: newCreatorContainerType(configOnly), - validators: new ListCompositeType(validatorsContainerType, 65536), - deposit_amounts: new ListBasicType( - new UintNumberType(8 as UintNumberByteLen), - 256, - ), - } + let returnedContainerType: any = { + uuid: new ByteListType(64), + name: new ByteListType(256), + version: new ByteListType(16), + timestamp: new ByteListType(32), + num_validators: new UintNumberType(8 as UintNumberByteLen), + threshold: new UintNumberType(8 as UintNumberByteLen), + dkg_algorithm: new ByteListType(32), + fork_version: new ByteVectorType(4), + operators: new ListCompositeType(newOperatorContainerType(configOnly), 256), + creator: newCreatorContainerType(configOnly), + validators: new ListCompositeType(validatorsContainerType, 65536), + deposit_amounts: new ListBasicType( + new UintNumberType(8 as UintNumberByteLen), + 256, + ), + }; - if (!configOnly) { - returnedContainerType = { - ...returnedContainerType, - config_hash: new ByteVectorType(32), - } - } + if (!configOnly) { + returnedContainerType = { + ...returnedContainerType, + config_hash: new ByteVectorType(32), + }; + } - return new ContainerType(returnedContainerType) -} + return new ContainerType(returnedContainerType); +}; export const hashClusterDefinitionV1X8 = ( - cluster: ClusterDefinition, - configOnly: boolean, + cluster: ClusterDefinition, + configOnly: boolean, ): ValueOfFields => { - const definitionType = clusterDefinitionContainerTypeV1X8(configOnly) + const definitionType = clusterDefinitionContainerTypeV1X8(configOnly); - const val = definitionType.defaultValue() + const val = definitionType.defaultValue(); - // order should be same as charon https://github.com/ObolNetwork/charon/blob/main/cluster/ssz.go#L276 - val.uuid = strToUint8Array(cluster.uuid) - val.name = strToUint8Array(cluster.name) - val.version = strToUint8Array(cluster.version) - val.timestamp = strToUint8Array(cluster.timestamp) - val.num_validators = cluster.num_validators - val.threshold = cluster.threshold - val.dkg_algorithm = strToUint8Array(cluster.dkg_algorithm) - val.fork_version = fromHexString(cluster.fork_version) - val.operators = cluster.operators.map(operator => { - return configOnly - ? { address: fromHexString(operator.address) } - : { - address: fromHexString(operator.address), - enr: strToUint8Array(operator.enr as string), - config_signature: fromHexString(operator.config_signature as string), - enr_signature: fromHexString(operator.enr_signature as string), - } - }) - val.creator = configOnly - ? { address: fromHexString(cluster.creator.address) } - : { - address: fromHexString(cluster.creator.address), - config_signature: fromHexString(cluster.creator.config_signature as string), - } - val.validators = cluster.validators.map((validator) => { - return { - fee_recipient_address: fromHexString(validator.fee_recipient_address), - withdrawal_address: fromHexString(validator.withdrawal_address), - } - }) - val.deposit_amounts = (cluster.deposit_amounts as string[]).map((amount: string) => { - return parseInt(amount) - }) + // order should be same as charon https://github.com/ObolNetwork/charon/blob/main/cluster/ssz.go#L276 + val.uuid = strToUint8Array(cluster.uuid); + val.name = strToUint8Array(cluster.name); + val.version = strToUint8Array(cluster.version); + val.timestamp = strToUint8Array(cluster.timestamp); + val.num_validators = cluster.num_validators; + val.threshold = cluster.threshold; + val.dkg_algorithm = strToUint8Array(cluster.dkg_algorithm); + val.fork_version = fromHexString(cluster.fork_version); + val.operators = cluster.operators.map(operator => { + return configOnly + ? { address: fromHexString(operator.address) } + : { + address: fromHexString(operator.address), + enr: strToUint8Array(operator.enr as string), + config_signature: fromHexString(operator.config_signature as string), + enr_signature: fromHexString(operator.enr_signature as string), + }; + }); + val.creator = configOnly + ? { address: fromHexString(cluster.creator.address) } + : { + address: fromHexString(cluster.creator.address), + config_signature: fromHexString( + cluster.creator.config_signature as string, + ), + }; + val.validators = cluster.validators.map(validator => { + return { + fee_recipient_address: fromHexString(validator.fee_recipient_address), + withdrawal_address: fromHexString(validator.withdrawal_address), + }; + }); + val.deposit_amounts = (cluster.deposit_amounts as string[]).map( + (amount: string) => { + return parseInt(amount); + }, + ); - if (!configOnly) { - val.config_hash = fromHexString(cluster.config_hash) - } - return val -} + if (!configOnly) { + val.config_hash = fromHexString(cluster.config_hash); + } + return val; +}; // cluster lock const dvContainerTypeV1X8 = new ContainerType({ - distributed_public_key: new ByteVectorType(48), - public_shares: new ListCompositeType(new ByteVectorType(48), 256), - partial_deposit_data: new ListCompositeType(depositDataContainer, 256), - builder_registration: builderRegistrationContainer, -}) + distributed_public_key: new ByteVectorType(48), + public_shares: new ListCompositeType(new ByteVectorType(48), 256), + partial_deposit_data: new ListCompositeType(depositDataContainer, 256), + builder_registration: builderRegistrationContainer, +}); type LockContainerTypeV1X8 = ContainerType<{ - cluster_definition: DefinitionContainerTypeV1X8 - distributed_validators: ListCompositeType -}> + cluster_definition: DefinitionContainerTypeV1X8; + distributed_validators: ListCompositeType; +}>; /** * @returns SSZ Containerized type of cluster lock */ const clusterLockContainerTypeV1X8 = (): LockContainerTypeV1X8 => { - return new ContainerType({ - cluster_definition: clusterDefinitionContainerTypeV1X8(false), - distributed_validators: new ListCompositeType(dvContainerTypeV1X8, 65536), - }) -} + return new ContainerType({ + cluster_definition: clusterDefinitionContainerTypeV1X8(false), + distributed_validators: new ListCompositeType(dvContainerTypeV1X8, 65536), + }); +}; /** * @param cluster The published cluster lock * @returns The lock hash in of the corresponding cluster */ export const hashClusterLockV1X8 = (cluster: ClusterLock): string => { - const lockType = clusterLockContainerTypeV1X8() + const lockType = clusterLockContainerTypeV1X8(); - const val = lockType.defaultValue() + const val = lockType.defaultValue(); - // Check if we can replace with definition_hash - val.cluster_definition = hashClusterDefinitionV1X8( - cluster.cluster_definition, - false, - ) - val.distributed_validators = cluster.distributed_validators.map(dValidator => { - return { - distributed_public_key: fromHexString(dValidator.distributed_public_key), - public_shares: dValidator.public_shares.map(publicShare => - fromHexString(publicShare), + // Check if we can replace with definition_hash + val.cluster_definition = hashClusterDefinitionV1X8( + cluster.cluster_definition, + false, + ); + val.distributed_validators = cluster.distributed_validators.map( + dValidator => { + return { + distributed_public_key: fromHexString( + dValidator.distributed_public_key, + ), + public_shares: dValidator.public_shares.map(publicShare => + fromHexString(publicShare), + ), + // should be fixed + partial_deposit_data: ( + dValidator.partial_deposit_data as DepositData[] + ).map(depositData => { + return { + pubkey: fromHexString(depositData.pubkey), + withdrawal_credentials: fromHexString( + depositData.withdrawal_credentials, + ), + amount: parseInt(depositData.amount), + signature: fromHexString(depositData.signature), + }; + }), + builder_registration: { + message: { + fee_recipient: fromHexString( + dValidator.builder_registration?.message.fee_recipient as string, + ), + gas_limit: dValidator.builder_registration?.message + .gas_limit as number, + timestamp: dValidator.builder_registration?.message + .timestamp as number, + pubkey: fromHexString( + dValidator.builder_registration?.message.pubkey as string, ), - // should be fixed - partial_deposit_data: (dValidator.partial_deposit_data as DepositData[]).map(depositData => { - return { - pubkey: fromHexString(depositData.pubkey), - withdrawal_credentials: fromHexString( - depositData.withdrawal_credentials, - ), - amount: parseInt(depositData.amount), - signature: fromHexString(depositData.signature), - } - }), - builder_registration: { - message: { - fee_recipient: fromHexString( - dValidator.builder_registration?.message.fee_recipient as string, - ), - gas_limit: dValidator.builder_registration?.message.gas_limit as number, - timestamp: dValidator.builder_registration?.message.timestamp as number, - pubkey: fromHexString(dValidator.builder_registration?.message.pubkey as string), - }, - signature: fromHexString(dValidator.builder_registration?.signature as string), - }, - } - }) + }, + signature: fromHexString( + dValidator.builder_registration?.signature as string, + ), + }, + }; + }, + ); - return '0x' + Buffer.from(lockType.hashTreeRoot(val).buffer).toString('hex') -} + return '0x' + Buffer.from(lockType.hashTreeRoot(val).buffer).toString('hex'); +}; // DV verification export const verifyDVV1X8 = (clusterLock: ClusterLock): boolean => { - const validators = clusterLock.distributed_validators - const pubShares = [] - const pubKeys = [] - const builderRegistrationAndDepositDataMessages = [] - const blsSignatures = [] + const validators = clusterLock.distributed_validators; + const pubShares = []; + const pubKeys = []; + const builderRegistrationAndDepositDataMessages = []; + const blsSignatures = []; - for (let i = 0; i < validators.length; i++) { - const validator = validators[i] - const validatorPublicShares = validator.public_shares - const distributedPublicKey = validator.distributed_public_key + for (let i = 0; i < validators.length; i++) { + const validator = validators[i]; + const validatorPublicShares = validator.public_shares; + const distributedPublicKey = validator.distributed_public_key; - // Needed in signature_aggregate verification - for (const element of validatorPublicShares) { - pubShares.push(fromHexString(element)) - } - - // Deposit Data Verification - for (let j = 0; j < (validator.partial_deposit_data as DepositData[]).length; j++) { - const depositData = (validator.partial_deposit_data as DepositData[])[j] - const { isValidDepositData, depositDataMsg } = verifyDepositData( - distributedPublicKey, - depositData as Partial, - clusterLock.cluster_definition.validators[i].withdrawal_address, - clusterLock.cluster_definition.fork_version - ) + // Needed in signature_aggregate verification + for (const element of validatorPublicShares) { + pubShares.push(fromHexString(element)); + } - if ( - !isValidDepositData - ) { - return false - } + // Deposit Data Verification + for (const element of validator.partial_deposit_data as DepositData[]) { + const depositData = element; + const { isValidDepositData, depositDataMsg } = verifyDepositData( + distributedPublicKey, + depositData as Partial, + clusterLock.cluster_definition.validators[i].withdrawal_address, + clusterLock.cluster_definition.fork_version, + ); - pubKeys.push(fromHexString(distributedPublicKey)) - builderRegistrationAndDepositDataMessages.push(depositDataMsg) - blsSignatures.push(fromHexString(depositData?.signature)) - } + if (!isValidDepositData) { + return false; + } - // Builder Registration Verification - const { isValidBuilderRegistration, builderRegistrationMsg } = verifyBuilderRegistration( - validator, - clusterLock.cluster_definition.validators[i].fee_recipient_address, - clusterLock.cluster_definition.fork_version - ) + pubKeys.push(fromHexString(distributedPublicKey)); + builderRegistrationAndDepositDataMessages.push(depositDataMsg); + blsSignatures.push(fromHexString(depositData?.signature)); + } - if ( - !isValidBuilderRegistration - ) { - return false - } + // Builder Registration Verification + const { isValidBuilderRegistration, builderRegistrationMsg } = + verifyBuilderRegistration( + validator, + clusterLock.cluster_definition.validators[i].fee_recipient_address, + clusterLock.cluster_definition.fork_version, + ); - pubKeys.push(fromHexString(distributedPublicKey)) - builderRegistrationAndDepositDataMessages.push(builderRegistrationMsg) - blsSignatures.push( - fromHexString(validator.builder_registration?.signature as string), - ) + if (!isValidBuilderRegistration) { + return false; } - // BLS signatures verification - const aggregateBLSSignature = aggregateSignatures(blsSignatures) + pubKeys.push(fromHexString(distributedPublicKey)); + builderRegistrationAndDepositDataMessages.push(builderRegistrationMsg); + blsSignatures.push( + fromHexString(validator.builder_registration?.signature as string), + ); + } - if ( - !verifyMultiple( - pubKeys, - builderRegistrationAndDepositDataMessages, - aggregateBLSSignature, - ) - ) { - return false - } + // BLS signatures verification + const aggregateBLSSignature = aggregateSignatures(blsSignatures); - // Node Signatures verification - if ( - !verifyNodeSignatures( - clusterLock - ) - ) { - return false - } + if ( + !verifyMultiple( + pubKeys, + builderRegistrationAndDepositDataMessages, + aggregateBLSSignature, + ) + ) { + return false; + } - // signature_aggregate verification - if ( - !verifyAggregate( - pubShares, - fromHexString(clusterLock.lock_hash), - fromHexString(clusterLock.signature_aggregate), - ) - ) { - return false - } + // Node Signatures verification + if (!verifyNodeSignatures(clusterLock)) { + return false; + } + + // signature_aggregate verification + if ( + !verifyAggregate( + pubShares, + fromHexString(clusterLock.lock_hash), + fromHexString(clusterLock.signature_aggregate), + ) + ) { + return false; + } - return true -} + return true; +}; diff --git a/test/fixtures.ts b/test/fixtures.ts index 23a6da1..3ad338b 100644 --- a/test/fixtures.ts +++ b/test/fixtures.ts @@ -1,5 +1,5 @@ export const enr = - 'enr:-HW4QLlrtMjFLGkFT1bwdGbvZQlH8hLi0M2g44JAxEYP3BZmYpcsy9Q56HPPD87fMucjvLv4-obEFacpsg0ehRilbHeAgmlkgnY0iXNlY3AyNTZrMaEDRaa5o2aSgqyFq_ERZcQTztrOij1mFtXX1bJuVI6ieak' + 'enr:-HW4QLlrtMjFLGkFT1bwdGbvZQlH8hLi0M2g44JAxEYP3BZmYpcsy9Q56HPPD87fMucjvLv4-obEFacpsg0ehRilbHeAgmlkgnY0iXNlY3AyNTZrMaEDRaa5o2aSgqyFq_ERZcQTztrOij1mFtXX1bJuVI6ieak'; // v1.6.0 export const clusterLockV1X6 = { @@ -87,7 +87,7 @@ export const clusterLockV1X6 = { '0xb7f49e8eaa4015a3118deace6d17c9aef8a495b0ce460b0f1d27423101177000541a9d422fcc4eeedbaaa2497c555d8d0ba7ee882a5eaecfb89e7dcec2f2f3f5df78bc172e03be426c5f0835cbe58dac43e5812de5c21d2755693de2af80f491', lock_hash: '0x6d2b38d098143c8f0bc5076f4e9b6081cbba040a5aea6649e6223e7a4131241b', -} +}; // v1.7.0 @@ -105,7 +105,7 @@ export const clusterConfigV1X7 = { withdrawal_address: '0xE0C5ceA4D3869F156717C66E188Ae81C80914a6e', }, ], -} +}; export const clusterLockV1X7 = { cluster_definition: { @@ -209,7 +209,7 @@ export const clusterLockV1X7 = { '0xebd08c9ece21abd78cfe82bc32eae68ccd77fc1e96e56ce93679918c5adcb2c92564a4fa609d7649587fbfb0c581403da8553e9e62c910e5ae589625704aa02b00', '0xa07fc8f89f32a5b2551cc2173b0486f86142ee2a67400d2d4a956a2b948da96b58adddf558db6ac84de62242b5e56b1a1e95d26451be3a922fe3929f2a367a7400', ], -} +}; // v1.8.0 @@ -227,44 +227,49 @@ export const clusterConfigV1X8 = { withdrawal_address: '0xE0C5ceA4D3869F156717C66E188Ae81C80914a6e', }, ], - deposit_amounts: [ - '8000000000', - '16000000000', - '8000000000' - ], -} + deposit_amounts: ['8000000000', '16000000000', '8000000000'], +}; export const clusterLockV1X8 = { cluster_definition: { name: 'xxxx', creator: { address: '0x86B8145c98e5BD25BA722645b15eD65f024a87EC', - config_signature: '0xd30b182fadbc2c5b2bb3f3f6ed6ac2588f297ceb610ed5509bf3e5a25a9b30c70f8a09ef1d2c8e1dbe5ff441299fe66ec677734cc08beec87e94b7effcb089701b' + config_signature: + '0xd30b182fadbc2c5b2bb3f3f6ed6ac2588f297ceb610ed5509bf3e5a25a9b30c70f8a09ef1d2c8e1dbe5ff441299fe66ec677734cc08beec87e94b7effcb089701b', }, operators: [ { address: '0x86B8145c98e5BD25BA722645b15eD65f024a87EC', enr: 'enr:-HW4QLlrtMjFLGkFT1bwdGbvZQlH8hLi0M2g44JAxEYP3BZmYpcsy9Q56HPPD87fMucjvLv4-obEFacpsg0ehRilbHeAgmlkgnY0iXNlY3AyNTZrMaEDRaa5o2aSgqyFq_ERZcQTztrOij1mFtXX1bJuVI6ieak', - config_signature: '0x3df771ecfc9ae2d01da9249dc636a42893e48759c0fa5c51f5e5e14f3ea4513233d1e3bbdd0e11d4b67c8a907201fd08225a75a1e2d6f510a439d6b15f0c36341c', - enr_signature: '0x3fe2a124dabe3d517e4c274074b3529d36d9528ca6fa8a4e74ef356f86a07c1462fe72a5336421c2647be7babc4ce1835c2101133e0779cf81d4a8d8cb9fe5591c' + config_signature: + '0x3df771ecfc9ae2d01da9249dc636a42893e48759c0fa5c51f5e5e14f3ea4513233d1e3bbdd0e11d4b67c8a907201fd08225a75a1e2d6f510a439d6b15f0c36341c', + enr_signature: + '0x3fe2a124dabe3d517e4c274074b3529d36d9528ca6fa8a4e74ef356f86a07c1462fe72a5336421c2647be7babc4ce1835c2101133e0779cf81d4a8d8cb9fe5591c', }, { address: '0xC35CfCd67b9C27345a54EDEcC1033F2284148c81', enr: 'enr:-Iu4QNbiUUUwT18LynBbVPJhNxvzQsaSpUr40mQTWscnZaqKb6vAlvV8j-eDDR3E0wjMQumGRbGm2IAb5_k4bVWJiVGAgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQPOiodUji0ohgJb5sNK1hgv8g6xO5_znZz3NkkBkyYyKIN0Y3CCDhqDdWRwgg4u', - config_signature: '0x12d19d6fc4c1a5d9e7be09f47c2f2357dd89f47aba8ae0185f5345e08bcc3adc324bdd51e68a12c3ca34c604d786cfde5f0798aa928dac496edb16c70e7086551b', - enr_signature: '0xa3d49832dfaf0ad87c5796f9bc151009343da70b91fd53bee3645baa63d001d3207662da8f67b3a20f2ee30c9cacb24a5719a78dc24e030c8ac93e7b3b46bf881b' + config_signature: + '0x12d19d6fc4c1a5d9e7be09f47c2f2357dd89f47aba8ae0185f5345e08bcc3adc324bdd51e68a12c3ca34c604d786cfde5f0798aa928dac496edb16c70e7086551b', + enr_signature: + '0xa3d49832dfaf0ad87c5796f9bc151009343da70b91fd53bee3645baa63d001d3207662da8f67b3a20f2ee30c9cacb24a5719a78dc24e030c8ac93e7b3b46bf881b', }, { address: '0x33807D6F1DCe44b9C599fFE03640762A6F08C496', enr: 'enr:-Iu4QJyserRukhG0Vgi2csu7GjpHYUGufNEbZ8Q7ZBrcZUb0KqpL5QzHonkh1xxHlxatTxrIcX_IS5J3SEWR_sa0ptGAgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQMAUgEqczOjevyculnUIofhCj0DkgJudErM7qCYIvIkzIN0Y3CCDhqDdWRwgg4u', - config_signature: '0x665d287c46921aad0dde389291b982f24dbbeb4b7ce5ee7bbc4a7d1fb55134f7136889eb3ce70208a7f276b9d4aefb1fbc6159476934567e5bf11765b2c9649b1b', - enr_signature: '0xc32d5ea29569b01354d48ddaf56df1481a5ae618ffb47602ef40e0e77357de5f23a5258923be5fa06ecce20f5692847860c25c38b97a4e306c94decd99c0519a1b' + config_signature: + '0x665d287c46921aad0dde389291b982f24dbbeb4b7ce5ee7bbc4a7d1fb55134f7136889eb3ce70208a7f276b9d4aefb1fbc6159476934567e5bf11765b2c9649b1b', + enr_signature: + '0xc32d5ea29569b01354d48ddaf56df1481a5ae618ffb47602ef40e0e77357de5f23a5258923be5fa06ecce20f5692847860c25c38b97a4e306c94decd99c0519a1b', }, { address: '0xc6e76F72Ea672FAe05C357157CfC37720F0aF26f', enr: 'enr:-HW4QKJTwXC6Chw6zbnA3HFZi6Jo0DkIgjKy4eUBpsSOGnAeWE6ChEjEyk_6R6Qrm7jI-iqfs3_HYxiKde8vFgvHHrCAgmlkgnY0iXNlY3AyNTZrMaECfFKQH4spdZCHqrKVz1Q02xYla6J_RQECDNNYBRWdzv8', - config_signature: '0x610f7be9c7c38878cde1cb391de08eee2f86e62f31f450843b4e37164e738fc8769046e53ad1f018f54ddaf858ff372d22169702c60d68bda19c96fdd20150b61c', - enr_signature: '0xe2977c79f63b8fe6cb6551efec0cf69041c7f4aaa8ea338997a397450ee946023b03ccb70ad3cc97b1319e1eea9f7472a2ca161bc8b33acdcde689d84c7e771c1b' - } + config_signature: + '0x610f7be9c7c38878cde1cb391de08eee2f86e62f31f450843b4e37164e738fc8769046e53ad1f018f54ddaf858ff372d22169702c60d68bda19c96fdd20150b61c', + enr_signature: + '0xe2977c79f63b8fe6cb6551efec0cf69041c7f4aaa8ea338997a397450ee946023b03ccb70ad3cc97b1319e1eea9f7472a2ca161bc8b33acdcde689d84c7e771c1b', + }, ], uuid: 'bc2fec0c-0b8b-4415-bf48-1e96b07f50eb', version: 'v1.8.0', @@ -274,81 +279,95 @@ export const clusterLockV1X8 = { validators: [ { fee_recipient_address: '0x7aC193bF9a9C6e6DD6302969E8Ea6EdF6df490d8', - withdrawal_address: '0x9e0AC0078F10d28E875577bb3A4A9EDAB60c03EC' + withdrawal_address: '0x9e0AC0078F10d28E875577bb3A4A9EDAB60c03EC', }, { fee_recipient_address: '0x7aC193bF9a9C6e6DD6302969E8Ea6EdF6df490d8', - withdrawal_address: '0x9e0AC0078F10d28E875577bb3A4A9EDAB60c03EC' - } + withdrawal_address: '0x9e0AC0078F10d28E875577bb3A4A9EDAB60c03EC', + }, ], dkg_algorithm: 'default', fork_version: '0x01017000', - deposit_amounts: [ - '32000000000' - ], - config_hash: '0xb2601f51d277f699acb8ea3b9fb4fc68087c0f1f2c6ae83d00fdd853a6cddb31', - definition_hash: '0x2a9d52b1dd13fd91661d81e3786512ffdcc3689e2ec97105add153f543c642b4' + deposit_amounts: ['32000000000'], + config_hash: + '0xb2601f51d277f699acb8ea3b9fb4fc68087c0f1f2c6ae83d00fdd853a6cddb31', + definition_hash: + '0x2a9d52b1dd13fd91661d81e3786512ffdcc3689e2ec97105add153f543c642b4', }, distributed_validators: [ { - distributed_public_key: '0xa33ae80f967a669d8df3ae769acc114577fab185d53e10154b0b50cc0cf9b9f35e466a318f174e8cecdc12173d95cb27', + distributed_public_key: + '0xa33ae80f967a669d8df3ae769acc114577fab185d53e10154b0b50cc0cf9b9f35e466a318f174e8cecdc12173d95cb27', public_shares: [ '0x849db297f690a26e76d5930f99eac9e3f95d9232256d6e39124fe071745b43c8b5418c733b06683aa240a2a0e44b9b8f', '0xa1051bf5692153d5bc418946763bb5c82780a05e97bd5b258ea7abe6705047628edd8277366f6b5d0469abfee18988d9', '0x87d0342e5dc49a0a0c8f08ec011da3bd859a333bfc46ddd0a194485aa5aa954b7c18d05a2c1ae148d4dc45331101f496', - '0xa4fa0e971e1a5e38ebe89c6457bc9316b3dd0933660b17e1c717ac148f8340a5db20d867c7a24758c701f6b6bec4d552' + '0xa4fa0e971e1a5e38ebe89c6457bc9316b3dd0933660b17e1c717ac148f8340a5db20d867c7a24758c701f6b6bec4d552', ], builder_registration: { message: { fee_recipient: '0x7ac193bf9a9c6e6dd6302969e8ea6edf6df490d8', gas_limit: 30000000, timestamp: 1696000704, - pubkey: '0xa33ae80f967a669d8df3ae769acc114577fab185d53e10154b0b50cc0cf9b9f35e466a318f174e8cecdc12173d95cb27' + pubkey: + '0xa33ae80f967a669d8df3ae769acc114577fab185d53e10154b0b50cc0cf9b9f35e466a318f174e8cecdc12173d95cb27', }, - signature: '0xb39977fe7c45bab28cfd1bcf356a71b0557187a75e0dfa0facaf5eddba05988c0da85800a4b4528704df44f280913ebc125eb3f9c091d6dd220c92dfcc3c80bc7a9ed2f1b96bffaeaa1053cf117b02b48eb755139c5623b6e61dd92c27d15813' + signature: + '0xb39977fe7c45bab28cfd1bcf356a71b0557187a75e0dfa0facaf5eddba05988c0da85800a4b4528704df44f280913ebc125eb3f9c091d6dd220c92dfcc3c80bc7a9ed2f1b96bffaeaa1053cf117b02b48eb755139c5623b6e61dd92c27d15813', }, partial_deposit_data: [ { - pubkey: '0xa33ae80f967a669d8df3ae769acc114577fab185d53e10154b0b50cc0cf9b9f35e466a318f174e8cecdc12173d95cb27', - withdrawal_credentials: '0x0100000000000000000000009e0ac0078f10d28e875577bb3a4a9edab60c03ec', + pubkey: + '0xa33ae80f967a669d8df3ae769acc114577fab185d53e10154b0b50cc0cf9b9f35e466a318f174e8cecdc12173d95cb27', + withdrawal_credentials: + '0x0100000000000000000000009e0ac0078f10d28e875577bb3a4a9edab60c03ec', amount: '32000000000', - signature: '0x9861022ca71cf18aad49a201b023356b8c5ca090086614b681cb84a54327caeff53c0a71c5f55f49976114bb86de2ad6052d174d7948e6c8a924d9bfbbbc2181fad967d818454c6c4f7cffb7bb93dc2c4f4c87fc5598cb4582fa08eff0c7bc08' - } - ] + signature: + '0x9861022ca71cf18aad49a201b023356b8c5ca090086614b681cb84a54327caeff53c0a71c5f55f49976114bb86de2ad6052d174d7948e6c8a924d9bfbbbc2181fad967d818454c6c4f7cffb7bb93dc2c4f4c87fc5598cb4582fa08eff0c7bc08', + }, + ], }, { - distributed_public_key: '0xaa888bf805bec7da7ac18dea3afefbf5b8510cbf76367229dab830b3ecdd4533b9d50fb9fcb454df5cbe08e4b31e8479', + distributed_public_key: + '0xaa888bf805bec7da7ac18dea3afefbf5b8510cbf76367229dab830b3ecdd4533b9d50fb9fcb454df5cbe08e4b31e8479', public_shares: [ '0x8279ae646839d946a622d096296ffcccd289e8c49ea2308560bbb731c63d4b49ea46db817a955e47634edbded4919d82', '0xa8a12b5b645b015c55515b3220395e015fc051c58bf243e1b638770652c67f863852f9190e3e182aa86b99823b4cf28d', '0xb0c557f812060bb1c409e5324c7b54f35fee8f1180c714e60784f7df6a58e3ba3da6cc8b3cebc01975f9f41efcd777cb', - '0xa7a8576c3b21221f2a6adefc41b4c1f979ee0761e9a7ff50d30434d1a0c4e7fc505b308636801925e698286b802de421' + '0xa7a8576c3b21221f2a6adefc41b4c1f979ee0761e9a7ff50d30434d1a0c4e7fc505b308636801925e698286b802de421', ], builder_registration: { message: { fee_recipient: '0x7ac193bf9a9c6e6dd6302969e8ea6edf6df490d8', gas_limit: 30000000, timestamp: 1696000704, - pubkey: '0xaa888bf805bec7da7ac18dea3afefbf5b8510cbf76367229dab830b3ecdd4533b9d50fb9fcb454df5cbe08e4b31e8479' + pubkey: + '0xaa888bf805bec7da7ac18dea3afefbf5b8510cbf76367229dab830b3ecdd4533b9d50fb9fcb454df5cbe08e4b31e8479', }, - signature: '0x8dcb54028adb8f5601b6ab20ded381dabb6739b3e506df795a279043997908c7d38a68b8e8dda27516165f18e437a84603935bfefc1a83befbd1a90ac43fcc7fb0eed81122852a2ee71fef414aa8879198da239527036b0eaebcdc88d6eca3d1' + signature: + '0x8dcb54028adb8f5601b6ab20ded381dabb6739b3e506df795a279043997908c7d38a68b8e8dda27516165f18e437a84603935bfefc1a83befbd1a90ac43fcc7fb0eed81122852a2ee71fef414aa8879198da239527036b0eaebcdc88d6eca3d1', }, partial_deposit_data: [ { - pubkey: '0xaa888bf805bec7da7ac18dea3afefbf5b8510cbf76367229dab830b3ecdd4533b9d50fb9fcb454df5cbe08e4b31e8479', - withdrawal_credentials: '0x0100000000000000000000009e0ac0078f10d28e875577bb3a4a9edab60c03ec', + pubkey: + '0xaa888bf805bec7da7ac18dea3afefbf5b8510cbf76367229dab830b3ecdd4533b9d50fb9fcb454df5cbe08e4b31e8479', + withdrawal_credentials: + '0x0100000000000000000000009e0ac0078f10d28e875577bb3a4a9edab60c03ec', amount: '32000000000', - signature: '0x95ee68e5191d34e10f567ab0f565cd927211b29be9ab830d39bf74d0486aee7bff78d8fe12d455cb40ec707378eea1040a9d80806f82afa58295de9d4db2dccc48cfaf3c98e9020c6b5c8a9aacf5bbfc7e316871f505000304d9d39b7ad5c5d8' - } - ] - } + signature: + '0x95ee68e5191d34e10f567ab0f565cd927211b29be9ab830d39bf74d0486aee7bff78d8fe12d455cb40ec707378eea1040a9d80806f82afa58295de9d4db2dccc48cfaf3c98e9020c6b5c8a9aacf5bbfc7e316871f505000304d9d39b7ad5c5d8', + }, + ], + }, ], - signature_aggregate: '0x81ab6319191e3b9065f14231a71fe480b4a45e5e5db4a064faa19a31d04b9cb55fa88b8aa3c966b054b97ae7db2233ee060ae333c5ca3a55ed16b9a3de1894087901cb2d3a177de1cd40030c93301c23ca3edd28dfd1ad04e210b7e2c7625f89', - lock_hash: '0x186e7e61fb49373d9034d101f2f08429cb379bfcc2f7fa5e9598e8a14ae13ed7', + signature_aggregate: + '0x81ab6319191e3b9065f14231a71fe480b4a45e5e5db4a064faa19a31d04b9cb55fa88b8aa3c966b054b97ae7db2233ee060ae333c5ca3a55ed16b9a3de1894087901cb2d3a177de1cd40030c93301c23ca3edd28dfd1ad04e210b7e2c7625f89', + lock_hash: + '0x186e7e61fb49373d9034d101f2f08429cb379bfcc2f7fa5e9598e8a14ae13ed7', node_signatures: [ '0xd4b1b6f7b363015b9d1c1c4f199fffc3f9238b7326fdfc5059b175519b05c90a022a18bf2e3eae7d7b0e833384131c2e7be17cc78f6ca23644ae345904dc2d2601', '0xc186f930d8d281ab3999fb0ff62b5d96045a4e2330d9d8b300d5d1014f6b4bd925d9c2fedbb53047a49d4008f82600f46e1131b981222c5e423c12b1c9fd544900', '0xbc0831fa82b1a70e17eb4fe6f79249a8f5aab1d1f196dd07e32766eb27e72354757d7146b64fca4ad4efa554f7a5d4e7ef835aab6348e9afa37c9eeab069ff4e01', - '0x0135f307831fa58ff64f9af46e00b92e2375162646af88f6991ba6f98a8c262f2c41846af59da68eadb8ff9c94db42ee8005bd4236e5897635573db2911460aa00' - ] -} + '0x0135f307831fa58ff64f9af46e00b92e2375162646af88f6991ba6f98a8c262f2c41846af59da68eadb8ff9c94db42ee8005bd4236e5897635573db2911460aa00', + ], +}; diff --git a/test/methods.test.ts b/test/methods.test.ts index cdc587c..bc6dea9 100644 --- a/test/methods.test.ts +++ b/test/methods.test.ts @@ -1,26 +1,32 @@ -import { ethers } from 'ethers' -import { Client, validateClusterLock } from '../src/index' -import { clusterConfigV1X7, clusterLockV1X6, clusterLockV1X7, clusterLockV1X8 } from './fixtures.js' -import { SDK_VERSION } from '../src/constants' -import { Base } from '../src/base' -import { validatePayload } from '../src/ajv' -import { HttpResponse, http } from 'msw' -import { setupServer } from 'msw/node' -import { hashTermsAndConditions } from '../src/verification/termsAndConditions' +import { ethers } from 'ethers'; +import { Client, validateClusterLock } from '../src/index'; +import { + clusterConfigV1X7, + clusterConfigV1X8, + clusterLockV1X6, + clusterLockV1X7, + clusterLockV1X8, +} from './fixtures.js'; +import { SDK_VERSION } from '../src/constants'; +import { Base } from '../src/base'; +import { validatePayload } from '../src/ajv'; +import { HttpResponse, http } from 'msw'; +import { setupServer } from 'msw/node'; +import { hashTermsAndConditions } from '../src/verification/termsAndConditions'; /* eslint no-new: 0 */ describe('Cluster Client', () => { const mockConfigHash = - '0x1f6c94e6c070393a68c1aa6073a21cb1fd57f0e14d2a475a2958990ab728c2fd' - const mnemonic = ethers.Wallet.createRandom().mnemonic?.phrase ?? '' - const privateKey = ethers.Wallet.fromPhrase(mnemonic).privateKey - const wallet = new ethers.Wallet(privateKey) - const mockSigner = wallet.connect(null) + '0x1f6c94e6c070393a68c1aa6073a21cb1fd57f0e14d2a475a2958990ab728c2fd'; + const mnemonic = ethers.Wallet.createRandom().mnemonic?.phrase ?? ''; + const privateKey = ethers.Wallet.fromPhrase(mnemonic).privateKey; + const wallet = new ethers.Wallet(privateKey); + const mockSigner = wallet.connect(null); const clientInstance = new Client( { baseUrl: 'https://obol-api-dev.gcp.obol.tech', chainId: 5 }, mockSigner, - ) + ); // test('throws invalid ChainId when it is equal to 1', async () => { // try { @@ -33,177 +39,225 @@ describe('Cluster Client', () => { test('createTermsAndConditions should return "successful authorization"', async () => { clientInstance['request'] = jest .fn() - .mockReturnValue(Promise.resolve({ message: 'successful authorization' })) + .mockReturnValue( + Promise.resolve({ message: 'successful authorization' }), + ); const isAuthorized = - await clientInstance.acceptObolLatestTermsAndConditions() - expect(isAuthorized).toEqual('successful authorization') - }) + await clientInstance.acceptObolLatestTermsAndConditions(); + expect(isAuthorized).toEqual('successful authorization'); + }); test('createClusterDefinition should return config_hash', async () => { clientInstance['request'] = jest .fn() - .mockReturnValue(Promise.resolve({ config_hash: mockConfigHash })) + .mockReturnValue(Promise.resolve({ config_hash: mockConfigHash })); const configHash = - await clientInstance.createClusterDefinition(clusterConfigV1X7) - expect(configHash).toEqual(mockConfigHash) - }) + await clientInstance.createClusterDefinition(clusterConfigV1X8); + expect(configHash).toEqual(mockConfigHash); + }); test('acceptClusterDefinition should return cluster definition', async () => { clientInstance['request'] = jest .fn() - .mockReturnValue(Promise.resolve(clusterLockV1X7.cluster_definition)) + .mockReturnValue(Promise.resolve(clusterLockV1X8.cluster_definition)); const clusterDefinition = await clientInstance.acceptClusterDefinition( { - enr: clusterLockV1X7.cluster_definition.operators[0].enr, - version: clusterLockV1X7.cluster_definition.version, + enr: clusterLockV1X8.cluster_definition.operators[0].enr, + version: clusterLockV1X8.cluster_definition.version, }, - clusterLockV1X7.cluster_definition.config_hash, - ) - expect(clusterDefinition).toEqual(clusterLockV1X7.cluster_definition) - }) + clusterLockV1X8.cluster_definition.config_hash, + ); + expect(clusterDefinition).toEqual(clusterLockV1X8.cluster_definition); + }); test('createClusterDefinition should throw an error on invalid operators', async () => { clientInstance['request'] = jest .fn() - .mockReturnValue(Promise.resolve({ config_hash: mockConfigHash })) + .mockReturnValue(Promise.resolve({ config_hash: mockConfigHash })); try { await clientInstance.createClusterDefinition({ - ...clusterConfigV1X7, + ...clusterConfigV1X8, operators: [], - }) + }); } catch (error: any) { expect(error.message).toEqual( "Schema compilation errors', must NOT have fewer than 4 items", - ) + ); + } + }); + + // cause we default to 32000000000 + test('createClusterDefinition should accept a configuration without deposit_amounts', async () => { + clientInstance['request'] = jest + .fn() + .mockReturnValue(Promise.resolve({ config_hash: mockConfigHash })); + + const configHash = await clientInstance.createClusterDefinition({ + ...clusterConfigV1X7, + }); + + expect(configHash).toEqual(mockConfigHash); + }); + + test('createClusterDefinition should throw on not valid deposit_amounts ', async () => { + clientInstance['request'] = jest + .fn() + .mockReturnValue(Promise.resolve({ config_hash: mockConfigHash })); + try { + await clientInstance.createClusterDefinition({ + ...clusterConfigV1X7, + deposit_amounts: ['34000000'], + }); + } catch (error: any) { + expect(error.message).toEqual( + 'Schema compilation errors\', must pass "validDepositAmounts" keyword validation', + ); } - }) + }); test('validatePayload should throw an error on empty schema', async () => { try { - validatePayload({ ...clusterConfigV1X7, operators: [] }, '') + validatePayload({ ...clusterConfigV1X8, operators: [] }, ''); } catch (error: any) { - expect(error.message).toEqual('schema must be object or boolean') + expect(error.message).toEqual('schema must be object or boolean'); } - }) + }); test('getClusterdefinition should return cluster definition if config hash exist', async () => { clientInstance['request'] = jest .fn() - .mockReturnValue(Promise.resolve(clusterLockV1X7.cluster_definition)) + .mockReturnValue(Promise.resolve(clusterLockV1X8.cluster_definition)); const clusterDefinition = await clientInstance.getClusterDefinition( - clusterLockV1X7.cluster_definition.config_hash, - ) + clusterLockV1X8.cluster_definition.config_hash, + ); + + expect(clusterDefinition.deposit_amounts?.length).toEqual( + clusterLockV1X8.cluster_definition.deposit_amounts.length, + ); expect(clusterDefinition.config_hash).toEqual( - clusterLockV1X7.cluster_definition.config_hash, - ) - }) + clusterLockV1X8.cluster_definition.config_hash, + ); + }); test('getClusterLock should return lockFile if exist', async () => { clientInstance['request'] = jest .fn() - .mockReturnValue(Promise.resolve(clusterLockV1X7)) + .mockReturnValue(Promise.resolve(clusterLockV1X8)); const clusterLock = await clientInstance.getClusterLock( - clusterLockV1X7.cluster_definition.config_hash, - ) - expect(clusterLock.lock_hash).toEqual(clusterLockV1X7.lock_hash) - }) + clusterLockV1X8.cluster_definition.config_hash, + ); + expect(clusterLock.lock_hash).toEqual(clusterLockV1X8.lock_hash); + }); test('request method should set user agent header', async () => { const server = setupServer( http.get('http://testexample.com/test', ({ request }) => { // Check if the request contains specific headers if (request.headers.get('User-Agent') === `Obol-SDK/${SDK_VERSION}`) { - return HttpResponse.json({ message: 'user-agent header exist' }) + return HttpResponse.json({ message: 'user-agent header exist' }); } }), - ) - server.listen() + ); + server.listen(); class TestBase extends Base { async callProtectedRequest( endpoint: string, options?: RequestInit, ): Promise { - return await this['request'](endpoint, options) + return await this['request'](endpoint, options); } } - const testBaseInstance = new TestBase({ baseUrl: 'http://testExample.com' }) + const testBaseInstance = new TestBase({ + baseUrl: 'http://testExample.com', + }); const result: { message: string } = await testBaseInstance.callProtectedRequest('/test', { method: 'GET', - }) - expect(result?.message).toEqual('user-agent header exist') - server.close() - }) -}) + }); + expect(result?.message).toEqual('user-agent header exist'); + server.close(); + }); +}); describe('Cluster Client without a signer', () => { const clientInstance = new Client({ baseUrl: 'https://obol-api-dev.gcp.obol.tech', chainId: 5, - }) + }); test('createClusterDefinition should throw an error without signer', async () => { try { - await clientInstance.createClusterDefinition(clusterConfigV1X7) + await clientInstance.createClusterDefinition(clusterConfigV1X8); } catch (err: any) { - expect(err.message).toEqual('Signer is required in createClusterDefinition') + expect(err.message).toEqual( + 'Signer is required in createClusterDefinition', + ); } - }) + }); test('acceptClusterDefinition should throw an error without signer', async () => { try { await clientInstance.acceptClusterDefinition( { - enr: clusterLockV1X7.cluster_definition.operators[0].enr, - version: clusterLockV1X7.cluster_definition.version, + enr: clusterLockV1X8.cluster_definition.operators[0].enr, + version: clusterLockV1X8.cluster_definition.version, }, - clusterLockV1X7.cluster_definition.config_hash, - ) + clusterLockV1X8.cluster_definition.config_hash, + ); } catch (err: any) { - expect(err.message).toEqual('Signer is required in acceptClusterDefinition') + expect(err.message).toEqual( + 'Signer is required in acceptClusterDefinition', + ); } - }) + }); test('getClusterdefinition should return cluster definition if config hash exist', async () => { clientInstance['request'] = jest .fn() - .mockReturnValue(Promise.resolve(clusterLockV1X7.cluster_definition)) + .mockReturnValue(Promise.resolve(clusterLockV1X8.cluster_definition)); const clusterDefinition = await clientInstance.getClusterDefinition( - clusterLockV1X7.cluster_definition.config_hash, - ) + clusterLockV1X8.cluster_definition.config_hash, + ); expect(clusterDefinition.config_hash).toEqual( - clusterLockV1X7.cluster_definition.config_hash, - ) - }) + clusterLockV1X8.cluster_definition.config_hash, + ); + }); test('getClusterLock should return lockFile if exist', async () => { clientInstance['request'] = jest .fn() - .mockReturnValue(Promise.resolve(clusterLockV1X7)) + .mockReturnValue(Promise.resolve(clusterLockV1X8)); const clusterLock = await clientInstance.getClusterLock( - clusterLockV1X7.cluster_definition.config_hash, - ) - expect(clusterLock.lock_hash).toEqual(clusterLockV1X7.lock_hash) - }) + clusterLockV1X8.cluster_definition.config_hash, + ); + expect(clusterLock.lock_hash).toEqual(clusterLockV1X8.lock_hash); + }); - test.each([{ version: 'v1.6.0', clusterLock: clusterLockV1X6 }, { version: 'v1.7.0', clusterLock: clusterLockV1X7 }, { version: 'v1.8.0', clusterLock: clusterLockV1X8 }])( - '$version: \'should return true on verified cluster lock\'', + test.each([ + { version: 'v1.6.0', clusterLock: clusterLockV1X6 }, + { version: 'v1.7.0', clusterLock: clusterLockV1X7 }, + { version: 'v1.8.0', clusterLock: clusterLockV1X8 }, + ])( + "$version: 'should return true on verified cluster lock'", async ({ clusterLock }) => { - const isValidLock: boolean = await validateClusterLock(clusterLock) - expect(isValidLock).toEqual(true) - }) + const isValidLock: boolean = await validateClusterLock(clusterLock); + expect(isValidLock).toEqual(true); + }, + ); test('Finds the hash of the latest version of terms and conditions', async () => { - const termsAndConditionsHash = await hashTermsAndConditions() - expect(termsAndConditionsHash).toEqual('0xa27f806434a2a26572582a87baf908bb0c01adcb497a0e61c58867e7c3b6743e') - }) -}) + const termsAndConditionsHash = await hashTermsAndConditions(); + expect(termsAndConditionsHash).toEqual( + '0xd33721644e8f3afab1495a74abe3523cec12d48b8da6cb760972492ca3f1a273', + ); + }); +}); diff --git a/test/sdk-package-test/cluster.test.ts b/test/sdk-package-test/cluster.test.ts index c4f5751..3ef77cf 100755 --- a/test/sdk-package-test/cluster.test.ts +++ b/test/sdk-package-test/cluster.test.ts @@ -1,6 +1,12 @@ -import request from 'supertest' -import dotenv from 'dotenv' -import { clusterConfigV1X7, clusterLockV1X6, clusterLockV1X7, clusterLockV1X8, enr } from './../fixtures' +import request from 'supertest'; +import dotenv from 'dotenv'; +import { + clusterConfigV1X8, + clusterLockV1X6, + clusterLockV1X7, + clusterLockV1X8, + enr, +} from '../fixtures'; import { client, updateClusterDef, @@ -8,141 +14,146 @@ import { app, postClusterDef, signer, - secondClient -} from './utils' + secondClient, +} from './utils'; import { type ClusterDefinition, Client, validateClusterLock, -} from '@obolnetwork/obol-sdk' +} from '@obolnetwork/obol-sdk'; -dotenv.config() +dotenv.config(); -const DEL_AUTH = process.env.DEL_AUTH +const DEL_AUTH = process.env.DEL_AUTH; -jest.setTimeout(10000) +jest.setTimeout(10000); /* eslint @typescript-eslint/no-misused-promises: 0 */ // --> OFF describe('Cluster Definition', () => { - let configHash: string - let clusterDefinition: ClusterDefinition - let secondConfigHash: string + let configHash: string; + let clusterDefinition: ClusterDefinition; + let secondConfigHash: string; const clientWithoutAsigner = new Client({ baseUrl: 'https://obol-api-nonprod-dev.dev.obol.tech', chainId: 17000, - }) + }); - const unauthorisedClient = secondClient + const unauthorisedClient = secondClient; it('should post latest terms and conditions acceptance signature', async () => { - const isAuthorised = await client.acceptObolLatestTermsAndConditions() - expect(isAuthorised).toEqual('successful authorization') - }) + const isAuthorised = await client.acceptObolLatestTermsAndConditions(); + expect(isAuthorised).toEqual('successful authorization'); + }); it('should post a cluster definition and return confighash for an authorised user', async () => { - configHash = await client.createClusterDefinition(clusterConfigV1X7) - expect(configHash).toHaveLength(66) - }) + configHash = await client.createClusterDefinition(clusterConfigV1X8); + expect(configHash).toHaveLength(66); + }); it('should throw on post a cluster without a signer', async () => { try { - await clientWithoutAsigner.createClusterDefinition(clusterConfigV1X7) + await clientWithoutAsigner.createClusterDefinition(clusterConfigV1X8); } catch (err: any) { - expect(err.message).toEqual('Signer is required in createClusterDefinition') + expect(err.message).toEqual( + 'Signer is required in createClusterDefinition', + ); } - }) + }); it('should throw on post a cluster if the user did not sign latest terms and conditions', async () => { try { - await unauthorisedClient.createClusterDefinition(clusterConfigV1X7) + await unauthorisedClient.createClusterDefinition(clusterConfigV1X8); } catch (err: any) { - expect(err.message).toEqual('Missing t&c signature') - expect(err.statusCode).toEqual(401) + expect(err.message).toEqual('Missing t&c signature'); + expect(err.statusCode).toEqual(401); } - }) + }); it('should fetch the cluster definition for the configHash', async () => { - clusterDefinition = await client.getClusterDefinition(configHash) - expect(clusterDefinition.config_hash).toEqual(configHash) - }) + clusterDefinition = await client.getClusterDefinition(configHash); + expect(clusterDefinition.config_hash).toEqual(configHash); + }); it('should fetch the cluster definition for the configHash without a signer', async () => { clusterDefinition = - await clientWithoutAsigner.getClusterDefinition(configHash) - expect(clusterDefinition.config_hash).toEqual(configHash) - }) + await clientWithoutAsigner.getClusterDefinition(configHash); + expect(clusterDefinition.config_hash).toEqual(configHash); + }); it('should throw on update a cluster that the operator is not part of', async () => { try { await client.acceptClusterDefinition( { enr, version: clusterDefinition.version }, configHash, - ) + ); } catch (err: any) { - expect(err.message).toEqual('Data not found') + expect(err.message).toEqual('Data not found'); } - }) + }); it('should throw on accept a cluster if the user did not sign latest terms and conditions', async () => { try { - await unauthorisedClient.acceptClusterDefinition({ enr, version: clusterDefinition.version }, + await unauthorisedClient.acceptClusterDefinition( + { enr, version: clusterDefinition.version }, configHash, - ) + ); } catch (err: any) { - expect(err.message).toEqual('Missing t&c signature') - expect(err.statusCode).toEqual(401) + expect(err.message).toEqual('Missing t&c signature'); + expect(err.statusCode).toEqual(401); } - }) + }); it('should update the cluster which the operator belongs to for an authorised user', async () => { - const signerAddress = await signer.getAddress() - clusterConfigV1X7.operators.push({ address: signerAddress }) + const signerAddress = await signer.getAddress(); + clusterConfigV1X8.operators.push({ address: signerAddress }); - secondConfigHash = await client.createClusterDefinition(clusterConfigV1X7) + secondConfigHash = await client.createClusterDefinition(clusterConfigV1X8); const definitionData: ClusterDefinition = await client.acceptClusterDefinition( { enr, version: clusterDefinition.version }, secondConfigHash, - ) + ); expect( definitionData.operators[definitionData.operators.length - 1].enr, - ).toEqual(enr) - }) + ).toEqual(enr); + }); it('should throw on update a cluster without a signer', async () => { try { await clientWithoutAsigner.acceptClusterDefinition( { enr, version: clusterDefinition.version }, configHash, - ) + ); } catch (err: any) { - expect(err.message).toEqual('Signer is required in acceptClusterDefinition') + expect(err.message).toEqual( + 'Signer is required in acceptClusterDefinition', + ); } - }) + }); afterAll(async () => { await request(app) - .delete(`/dv/${configHash}`) - .set('Authorization', `Bearer ${DEL_AUTH}`) + .delete(`/v1/definition/${configHash}`) + .set('Authorization', `Bearer ${DEL_AUTH}`); await request(app) - .delete(`/dv/${secondConfigHash}`) - .set('Authorization', `Bearer ${DEL_AUTH}`) - }) -}) + .delete(`/v1/definition/${secondConfigHash}`) + .set('Authorization', `Bearer ${DEL_AUTH}`); + }); +}); describe('Poll Cluster Lock', () => { // Test polling getClusterLock through mimicing the whole flow using obol-api endpoints - const { definition_hash: _, ...rest } = clusterLockV1X7.cluster_definition - const clusterWithoutDefHash = rest + const { definition_hash: _, ...rest } = clusterLockV1X8.cluster_definition; + const clusterWithoutDefHash = rest; const clientWithoutAsigner = new Client({ baseUrl: 'https://obol-api-nonprod-dev.dev.obol.tech', chainId: 17000, - }) + }); beforeAll(async () => { - await postClusterDef(clusterWithoutDefHash) - }) + await postClusterDef(clusterWithoutDefHash); + }); it('should make a GET request to the API periodically until a lock is returned', async () => { // Call two async operations in parallel, polling to fetch lockFile when exist and the whole process after the creator shares the link with operators @@ -151,30 +162,30 @@ describe('Poll Cluster Lock', () => { const pollReqIntervalId = setInterval(async function () { try { const lockFile = await client.getClusterLock( - clusterLockV1X7.cluster_definition.config_hash, - ) + clusterLockV1X8.cluster_definition.config_hash, + ); if (lockFile?.lock_hash) { - clearInterval(pollReqIntervalId) - resolve(lockFile) + clearInterval(pollReqIntervalId); + resolve(lockFile); } } catch (err: any) { // TODO(Hanan) Update this once the errors thrown from obol-api are updated - console.log(err) + console.log(err); } - }, 1000) + }, 1000); setTimeout(function () { - clearInterval(pollReqIntervalId) - reject(new Error('Time out')) - }, 5000) + clearInterval(pollReqIntervalId); + reject(new Error('Time out')); + }, 5000); }), (async () => { - await updateClusterDef(clusterLockV1X7.cluster_definition) - await publishLockFile(clusterLockV1X7) + await updateClusterDef(clusterLockV1X8.cluster_definition); + await publishLockFile(clusterLockV1X8); })(), - ]) - expect(lockObject).toHaveProperty('lock_hash') - }) + ]); + expect(lockObject).toHaveProperty('lock_hash'); + }); it('fetches a lock successfully without a signer', async () => { // Call two async operations in parallel, polling to fetch lockFile when exist and the whole process after the creator shares the link with operators @@ -183,56 +194,64 @@ describe('Poll Cluster Lock', () => { const pollReqIntervalId = setInterval(async function () { try { const lockFile = await clientWithoutAsigner.getClusterLock( - clusterLockV1X7.cluster_definition.config_hash, - ) + clusterLockV1X8.cluster_definition.config_hash, + ); if (lockFile?.lock_hash) { - clearInterval(pollReqIntervalId) - resolve(lockFile) + clearInterval(pollReqIntervalId); + resolve(lockFile); } } catch (err: any) { - console.log(err) + console.log(err); } - }, 1000) + }, 1000); setTimeout(function () { - clearInterval(pollReqIntervalId) - reject(new Error('Time out')) - }, 5000) + clearInterval(pollReqIntervalId); + reject(new Error('Time out')); + }, 5000); }), (async () => { - await updateClusterDef(clusterLockV1X7.cluster_definition) - await publishLockFile(clusterLockV1X7) + await updateClusterDef(clusterLockV1X8.cluster_definition); + await publishLockFile(clusterLockV1X8); })(), - ]) - expect(lockObject).toHaveProperty('lock_hash') - }) + ]); + expect(lockObject).toHaveProperty('lock_hash'); + }); it('should fetch the cluster definition for the configHash', async () => { const clusterDefinition: ClusterDefinition = await client.getClusterDefinition( - clusterLockV1X7.cluster_definition.config_hash, - ) + clusterLockV1X8.cluster_definition.config_hash, + ); + expect(clusterDefinition.deposit_amounts?.length).toEqual( + clusterLockV1X8.cluster_definition.deposit_amounts.length, + ); expect(clusterDefinition.config_hash).toEqual( - clusterLockV1X7.cluster_definition.config_hash, - ) - }) + clusterLockV1X8.cluster_definition.config_hash, + ); + }); - test.each([{ version: 'v1.6.0', clusterLock: clusterLockV1X6 }, { version: 'v1.7.0', clusterLock: clusterLockV1X7 }, { version: 'v1.8.0', clusterLock: clusterLockV1X8 }])( - '$version: \'should return true on verified cluster lock\'', + test.each([ + { version: 'v1.6.0', clusterLock: clusterLockV1X6 }, + { version: 'v1.7.0', clusterLock: clusterLockV1X7 }, + { version: 'v1.8.0', clusterLock: clusterLockV1X8 }, + ])( + "$version: 'should return true on verified cluster lock'", async ({ clusterLock }) => { - const isValidLock: boolean = await validateClusterLock(clusterLock) - expect(isValidLock).toEqual(true) - }) + const isValidLock: boolean = await validateClusterLock(clusterLock); + expect(isValidLock).toEqual(true); + }, + ); afterAll(async () => { - const configHash = clusterLockV1X7.cluster_definition.config_hash - const lockHash = clusterLockV1X7.lock_hash + const configHash = clusterLockV1X8.cluster_definition.config_hash; + const lockHash = clusterLockV1X8.lock_hash; await request(app) - .delete(`/lock/${lockHash}`) - .set('Authorization', `Bearer ${DEL_AUTH}`) + .delete(`/v1/lock/${lockHash}`) + .set('Authorization', `Bearer ${DEL_AUTH}`); await request(app) - .delete(`/dv/${configHash}`) - .set('Authorization', `Bearer ${DEL_AUTH}`) - }) -}) + .delete(`/v1/definition/${configHash}`) + .set('Authorization', `Bearer ${DEL_AUTH}`); + }); +}); diff --git a/test/sdk-package-test/package.json b/test/sdk-package-test/package.json index 354ce1b..f0c6b31 100755 --- a/test/sdk-package-test/package.json +++ b/test/sdk-package-test/package.json @@ -12,7 +12,7 @@ "build": "rm -rf dist && tsc", "test:e2e": "jest --config ./jest-e2e.json --runInBand --forceExit" }, - "author": "Obol Labs (https://obol.tech)", + "author": "Obol Labs (https://obol.org)", "publishConfig": { "access": "public" }, @@ -24,7 +24,7 @@ "bugs": { "url": "https://github.com/obolnetwork/obol-sdk/issues" }, - "homepage": "https://docs.obol.tech/", + "homepage": "https://docs.obol.org/", "dependencies": { "@obolnetwork/obol-sdk": "file:../..", "dotenv": "^16.3.1", diff --git a/test/sdk-package-test/utils.ts b/test/sdk-package-test/utils.ts index dcb5f98..80ee982 100644 --- a/test/sdk-package-test/utils.ts +++ b/test/sdk-package-test/utils.ts @@ -1,71 +1,69 @@ -import request from 'supertest' -import { ethers } from 'ethers' +import request from 'supertest'; +import { ethers } from 'ethers'; import { type ClusterDefinition, Client, type ClusterLock, -} from '@obolnetwork/obol-sdk' +} from '@obolnetwork/obol-sdk'; -const mnemonic = ethers.Wallet.createRandom().mnemonic?.phrase ?? '' +const mnemonic = ethers.Wallet.createRandom().mnemonic?.phrase ?? ''; -const privateKey = ethers.Wallet.fromPhrase(mnemonic).privateKey +const privateKey = ethers.Wallet.fromPhrase(mnemonic).privateKey; -const wallet = new ethers.Wallet(privateKey) +const wallet = new ethers.Wallet(privateKey); -export const signer = wallet.connect(null) +export const signer = wallet.connect(null); +/* eslint-disable */ export const client: Client = new Client( { baseUrl: 'https://obol-api-nonprod-dev.dev.obol.tech', chainId: 17000 }, signer as any, -) +); -const secondMnemonic = ethers.Wallet.createRandom().mnemonic?.phrase ?? '' +const secondMnemonic = ethers.Wallet.createRandom().mnemonic?.phrase ?? ''; -const secondprivateKey = ethers.Wallet.fromPhrase(secondMnemonic).privateKey +const secondprivateKey = ethers.Wallet.fromPhrase(secondMnemonic).privateKey; -const secondWallet = new ethers.Wallet(secondprivateKey) +const secondWallet = new ethers.Wallet(secondprivateKey); -export const secondSigner = secondWallet.connect(null) +export const secondSigner = secondWallet.connect(null); export const secondClient: Client = new Client( { baseUrl: 'https://obol-api-nonprod-dev.dev.obol.tech', chainId: 17000 }, secondSigner as any, -) +); -export const app = client.baseUrl +export const app = client.baseUrl; export const postClusterDef = async ( clusterWithoutDefHash: ClusterDefinition, ): Promise => { - const postAuth = clusterWithoutDefHash.creator.config_signature + const postAuth = clusterWithoutDefHash.creator.config_signature; const operatorsToPOST = clusterWithoutDefHash.operators.map( (operator: { address: any }) => { - return { address: operator.address } + return { address: operator.address }; }, - ) + ); try { await request(app) - .post('/dv') + .post('/v1/definition') .set('Authorization', `Bearer ${postAuth}`) - .send({ ...clusterWithoutDefHash, operators: operatorsToPOST }) + .send({ ...clusterWithoutDefHash, operators: operatorsToPOST }); } catch (error) { - throw error + throw error; } -} +}; export const updateClusterDef = async ( clusterDef: ClusterDefinition, ): Promise => { - const clusterOperators = clusterDef.operators + const clusterOperators = clusterDef.operators; for (const clusterOperator of clusterOperators) { try { await request(app) - .put(`/dv/${clusterDef.config_hash}`) - .set( - 'Authorization', - `Bearer ${clusterOperator.config_signature}`, - ) + .put(`/v1/definition/${clusterDef.config_hash}`) + .set('Authorization', `Bearer ${clusterOperator.config_signature}`) .send({ address: clusterOperator.address, enr: clusterOperator.enr, @@ -73,19 +71,19 @@ export const updateClusterDef = async ( config_signature: clusterOperator.config_signature, version: clusterDef.version, fork_version: clusterDef.fork_version, - }) + }); } catch (error) { - throw error + throw error; } } -} +}; export const publishLockFile = async ( clusterLock: ClusterLock, ): Promise => { try { - await request(app).post('/lock').send(clusterLock) + await request(app).post('/lock').send(clusterLock); } catch (error) { - throw error + throw error; } -} +}; diff --git a/test/sdk-package-test/yarn.lock b/test/sdk-package-test/yarn.lock index a88013e..77231d0 100644 --- a/test/sdk-package-test/yarn.lock +++ b/test/sdk-package-test/yarn.lock @@ -772,7 +772,7 @@ rimraf "^3.0.2" "@obolnetwork/obol-sdk@file:../..": - version "1.0.17" + version "1.0.16" dependencies: "@chainsafe/bls" "6.0.3" "@chainsafe/blst" "^0.2.9" @@ -1068,30 +1068,30 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz#90e2f76a5930d553ede124e1f541a39b4417465e" - integrity sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw== +"@typescript-eslint/eslint-plugin@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.15.0.tgz#8eaf396ac2992d2b8f874b68eb3fcd6b179cb7f3" + integrity sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.14.1" - "@typescript-eslint/type-utils" "7.14.1" - "@typescript-eslint/utils" "7.14.1" - "@typescript-eslint/visitor-keys" "7.14.1" + "@typescript-eslint/scope-manager" "7.15.0" + "@typescript-eslint/type-utils" "7.15.0" + "@typescript-eslint/utils" "7.15.0" + "@typescript-eslint/visitor-keys" "7.15.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.14.1.tgz#13d97f357aed3c5719f259a6cc3d1a1f065d3692" - integrity sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA== +"@typescript-eslint/parser@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.15.0.tgz#f4a536e5fc6a1c05c82c4d263a2bfad2da235c80" + integrity sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A== dependencies: - "@typescript-eslint/scope-manager" "7.14.1" - "@typescript-eslint/types" "7.14.1" - "@typescript-eslint/typescript-estree" "7.14.1" - "@typescript-eslint/visitor-keys" "7.14.1" + "@typescript-eslint/scope-manager" "7.15.0" + "@typescript-eslint/types" "7.15.0" + "@typescript-eslint/typescript-estree" "7.15.0" + "@typescript-eslint/visitor-keys" "7.15.0" debug "^4.3.4" "@typescript-eslint/parser@^6.4.0": @@ -1113,21 +1113,21 @@ "@typescript-eslint/types" "6.21.0" "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/scope-manager@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz#63de7a577bc6fe8ee6e412a5b85499f654b93ee5" - integrity sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA== +"@typescript-eslint/scope-manager@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.15.0.tgz#201b34b0720be8b1447df17b963941bf044999b2" + integrity sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw== dependencies: - "@typescript-eslint/types" "7.14.1" - "@typescript-eslint/visitor-keys" "7.14.1" + "@typescript-eslint/types" "7.15.0" + "@typescript-eslint/visitor-keys" "7.15.0" -"@typescript-eslint/type-utils@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz#c183f2f28c4c8578eb80aebc4ac9ace400160af6" - integrity sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ== +"@typescript-eslint/type-utils@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.15.0.tgz#5b83c904c6de91802fb399305a50a56d10472c39" + integrity sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg== dependencies: - "@typescript-eslint/typescript-estree" "7.14.1" - "@typescript-eslint/utils" "7.14.1" + "@typescript-eslint/typescript-estree" "7.15.0" + "@typescript-eslint/utils" "7.15.0" debug "^4.3.4" ts-api-utils "^1.3.0" @@ -1136,10 +1136,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/types@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.14.1.tgz#a43a540dbe5df7f2a11269683d777fc50b4350aa" - integrity sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg== +"@typescript-eslint/types@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.15.0.tgz#fb894373a6e3882cbb37671ffddce44f934f62fc" + integrity sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw== "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" @@ -1155,13 +1155,13 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz#ba7c9bac8744487749d19569e254d057754a1575" - integrity sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA== +"@typescript-eslint/typescript-estree@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.15.0.tgz#e323bfa3966e1485b638ce751f219fc1f31eba37" + integrity sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ== dependencies: - "@typescript-eslint/types" "7.14.1" - "@typescript-eslint/visitor-keys" "7.14.1" + "@typescript-eslint/types" "7.15.0" + "@typescript-eslint/visitor-keys" "7.15.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -1169,15 +1169,15 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.14.1.tgz#3307b8226f99103dca2133d0ebcae38419d82c9d" - integrity sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ== +"@typescript-eslint/utils@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.15.0.tgz#9e6253c4599b6e7da2fb64ba3f549c73eb8c1960" + integrity sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.14.1" - "@typescript-eslint/types" "7.14.1" - "@typescript-eslint/typescript-estree" "7.14.1" + "@typescript-eslint/scope-manager" "7.15.0" + "@typescript-eslint/types" "7.15.0" + "@typescript-eslint/typescript-estree" "7.15.0" "@typescript-eslint/visitor-keys@6.21.0": version "6.21.0" @@ -1187,12 +1187,12 @@ "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz#cc79b5ea154aea734b2a13b983670749f5742274" - integrity sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA== +"@typescript-eslint/visitor-keys@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.15.0.tgz#1da0726201a859343fe6a05742a7c1792fff5b66" + integrity sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw== dependencies: - "@typescript-eslint/types" "7.14.1" + "@typescript-eslint/types" "7.15.0" eslint-visitor-keys "^3.4.3" "@zxing/text-encoding@0.9.0": @@ -1982,9 +1982,9 @@ dotenv@*, dotenv@^16.3.1: integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== electron-to-chromium@^1.4.796: - version "1.4.815" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.815.tgz#e901b195c57c3e0fae8dc6d596e4188a33c3e82c" - integrity sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg== + version "1.4.816" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz#3624649d1e7fde5cdbadf59d31a524245d8ee85f" + integrity sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw== elliptic@^6.5.4: version "6.5.5" @@ -4218,9 +4218,9 @@ punycode@^2.1.0: integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@^6.11.0: - version "6.12.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" - integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== + version "6.12.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.2.tgz#5443b587f3bf73ac68968de491e5b25bafe04478" + integrity sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg== dependencies: side-channel "^1.0.6" @@ -4809,13 +4809,13 @@ typed-array-length@^1.0.6: possible-typed-array-names "^1.0.0" typescript-eslint@^7.1.0: - version "7.14.1" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.14.1.tgz#5c1a7d758527321a120adbe9588baef8e5074300" - integrity sha512-Eo1X+Y0JgGPspcANKjeR6nIqXl4VL5ldXLc15k4m9upq+eY5fhU2IueiEZL6jmHrKH8aCfbIvM/v3IrX5Hg99w== + version "7.15.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.15.0.tgz#44caca31461cc8afa829c4e5ab11aa9e0f7e175d" + integrity sha512-Ta40FhMXBCwHura4X4fncaCVkVcnJ9jnOq5+Lp4lN8F4DzHZtOwZdRvVBiNUGznUDHPwdGnrnwxmUOU2fFQqFA== dependencies: - "@typescript-eslint/eslint-plugin" "7.14.1" - "@typescript-eslint/parser" "7.14.1" - "@typescript-eslint/utils" "7.14.1" + "@typescript-eslint/eslint-plugin" "7.15.0" + "@typescript-eslint/parser" "7.15.0" + "@typescript-eslint/utils" "7.15.0" uint8arrays@1.1.0, uint8arrays@^1.1.0: version "1.1.0" diff --git a/yarn.lock b/yarn.lock index 5e235c1..0a0e47a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,156 +14,159 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.24.2" + "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.23.5": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" + integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" + integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helpers" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== +"@babel/generator@^7.24.7", "@babel/generator@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== dependencies: - "@babel/types" "^7.24.5" + "@babel/types" "^7.24.7" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@babel/helper-compilation-targets@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" + integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" + "@babel/compat-data" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" - -"@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== - -"@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-split-export-declaration@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" - integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== - dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" + integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" + integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" + integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + +"@babel/helpers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" + integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -250,44 +253,44 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@^7.24.5", "@babel/traverse@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/template@^7.24.7", "@babel/template@^7.3.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.24.7", "@babel/traverse@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.3.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -344,9 +347,9 @@ randombytes "^2.1.0" "@chainsafe/blst@^0.2.9": - version "0.2.10" - resolved "https://registry.yarnpkg.com/@chainsafe/blst/-/blst-0.2.10.tgz#77802e5b1ff2d98ec1d25dcd5f7d27b89d376a40" - integrity sha512-ofecTL5fWsNwnpS2oUh56dDXJRmCEcDKNNBFDb2ux+WtvdjrdSq6B+L/eNlg+sVBzXbzrCw1jq8Y8+cYiHg32w== + version "0.2.11" + resolved "https://registry.yarnpkg.com/@chainsafe/blst/-/blst-0.2.11.tgz#5ec85cd663592819d1dc51127e75dfd834250e3d" + integrity sha512-URyOLq5GtxBoxibOnd2pgLydCy0UZzbiIIBcsRAvGxAsRzjZL04TsQfwRkz5aphU3a1ebeRoMmI/HHyMCiFSQg== dependencies: "@types/tar" "^6.1.4" node-fetch "^2.6.1" @@ -505,10 +508,10 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.6.1": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -597,41 +600,43 @@ integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== "@inquirer/confirm@^3.0.0": - version "3.1.7" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.7.tgz#4568196121e4d26681fc2ff8f1f8d0f2f15e9b73" - integrity sha512-BZjjj19W8gnh5UGFTdP5ZxpgMNRjy03Dzq3k28sB2MDlEUFrcyTkMEoGgvBmGpUw0vNBoCJkTcbHZ3e9tb+d+w== + version "3.1.12" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.12.tgz#9727d43116c0c4cfc292ed0b37a5b0abb5a82fde" + integrity sha512-s5Sod79QsBBi5Qm7zxCq9DcAD0i7WRcjd/LzsiIAWqWZKW4+OJTGrCgVSLGIHTulwbZgdxM4AAxpCXe86hv4/Q== dependencies: - "@inquirer/core" "^8.2.0" - "@inquirer/type" "^1.3.1" + "@inquirer/core" "^9.0.0" + "@inquirer/type" "^1.4.0" -"@inquirer/core@^8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-8.2.0.tgz#524ab7a6737958011f40959a1d0e5a8b90ff3471" - integrity sha512-pexNF9j2orvMMTgoQ/uKOw8V6/R7x/sIDwRwXRhl4i0pPSh6paRzFehpFKpfMbqix1/+gzCekhYTmVbQpWkVjQ== +"@inquirer/core@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.0.0.tgz#e039fff684b9cd615c3b0071519a8beb82944254" + integrity sha512-y3q+fkCTGmvwk9Wf6yZlI3QGlLXbEm5M7Y7Eh8abaUbv+ffvmw2aB4FxSUrWaoaozwvEJSG60raHbCaUorXEzA== dependencies: - "@inquirer/figures" "^1.0.1" - "@inquirer/type" "^1.3.1" + "@inquirer/figures" "^1.0.3" + "@inquirer/type" "^1.4.0" "@types/mute-stream" "^0.0.4" - "@types/node" "^20.12.11" + "@types/node" "^20.14.9" "@types/wrap-ansi" "^3.0.0" ansi-escapes "^4.3.2" - chalk "^4.1.2" cli-spinners "^2.9.2" cli-width "^4.1.0" mute-stream "^1.0.0" signal-exit "^4.1.0" strip-ansi "^6.0.1" wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.1" -"@inquirer/figures@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.1.tgz#d65f0bd0e9511a90b4d3543ee6a3ce7211f29417" - integrity sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw== +"@inquirer/figures@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.3.tgz#1227cc980f88e6d6ab85abadbf164f5038041edd" + integrity sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw== -"@inquirer/type@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.3.1.tgz#afb95ff78f44fff7e8a00e17d5820db6add2a076" - integrity sha512-Pe3PFccjPVJV1vtlfVvm9OnlbxqdnP5QcscFEFEnK5quChf1ufZtM0r8mR5ToWHMxZOh0s8o/qp9ANGRTo/DAw== +"@inquirer/type@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.4.0.tgz#3dd0c8f78c0548bbc18b9c07af16a86c4007e1f0" + integrity sha512-AjOqykVyjdJQvtfkNDGUyMYGF8xN50VUxftCQWsOyIo4DFRLr6VQhW0VItGI1JIyQGCGgIpKa7hMMwNhZb4OIw== + dependencies: + mute-stream "^1.0.0" "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -886,20 +891,13 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@ljharb/through@^2.3.13": - version "2.3.13" - resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.13.tgz#b7e4766e0b65aa82e529be945ab078de79874edc" - integrity sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ== - dependencies: - call-bind "^1.0.7" - "@metamask/abi-utils@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@metamask/abi-utils/-/abi-utils-2.0.2.tgz#ad394e9cb8a95ac177cad942daadd88a246c0de8" - integrity sha512-B/A1dY/w4F/t6cDHUscklO6ovb/ztFsrsTXFd8QlqSByk/vyy+QbPE3VVpmmyI/7RX+PA1AJcvBdzCIz+r9dVQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@metamask/abi-utils/-/abi-utils-2.0.3.tgz#6316a9aa832621037e27a2ac391251860410802a" + integrity sha512-0PbzS6AtSmgwHxi7dYb+/Q7KszcKKg9rqjXKFcGJgSx7GnD7iY+O9O6O45G/gQ2+sOy+FYUVDsFQW7yKCZ9EVQ== dependencies: - "@metamask/utils" "^8.0.0" - superstruct "^1.0.3" + "@metamask/superstruct" "^3.0.0" + "@metamask/utils" "^8.5.0" "@metamask/eth-sig-util@^7.0.1": version "7.0.2" @@ -913,25 +911,30 @@ ethereum-cryptography "^2.1.2" tweetnacl "^1.0.3" -"@metamask/utils@^8.0.0", "@metamask/utils@^8.1.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.4.0.tgz#f44812c96467a4e1b70b2edff6ee89a9caa4e354" - integrity sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg== +"@metamask/superstruct@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@metamask/superstruct/-/superstruct-3.1.0.tgz#148f786a674fba3ac885c1093ab718515bf7f648" + integrity sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA== + +"@metamask/utils@^8.1.0", "@metamask/utils@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.5.0.tgz#ddd0d4012d5191809404c97648a837ea9962cceb" + integrity sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ== dependencies: "@ethereumjs/tx" "^4.2.0" + "@metamask/superstruct" "^3.0.0" "@noble/hashes" "^1.3.1" "@scure/base" "^1.1.3" "@types/debug" "^4.1.7" debug "^4.3.4" pony-cause "^2.1.10" semver "^7.5.4" - superstruct "^1.0.3" uuid "^9.0.1" "@mswjs/cookies@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-1.1.0.tgz#1528eb43630caf83a1d75d5332b30e75e9bb1b5b" - integrity sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-1.1.1.tgz#8b519e2bd8f1577c530beed44a25578eb9a6e72c" + integrity sha512-W68qOHEjx1iD+4VjQudlx26CPIoxmIAtK4ZCexU0/UJBG6jYhcuyzKJx+Iw8uhBIGd9eba64XgWVgo20it1qwA== "@mswjs/interceptors@^0.29.0": version "0.29.1" @@ -950,24 +953,19 @@ resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== -"@noble/curves@1.3.0", "@noble/curves@~1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" - integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== dependencies: - "@noble/hashes" "1.3.3" + "@noble/hashes" "1.4.0" "@noble/hashes@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== -"@noble/hashes@1.3.3", "@noble/hashes@~1.3.2": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" - integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== - -"@noble/hashes@^1.2.0", "@noble/hashes@^1.3.0", "@noble/hashes@^1.3.1": +"@noble/hashes@1.4.0", "@noble/hashes@^1.2.0", "@noble/hashes@^1.3.0", "@noble/hashes@^1.3.1", "@noble/hashes@~1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== @@ -1049,34 +1047,29 @@ "@octokit/types" "^13.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^20.0.0": - version "20.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" - integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== - "@octokit/openapi-types@^22.2.0": version "22.2.0" resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== -"@octokit/plugin-paginate-rest@^9.1.5": - version "9.2.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz#2e2a2f0f52c9a4b1da1a3aa17dabe3c459b9e401" - integrity sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw== +"@octokit/plugin-paginate-rest@11.3.1": + version "11.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz#fe92d04b49f134165d6fbb716e765c2f313ad364" + integrity sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g== dependencies: - "@octokit/types" "^12.6.0" + "@octokit/types" "^13.5.0" "@octokit/plugin-request-log@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958" integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== -"@octokit/plugin-rest-endpoint-methods@^10.2.0": - version "10.4.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz#41ba478a558b9f554793075b2e20cd2ef973be17" - integrity sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg== +"@octokit/plugin-rest-endpoint-methods@13.2.2": + version "13.2.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz#af8e5dd2cddfea576f92ffaf9cb84659f302a638" + integrity sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA== dependencies: - "@octokit/types" "^12.6.0" + "@octokit/types" "^13.5.0" "@octokit/request-error@^5.1.0": version "5.1.0" @@ -1097,24 +1090,17 @@ "@octokit/types" "^13.1.0" universal-user-agent "^6.0.0" -"@octokit/rest@20.1.0": - version "20.1.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.1.0.tgz#78310528f4849a69b44b15ccd27f99c7e737bb7d" - integrity sha512-STVO3itHQLrp80lvcYB2UIKoeil5Ctsgd2s1AM+du3HqZIR35ZH7WE9HLwUOLXH0myA0y3AGNPo8gZtcgIbw0g== +"@octokit/rest@20.1.1": + version "20.1.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.1.1.tgz#ec775864f53fb42037a954b9a40d4f5275b3dc95" + integrity sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw== dependencies: "@octokit/core" "^5.0.2" - "@octokit/plugin-paginate-rest" "^9.1.5" + "@octokit/plugin-paginate-rest" "11.3.1" "@octokit/plugin-request-log" "^4.0.0" - "@octokit/plugin-rest-endpoint-methods" "^10.2.0" + "@octokit/plugin-rest-endpoint-methods" "13.2.2" -"@octokit/types@^12.6.0": - version "12.6.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2" - integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw== - dependencies: - "@octokit/openapi-types" "^20.0.0" - -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0": +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.5.0": version "13.5.0" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.5.0.tgz#4796e56b7b267ebc7c921dcec262b3d5bfb18883" integrity sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ== @@ -1228,27 +1214,27 @@ conventional-recommended-bump "^9.0.0" semver "^7.5.4" -"@scure/base@^1.1.3", "@scure/base@~1.1.3", "@scure/base@~1.1.4": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d" - integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g== +"@scure/base@^1.1.3", "@scure/base@~1.1.3", "@scure/base@~1.1.6": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.7.tgz#fe973311a5c6267846aa131bc72e96c5d40d2b30" + integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== -"@scure/bip32@1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.3.tgz#a9624991dc8767087c57999a5d79488f48eae6c8" - integrity sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ== +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== dependencies: - "@noble/curves" "~1.3.0" - "@noble/hashes" "~1.3.2" - "@scure/base" "~1.1.4" + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" -"@scure/bip39@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.2.tgz#f3426813f4ced11a47489cbcf7294aa963966527" - integrity sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA== +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== dependencies: - "@noble/hashes" "~1.3.2" - "@scure/base" "~1.1.4" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" "@sinclair/typebox@^0.24.1": version "0.24.51" @@ -1323,9 +1309,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" @@ -1421,10 +1407,10 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^20.12.11", "@types/node@^20.2.5": - version "20.12.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" - integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== +"@types/node@*", "@types/node@>=13.7.0", "@types/node@^20.14.9", "@types/node@^20.2.5": + version "20.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" + integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== dependencies: undici-types "~5.26.4" @@ -1493,30 +1479,30 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz#093b96fc4e342226e65d5f18f9c87081e0b04a31" - integrity sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA== +"@typescript-eslint/eslint-plugin@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.15.0.tgz#8eaf396ac2992d2b8f874b68eb3fcd6b179cb7f3" + integrity sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.9.0" - "@typescript-eslint/type-utils" "7.9.0" - "@typescript-eslint/utils" "7.9.0" - "@typescript-eslint/visitor-keys" "7.9.0" + "@typescript-eslint/scope-manager" "7.15.0" + "@typescript-eslint/type-utils" "7.15.0" + "@typescript-eslint/utils" "7.15.0" + "@typescript-eslint/visitor-keys" "7.15.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.9.0.tgz#fb3ba01b75e0e65cb78037a360961b00301f6c70" - integrity sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ== +"@typescript-eslint/parser@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.15.0.tgz#f4a536e5fc6a1c05c82c4d263a2bfad2da235c80" + integrity sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A== dependencies: - "@typescript-eslint/scope-manager" "7.9.0" - "@typescript-eslint/types" "7.9.0" - "@typescript-eslint/typescript-estree" "7.9.0" - "@typescript-eslint/visitor-keys" "7.9.0" + "@typescript-eslint/scope-manager" "7.15.0" + "@typescript-eslint/types" "7.15.0" + "@typescript-eslint/typescript-estree" "7.15.0" + "@typescript-eslint/visitor-keys" "7.15.0" debug "^4.3.4" "@typescript-eslint/parser@^6.4.0": @@ -1538,21 +1524,21 @@ "@typescript-eslint/types" "6.21.0" "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/scope-manager@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz#1dd3e63a4411db356a9d040e75864851b5f2619b" - integrity sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ== +"@typescript-eslint/scope-manager@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.15.0.tgz#201b34b0720be8b1447df17b963941bf044999b2" + integrity sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw== dependencies: - "@typescript-eslint/types" "7.9.0" - "@typescript-eslint/visitor-keys" "7.9.0" + "@typescript-eslint/types" "7.15.0" + "@typescript-eslint/visitor-keys" "7.15.0" -"@typescript-eslint/type-utils@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz#f523262e1b66ca65540b7a65a1222db52e0a90c9" - integrity sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA== +"@typescript-eslint/type-utils@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.15.0.tgz#5b83c904c6de91802fb399305a50a56d10472c39" + integrity sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg== dependencies: - "@typescript-eslint/typescript-estree" "7.9.0" - "@typescript-eslint/utils" "7.9.0" + "@typescript-eslint/typescript-estree" "7.15.0" + "@typescript-eslint/utils" "7.15.0" debug "^4.3.4" ts-api-utils "^1.3.0" @@ -1561,10 +1547,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/types@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.9.0.tgz#b58e485e4bfba055659c7e683ad4f5f0821ae2ec" - integrity sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w== +"@typescript-eslint/types@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.15.0.tgz#fb894373a6e3882cbb37671ffddce44f934f62fc" + integrity sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw== "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" @@ -1580,13 +1566,13 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz#3395e27656060dc313a6b406c3a298b729685e07" - integrity sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg== +"@typescript-eslint/typescript-estree@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.15.0.tgz#e323bfa3966e1485b638ce751f219fc1f31eba37" + integrity sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ== dependencies: - "@typescript-eslint/types" "7.9.0" - "@typescript-eslint/visitor-keys" "7.9.0" + "@typescript-eslint/types" "7.15.0" + "@typescript-eslint/visitor-keys" "7.15.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -1594,15 +1580,15 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.9.0.tgz#1b96a34eefdca1c820cb1bbc2751d848b4540899" - integrity sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA== +"@typescript-eslint/utils@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.15.0.tgz#9e6253c4599b6e7da2fb64ba3f549c73eb8c1960" + integrity sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.9.0" - "@typescript-eslint/types" "7.9.0" - "@typescript-eslint/typescript-estree" "7.9.0" + "@typescript-eslint/scope-manager" "7.15.0" + "@typescript-eslint/types" "7.15.0" + "@typescript-eslint/typescript-estree" "7.15.0" "@typescript-eslint/visitor-keys@6.21.0": version "6.21.0" @@ -1612,12 +1598,12 @@ "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz#82162656e339c3def02895f5c8546f6888d9b9ea" - integrity sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ== +"@typescript-eslint/visitor-keys@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.15.0.tgz#1da0726201a859343fe6a05742a7c1792fff5b66" + integrity sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw== dependencies: - "@typescript-eslint/types" "7.9.0" + "@typescript-eslint/types" "7.15.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -1649,9 +1635,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" + integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== add-stream@^1.0.0: version "1.0.0" @@ -1703,9 +1689,9 @@ ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.12.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== + version "8.16.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" + integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== dependencies: fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" @@ -1726,6 +1712,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: dependencies: type-fest "^0.21.3" +ansi-escapes@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f" + integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1760,7 +1751,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.1.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -1865,18 +1856,6 @@ array.prototype.flatmap@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.map@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.7.tgz#82fa4d6027272d1fca28a63bbda424d0185d78a7" - integrity sha512-XpcFfLoBEAhezrrNw1V+yLXkE7M6uR7xJEsxbG6c/V9v043qurwVJB9r9UTnoSioFDoz1i1VOydpWGmJpfVZbg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-array-method-boxes-properly "^1.0.0" - es-object-atoms "^1.0.0" - is-string "^1.0.7" - arraybuffer.prototype.slice@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" @@ -2115,12 +2094,12 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brorand@^1.1.0: version "1.1.0" @@ -2128,14 +2107,14 @@ brorand@^1.1.0: integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browserslist@^4.22.2: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + update-browserslist-db "^1.0.16" bs-logger@0.x: version "0.2.6" @@ -2197,9 +2176,9 @@ bundle-name@^4.1.0: run-applescript "^7.0.0" bundle-require@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-4.1.0.tgz#3d5fcd19d5160d4cbac5e95ed5a394d1ecd40ce6" - integrity sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg== + version "4.2.1" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-4.2.1.tgz#4c450a5807381d20ade987bde8ac391544257919" + integrity sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA== dependencies: load-tsconfig "^0.2.3" @@ -2281,12 +2260,12 @@ camelcase@^7.0.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== -caniuse-lite@^1.0.30001587: - version "1.0.30001618" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz#fad74fa006aef0f01e8e5c0a5540c74d8d36ec6f" - integrity sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg== +caniuse-lite@^1.0.30001629: + version "1.0.30001639" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz#972b3a6adeacdd8f46af5fc7f771e9639f6c1521" + integrity sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg== -chalk@5.3.0, chalk@^5.2.0, chalk@^5.3.0: +chalk@5.3.0, chalk@^5.2.0, chalk@^5.3.0, chalk@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== @@ -2392,6 +2371,14 @@ cli-spinners@^2.5.0, cli-spinners@^2.9.2: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + cli-width@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" @@ -2450,11 +2437,21 @@ color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@~12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -2741,10 +2738,10 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" @@ -2913,10 +2910,10 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -electron-to-chromium@^1.4.668: - version "1.4.770" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.770.tgz#a26df8541a7fd92d938a2b42c70ba2502d0e9c62" - integrity sha512-ONwOsDiVvV07CMsyH4+dEaZ9L79HMH/ODHnDS3GkIhgNqdDHJN2C18kFb0fBj0RXpQywsPJl6k2Pqg1IY4r1ig== +electron-to-chromium@^1.4.796: + version "1.4.816" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz#3624649d1e7fde5cdbadf59d31a524245d8ee85f" + integrity sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw== elliptic@^6.5.4: version "6.5.5" @@ -3032,11 +3029,6 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 unbox-primitive "^1.0.2" which-typed-array "^1.1.15" -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -3049,21 +3041,6 @@ es-errors@^1.2.1, es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-get-iterator@^1.0.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" @@ -3160,10 +3137,10 @@ escodegen@^2.1.0: optionalDependencies: source-map "~0.6.1" -eslint-compat-utils@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz#f7b2eb2befec25a370fac76934d3f9189f312a65" - integrity sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg== +eslint-compat-utils@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" + integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== dependencies: semver "^7.5.4" @@ -3197,13 +3174,13 @@ eslint-module-utils@^2.8.0: debug "^3.2.7" eslint-plugin-es-x@^7.5.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz#ccee7a4556c0f816d1ae88fd0eea21540e8ccd65" - integrity sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA== + version "7.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz#a207aa08da37a7923f2a9599e6d3eb73f3f92b74" + integrity sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== dependencies: "@eslint-community/eslint-utils" "^4.1.2" - "@eslint-community/regexpp" "^4.6.0" - eslint-compat-utils "^0.5.0" + "@eslint-community/regexpp" "^4.11.0" + eslint-compat-utils "^0.5.1" eslint-plugin-import@^2.29.1: version "2.29.1" @@ -3246,9 +3223,9 @@ eslint-plugin-n@^16.6.2: semver "^7.5.3" eslint-plugin-promise@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" - integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + version "6.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.4.0.tgz#54926d53c79541efe9cea6ac1d823a58bbed1106" + integrity sha512-/KWWRaD3fGkVCZsdR0RU53PSthFmoHVhZl+y9+6DqeDLSikLdlUVpVEAmI6iCRR5QyOjBYBqHZV/bdv4DJ4Gtw== eslint-scope@^7.2.2: version "7.2.2" @@ -3346,14 +3323,14 @@ esutils@^2.0.2: integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz#1352270ed3b339fe25af5ceeadcf1b9c8e30768a" - integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== dependencies: - "@noble/curves" "1.3.0" - "@noble/hashes" "1.3.3" - "@scure/bip32" "1.3.3" - "@scure/bip39" "1.2.2" + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" ethers@6.4.0: version "6.4.0" @@ -3368,12 +3345,17 @@ ethers@6.4.0: tslib "2.4.0" ws "8.5.0" +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + 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== -execa@8.0.1: +execa@8.0.1, execa@~8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== @@ -3498,10 +3480,10 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -3551,9 +3533,9 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -3744,15 +3726,16 @@ glob-parent@^6.0.2: is-glob "^4.0.3" glob@^10.3.10: - version "10.3.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.15.tgz#e72bc61bc3038c90605f5dd48543dc67aaf3b50d" - integrity sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw== + version "10.4.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" + integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.6" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.11.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" glob@^7.0.0, glob@^7.1.3, glob@^7.1.4: version "7.2.3" @@ -3793,10 +3776,10 @@ globalthis@^1.0.3: define-properties "^1.2.1" gopd "^1.0.1" -globby@14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.1.tgz#a1b44841aa7f4c6d8af2bc39951109d77301959b" - integrity sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ== +globby@14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.2.tgz#06554a54ccfe9264e5a9ff8eded46aa1e306482f" + integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw== dependencies: "@sindresorhus/merge-streams" "^2.1.0" fast-glob "^3.3.2" @@ -3874,9 +3857,9 @@ graphemer@^1.4.0: integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== graphql@^16.8.1: - version "16.8.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" - integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== + version "16.9.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" + integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== handlebars@^4.7.7: version "4.7.8" @@ -4018,10 +4001,10 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" - integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== +https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== dependencies: agent-base "^7.0.2" debug "4" @@ -4043,6 +4026,11 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +husky@^9.0.11: + version "9.0.11" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" + integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -4126,19 +4114,15 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@9.2.19: - version "9.2.19" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.19.tgz#e142ebc111b6328a21eb84d8e7dd226ff824239e" - integrity sha512-WpxOT71HGsFya6/mj5PUue0sWwbpbiPfAR+332zLj/siB0QA1PZM8v3GepegFV1Op189UxHUCF6y8AySdtOMVA== +inquirer@9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.3.2.tgz#9bc5ced19f572e848044baa05094a498f1e448c6" + integrity sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw== dependencies: - "@inquirer/figures" "^1.0.1" - "@ljharb/through" "^2.3.13" + "@inquirer/figures" "^1.0.3" ansi-escapes "^4.3.2" - chalk "^5.3.0" - cli-cursor "^3.1.0" cli-width "^4.1.0" external-editor "^3.1.0" - lodash "^4.17.21" mute-stream "1.0.0" ora "^5.4.1" run-async "^3.0.0" @@ -4146,8 +4130,9 @@ inquirer@9.2.19: string-width "^4.2.3" strip-ansi "^6.0.1" wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.1" -internal-slot@^1.0.4, internal-slot@^1.0.7: +internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== @@ -4182,7 +4167,7 @@ ip6addr@^0.2.3: assert-plus "^1.0.0" jsprim "^2.0.2" -is-arguments@^1.0.4, is-arguments@^1.1.1: +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== @@ -4244,12 +4229,12 @@ is-ci@3.0.1: dependencies: ci-info "^3.2.0" -is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.8.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" + integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-data-view@^1.0.1: version "1.0.1" @@ -4280,6 +4265,18 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -4341,11 +4338,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-map@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - is-nan@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" @@ -4399,11 +4391,6 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-set@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" @@ -4516,10 +4503,10 @@ iso-random-stream@^2.0.0: events "^3.3.0" readable-stream "^3.4.0" -issue-parser@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-7.0.0.tgz#27b832c5f5967da897e08ca1949d188e98873b1a" - integrity sha512-jgAw78HO3gs9UrKqJNQvfDj9Ouy8Mhu40fbEJ8yXff4MW8+/Fcn9iFjyWUQ6SKbX8ipPk3X5A3AyfYHRu6uVLw== +issue-parser@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-7.0.1.tgz#8a053e5a4952c75bb216204e454b4fc7d4cc9637" + integrity sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg== dependencies: lodash.capitalize "^4.2.1" lodash.escaperegexp "^4.1.2" @@ -4569,23 +4556,10 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterate-iterator@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.2.tgz#551b804c9eaa15b847ea6a7cdc2f5bf1ec150f91" - integrity sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw== - -iterate-value@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" - integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== - dependencies: - es-get-iterator "^1.0.2" - iterate-iterator "^1.0.1" - -jackspeak@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== +jackspeak@^3.1.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" + integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -5047,9 +5021,9 @@ json5@^2.2.1, json5@^2.2.3: integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" - integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== jsonfile@^6.0.1: version "6.1.0" @@ -5153,6 +5127,11 @@ lilconfig@^2.0.5: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== +lilconfig@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -5163,6 +5142,34 @@ lines-and-columns@^2.0.3: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== +lint-staged@^15.2.2: + version "15.2.7" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.7.tgz#97867e29ed632820c0fb90be06cd9ed384025649" + integrity sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw== + dependencies: + chalk "~5.3.0" + commander "~12.1.0" + debug "~4.3.4" + execa "~8.0.1" + lilconfig "~3.1.1" + listr2 "~8.2.1" + micromatch "~4.0.7" + pidtree "~0.6.0" + string-argv "~0.3.2" + yaml "~2.4.2" + +listr2@~8.2.1: + version "8.2.3" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.3.tgz#c494bb89b34329cf900e4e0ae8aeef9081d7d7a5" + integrity sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.0.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -5244,7 +5251,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== -lodash@4.17.21, lodash@^4.17.21: +lodash@4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5265,6 +5272,17 @@ log-symbols@^6.0.0: chalk "^5.3.0" is-unicode-supported "^1.3.0" +log-update@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" + integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== + dependencies: + ansi-escapes "^6.2.0" + cli-cursor "^4.0.0" + slice-ansi "^7.0.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -5276,9 +5294,9 @@ lowercase-keys@^3.0.0: integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== lru-cache@^10.0.1, lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.3.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" + integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== lru-cache@^5.1.1: version "5.1.1" @@ -5380,12 +5398,12 @@ micro-ftch@^0.3.1: resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.4, micromatch@~4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -5444,10 +5462,10 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.1, minimatch@^9.0.3, minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== +minimatch@^9.0.3, minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -5512,10 +5530,10 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" - integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minizlib@^2.0.0, minizlib@^2.1.1: version "2.1.2" @@ -5541,9 +5559,9 @@ ms@^2.0.0, ms@^2.1.1: integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== msw@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/msw/-/msw-2.3.0.tgz#7d48ab8472a435878f4ee94dfa0efcd2b3c2264b" - integrity sha512-cDr1q/QTMzaWhY8n9lpGhceY209k29UZtdTgJ3P8Bzne3TSMchX2EM/ldvn4ATLOktpCefCU2gcEgzHc31GTPw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.3.1.tgz#bfc73e256ffc2c74ec4381b604abb258df35f32b" + integrity sha512-ocgvBCLn/5l3jpl1lssIb3cniuACJLoOfZu01e3n5dbJrpA5PeeWn28jCLgQDNt6d7QT8tF2fYRzm9JoEHtiig== dependencies: "@bundled-es-modules/cookie" "^2.0.0" "@bundled-es-modules/statuses" "^1.0.1" @@ -5654,9 +5672,9 @@ mz@^2.7.0: thenify-all "^1.0.0" nan@^2.14.2: - version "2.19.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0" - integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw== + version "2.20.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" + integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== native-fetch@^3.0.0: version "3.0.0" @@ -5794,12 +5812,11 @@ normalize-package-data@^2.3.2: validate-npm-package-license "^3.0.1" normalize-package-data@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.1.tgz#fa69e9452210f0fabf4d79ee08d0c2870c51ed88" - integrity sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ== + version "6.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" + integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== dependencies: hosted-git-info "^7.0.0" - is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" @@ -5858,9 +5875,9 @@ object-assign@^4.0.1: integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== object-is@^1.1.5: version "1.1.6" @@ -6064,20 +6081,20 @@ p-try@^2.0.0: integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pac-proxy-agent@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" - integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== + version "7.0.2" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz#0fb02496bd9fb8ae7eb11cfd98386daaac442f58" + integrity sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" agent-base "^7.0.2" debug "^4.3.4" get-uri "^6.0.1" http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.2" - pac-resolver "^7.0.0" - socks-proxy-agent "^8.0.2" + https-proxy-agent "^7.0.5" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.4" -pac-resolver@^7.0.0: +pac-resolver@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== @@ -6085,6 +6102,11 @@ pac-resolver@^7.0.0: degenerator "^5.0.0" netmask "^2.0.2" +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + package-json@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" @@ -6180,7 +6202,7 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.11.0: +path-scurry@^1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== @@ -6253,6 +6275,11 @@ pidtree@^0.3.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== +pidtree@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -6293,6 +6320,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prettier@^3.2.5: + version "3.3.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" + integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== + pretty-format@^28.0.0, pretty-format@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" @@ -6316,18 +6348,6 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -promise.allsettled@1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.7.tgz#b9dd51e9cffe496243f5271515652c468865f2d8" - integrity sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA== - dependencies: - array.prototype.map "^1.0.5" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - iterate-value "^1.0.2" - prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -6531,22 +6551,22 @@ registry-url@^6.0.0: rc "1.2.8" release-it@^17.2.1: - version "17.2.1" - resolved "https://registry.yarnpkg.com/release-it/-/release-it-17.2.1.tgz#1d5bbc32023a79a819cf66807485126f19f127fd" - integrity sha512-zBOpaHyjrXC3g/9rHyQlvuDw9yCn9AGphrlL+t3gWNEhbZKEQ62WNY45JxllcJMNx9orQUxBZ3o7pVCqkeuTbg== + version "17.4.1" + resolved "https://registry.yarnpkg.com/release-it/-/release-it-17.4.1.tgz#186f700064565afe5ca2265f1589fe7b8d3128ff" + integrity sha512-Aa48kKx5qZRVXJ6YCnCJRg6sJiofEX7RErTLmnlFbCE7k1Kg8ayhgJovofuBhCtz3FRdsYnxBKjlh+VAMeazEA== dependencies: "@iarna/toml" "2.2.5" - "@octokit/rest" "20.1.0" + "@octokit/rest" "20.1.1" async-retry "1.3.3" chalk "5.3.0" cosmiconfig "9.0.0" execa "8.0.1" git-url-parse "14.0.0" - globby "14.0.1" + globby "14.0.2" got "13.0.0" - inquirer "9.2.19" + inquirer "9.3.2" is-ci "3.0.1" - issue-parser "7.0.0" + issue-parser "7.0.1" lodash "4.17.21" mime-types "2.1.35" new-github-release-url "2.0.0" @@ -6554,9 +6574,8 @@ release-it@^17.2.1: open "10.1.0" ora "8.0.1" os-name "5.1.0" - promise.allsettled "1.0.7" proxy-agent "6.4.0" - semver "7.6.0" + semver "7.6.2" shelljs "0.8.5" update-notifier "7.0.0" url-join "5.0.0" @@ -6652,6 +6671,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -6747,14 +6771,7 @@ semver-diff@^4.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@7.x, semver@^7.0.0, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: +semver@7.6.2, semver@7.x, semver@^7.0.0, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== @@ -6881,6 +6898,22 @@ slash@^5.1.0: resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -6895,16 +6928,16 @@ socks-proxy-agent@^6.0.0: debug "^4.3.3" socks "^2.6.2" -socks-proxy-agent@^8.0.2: - version "8.0.3" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz#6b2da3d77364fde6292e810b496cb70440b9b89d" - integrity sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A== +socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" + integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== dependencies: agent-base "^7.1.1" debug "^4.3.4" - socks "^2.7.1" + socks "^2.8.3" -socks@^2.6.2, socks@^2.7.1: +socks@^2.6.2, socks@^2.8.3: version "2.8.3" resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== @@ -6954,9 +6987,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + version "3.0.18" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz#22aa922dcf2f2885a6494a261f2d8b75345d0326" + integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== split2@^4.0.0: version "4.2.0" @@ -6997,13 +7030,6 @@ stdin-discarder@^0.2.1: resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be" integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - strict-event-emitter-types@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz#05e15549cb4da1694478a53543e4e2f4abcf277f" @@ -7014,6 +7040,11 @@ strict-event-emitter@^0.5.1: resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== +string-argv@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -7041,9 +7072,9 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" string-width@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" - integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" get-east-asian-width "^1.0.0" @@ -7151,11 +7182,6 @@ sucrase@^3.20.3: pirates "^4.0.1" ts-interface-checker "^0.1.9" -superstruct@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.4.tgz#0adb99a7578bd2f1c526220da6571b2d485d91ca" - integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -7329,9 +7355,9 @@ tslib@2.4.0: integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== tslib@^2.0.1, tslib@^2.1.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== tsup@^6.7.0: version "6.7.0" @@ -7396,9 +7422,9 @@ type-fest@^3.8.0: integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-fest@^4.2.0, type-fest@^4.9.0: - version "4.18.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.18.2.tgz#8d765c42e7280a11f4d04fb77a00dacc417c8b05" - integrity sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg== + version "4.21.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.21.0.tgz#2eec399d9bda4ac686286314d07c6675fef3fdd8" + integrity sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA== typed-array-buffer@^1.0.2: version "1.0.2" @@ -7457,9 +7483,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typedoc-plugin-markdown@^4.0.0-next.50: - version "4.0.2" - resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.0.2.tgz#f8f03779cd65c783a01c367cb7cde773431207c5" - integrity sha512-4MV3M+0lsmIaXuDBzeqLYemZqwTQDWQow+o8zdT9hC7KFu06GaFo2uUEbkjE6pgZA9hnkOTtzRVd0R9YJWcH8A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.1.1.tgz#2e3efc9b009819866b0c6ebebe3aab04b28e135c" + integrity sha512-ZQv8FXn1TBZAvhWMgOL8hE472rwv1dzSr/KIIUGPmdNXybeS6jmK7d1OwKhorLuGbPDQGl6U97BwfkFTcydAkw== typedoc@^0.25.7: version "0.25.13" @@ -7472,23 +7498,23 @@ typedoc@^0.25.7: shiki "^0.14.7" typescript-eslint@^7.1.0: - version "7.9.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.9.0.tgz#353312f356ef4ba20105a4e2e736aa8c68f096a2" - integrity sha512-7iTn9c10teHHCys5Ud/yaJntXZrjt3h2mrx3feJGBOLgQkF3TB1X89Xs3aVQ/GgdXRAXpk2bPTdpRwHP4YkUow== + version "7.15.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.15.0.tgz#44caca31461cc8afa829c4e5ab11aa9e0f7e175d" + integrity sha512-Ta40FhMXBCwHura4X4fncaCVkVcnJ9jnOq5+Lp4lN8F4DzHZtOwZdRvVBiNUGznUDHPwdGnrnwxmUOU2fFQqFA== dependencies: - "@typescript-eslint/eslint-plugin" "7.9.0" - "@typescript-eslint/parser" "7.9.0" - "@typescript-eslint/utils" "7.9.0" + "@typescript-eslint/eslint-plugin" "7.15.0" + "@typescript-eslint/parser" "7.15.0" + "@typescript-eslint/utils" "7.15.0" -typescript@^5.3.3: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +typescript@~5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + version "3.18.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.18.0.tgz#73b576a7e8fda63d2831e293aeead73e0a270deb" + integrity sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A== uint8arrays@1.1.0, uint8arrays@^1.1.0: version "1.1.0" @@ -7563,7 +7589,7 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -update-browserslist-db@^1.0.13: +update-browserslist-db@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== @@ -7631,9 +7657,9 @@ uuid@^9.0.0, uuid@^9.0.1: integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -7830,6 +7856,15 @@ wrap-ansi@^8.1.0: string-width "^5.0.1" strip-ansi "^7.0.1" +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -7883,6 +7918,11 @@ yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@~2.4.2: + version "2.4.5" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" + integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== + yargs-parser@21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -7907,6 +7947,11 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + version "1.1.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== + +yoctocolors-cjs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.1.tgz#1a096cffaeda2eb725e33b19735681875465c920" + integrity sha512-c6T13b6qYcJZvck7QbEFXrFX/Mu2KOjvAGiKHmYMUg96jxNpfP6i+psGW72BOPxOIDUJrORG+Kyu7quMX9CQBQ==